java - iText 7 Html2Pdf 多次使用相同字体

标签 java itext7

我使用 iText 7 和 Html2Pdf 将表格单元格内的 Html 元素转换为 PDF。
对于每个包含 Html 字符串的单元格,我使用以下代码:

ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setOutlineHandler(new OutlineHandler());
converterProperties.setFontProvider(document.getFontProvider());

List<IElement> convertToElements = HtmlConverter.convertToElements(cellValue, converterProperties);
Paragraph p = (Paragraph)convertToElements.get(0);
cell.add(p);

该文件还包含其他数据,但只有此代码添加了字体的重复项。 (链接到示例 here )。 在上面的示例中,我添加了 1 <b>标记到特定单元格。 Document对象默认使用常规 DejaVu 字体,粗体位于 FontProvider 内。 .

编辑:
这就是我为文档设置字体的方法: 常规字体-

pdfFont = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);
document.setFont(pdfFont);

粗体字体 - (代码来自 getBoldFont 方法)

FontProvider fontProvider = document.getFontProvider();

PdfFont createFont = null;
if (fontProvider == null) {
   fontProvider = new FontProvider();
   document.setFontProvider(fontProvider);
}
Collection<FontInfo> collection = fontProvider.getFontSet().get(boldFontName);
if (collection.isEmpty()) {
    createFont = PdfFontFactory.createFont(boldFontPath, PdfEncodings.IDENTITY_H, true);
    fontProvider.addFont(createFont.getFontProgram());

    // I need to call this part again because iText creates the font again
    // and in this way I eliminate another duplication of the font.
    collection = fontProvider.getFontSet().get(boldFontName);
    createFont = fontProvider.getPdfFont(collection.iterator().next());
    return createFont;
} else {
    return fontProvider.getPdfFont(collection.iterator().next());
}

至于如何“将结果元素添加到文档中”,我使用 document#addcanvas#showTextAligned .

我的问题是,如果我在需要将 Html 转换为 PDF 时继续使用相同的字体(我在需要时使用 getBoldFont),为什么我会多次获得粗体字体以及如何解决。

提前谢谢您。

最佳答案

在您的用例中,iText 确实创建了相同字体的多个实例,并且这些实例最终出现在您的结果文档中。这种冗余是其他用例安全性的副产品,例如当对 HtmlConverter.convertToElements 的调用结果添加到多个文档时。不过,解决这个问题很容易。

pdfHTML 将字体提供程序设置为其结果元素的属性之一。您可以直接设置字体提供程序,覆盖该属性值。因此缓存将不再被重置。您可以使用以下代码将字体提供程序设置为元素:

p.setProperty(Property.FONT_PROVIDER, fontProvider);

此外,在这种情况下,您不必将任何转换器属性传递给 HtmlConverter。只需使用该字体提供程序将其设置在结果元素上即可。以下是演示如何消除字体重复的最小代码片段:

FontProvider fontProvider = new FontProvider("Arial");
fontProvider.addFont("C:/Windows/Fonts/arial.ttf");
fontProvider.addFont("C:/Windows/Fonts/arialbd.ttf");

Document document = new Document(pdfDocument);
document.setFontProvider(fontProvider);

for (int i = 0; i < 10; i++) {
    List<IElement> convertToElements = HtmlConverter.convertToElements(html);
    Paragraph p = (Paragraph) convertToElements.get(0);
    p.setProperty(Property.FONT_PROVIDER, fontProvider);
    document.add(p);
}

关于java - iText 7 Html2Pdf 多次使用相同字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58908745/

相关文章:

c# - 如何使用 iText7 从 C# 中的 MemoryStream 创建 Image 对象?

java - 如何使用 itext7 Java 将多个图像添加到 PDF 中?

c# - 调用 PdfFontFactory.CreateFont 时出错,System.NotSupportedException : The invoked member is not supported in a dynamic assembly in c# WebApp

java - getSession 关闭 Socket

java - 下载 JAVA JDK 6.0

java - Selenium findElements()/findElement(by class) 返回 null

java - 收到 FTP 响应 421。服务器关闭连接

itext7 - 如何在 iText 7 中设置和/或检索默认单元格填充

java - 使用 iText7 将多个表格打印到 pdf 上

java - 如何判断表中是否存在一行?