我们可以更改iText默认字体(Helvetica)吗?



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

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

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

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

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

应该扩展类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));

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

最新更新