【问题标题】:Can we change iText default font (Helvetica)?我们可以更改 iText 默认字体(Helvetica)吗?
【发布时间】:2018-03-21 16:25:28
【问题描述】:

我正在使用 iText 将 HTML 转换为符合 PDF/A 标准的 PDF 文件。 PDF/A 需要嵌入字体。

当 iText 解析 HTML 时,它通过在每个列表项之前添加一个列表符号来处理 HTML 列表。符号块没有定义其字体,因此默认情况下将被赋予 Helvetica(在Font::getCalculatedBaseFont 中)。

这是一个大问题,因为字体必须嵌入Helvetica。在这种情况下,PdfDocument 似乎强制使用 Helvetica。

有没有办法解决这个问题?
我找到了this one,但是需要修改源代码。

【问题讨论】:

    标签: fonts itext


    【解决方案1】:

    经过一些研究,至少对于列表而言,似乎可以解决此限制。

    应该扩展 ListStyleTypeCssApplier 类,这是一种可能的方式:

     public class CustomListStyleTypeCssApplier extends ListStyleTypeCssApplier {
    
        FontProvider fontProvider;
        BaseFont baseFont;
    
        public CustomListStyleTypeCssApplier(FontProvider fontProvider, BaseFont baseFont) {
            super();
            this.fontProvider = fontProvider;
            this.baseFont = baseFont;
        }
    
        @Override
        public List apply(final List list, final Tag t, final MarginMemory memory, final PageSizeContainable psc,
                final HtmlPipelineContext context) {
            List listStyled = super.apply(list, t, memory, psc, context);
            Chunk listSymbol = listStyled.getSymbol();
            float size = listSymbol.getFont().getSize();
            int style = listSymbol.getFont().getStyle();
            BaseColor color = listSymbol.getFont().getColor();
            Font font = new Font(baseFont, size, style, color);
            listStyled.getSymbol().setFont(font);
            return listStyled;
        }
    }
    

    修改后,此 CssApplier 将向列表符号应用另一种字体。我没有看到如何取回列表项的字体...

    然后,可以很容易地集成它。

    CssAppliersImpl cssAppliers = new CssAppliersImpl(fontProvider);
    BaseFont baseFont = BaseFont.createFont("./fonts/arial.ttf", "utf-8", true);
    cssAppliers.putCssApplier(List.class, new CustomListStyleTypeCssApplier(fontProvider, baseFont));
    

    只要我们不关心符号的字体,我们就可以接受这种解决方法...

    【讨论】:

    • public List apply(final List list, final Tag t, final MarginMemory memory, final PageSizeContainable psc, final HtmlPipelineContext context)这个方法的签名好像无效
    猜你喜欢
    • 2011-06-23
    • 2019-07-18
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多