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

Fonts 我们可以更改iText默认字体(Helvetica)吗?,fonts,itext,Fonts,Itext,我正在使用iText将HTML转换为PDF/a兼容的PDF文件。PDF/A要求嵌入字体 当iText解析HTML时,它通过在每个列表项之前添加列表符号来处理HTML列表。符号块不定义其字体,因此默认情况下将被赋予Helvetica(在font::getCalculatedBaseFont中) 这是一个巨大的问题,因为字体必须嵌入Helvetica。PDF文件似乎强制使用Helvetica 有办法解决这个问题吗? 我发现了,但它需要修改源代码。经过一些研究,似乎可以绕过这个限制,至少对于列表是这样

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

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

这是一个巨大的问题,因为字体必须嵌入Helvetica。PDF文件似乎强制使用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));
只要我们不在乎符号的字体,我们就可以接受这种解决方法……

公共列表应用(最终列表列表、最终标记t、最终边缘内存、最终页面大小可访问psc、最终HtmlPipelineContext上下文)
此方法的签名似乎无效