iText 7 Html2Pdf 多次使用相同的字体
iText 7 Html2Pdf use same font multiple times
我使用带有 Html2Pdf 的 iText 7 将 table 单元格内的 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);
该文件还包含其他数据,但只有这段代码添加了字体副本。 (Link 例如 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());
}
至于我如何"add resultant elements to the document",我使用document#add
和canvas#showTextAligned
。
我的问题是,如果我一直使用相同的字体(我在需要时使用 getBoldFont
),为什么我在需要将 Html 转换为 PDF 时多次获得粗体字体以及如何解决它。
提前致谢。
在您的用例中,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);
}
我使用带有 Html2Pdf 的 iText 7 将 table 单元格内的 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);
该文件还包含其他数据,但只有这段代码添加了字体副本。 (Link 例如 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());
}
至于我如何"add resultant elements to the document",我使用document#add
和canvas#showTextAligned
。
我的问题是,如果我一直使用相同的字体(我在需要时使用 getBoldFont
),为什么我在需要将 Html 转换为 PDF 时多次获得粗体字体以及如何解决它。
提前致谢。
在您的用例中,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);
}