首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iText 7 Html2Pdf多次使用同一字体

iText 7 Html2Pdf多次使用同一字体
EN

Stack Overflow用户
提问于 2019-11-18 06:00:46
回答 1查看 1.2K关注 0票数 0

我使用iText 7与Html2Pdf一起将表格单元格中的Html2Pdf转换为Html2Pdf。

对于每个包含Html字符串的单元格,我使用以下代码:

代码语言:javascript
运行
复制
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);

该文件还包含其他数据,但只有此代码添加了字体的副本。(链接到示例这里)。在上面的示例中,我向特定的单元格添加了一个<b>标记。Document对象具有常规的DejaVu字体,因为它是默认的,粗体在FontProvider中。

编辑:

我就是这样把字体设置成文档的:普通字体-

代码语言:javascript
运行
复制
pdfFont = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);
document.setFont(pdfFont);

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

代码语言:javascript
运行
复制
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

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

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 18:21:11

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

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

代码语言:javascript
运行
复制
p.setProperty(Property.FONT_PROVIDER, fontProvider);

此外,在本例中,您不必将任何转换器属性传递给HtmlConverter。只需使用该字体提供程序对结果元素进行设置即可。下面是演示如何消除字体复制的最小代码片段:

代码语言:javascript
运行
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58908745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档