要将我的html转换为pdf,我使用itext7的API convertToDocument,将模板的ByteArrayInputStream,PDFDocument和convertProperties传递给参数。
相关代码段:
HtmlConverter.convertToDocument(new ByteArrayInputStream(templateWritten), pdfDocument, converterProps);
如文档所述,如果我设置convertProperties的baseURI没问题,但是如果我设置PDF字体,则在有许多并发调用时会显示此错误:
“ Pdf间接对象属于其他PDF文档。将对象复制到当前pdf文档。”
创建转换属性
private ConverterProperties addResourcesForInitiative(String templateKey, FontProvider fontProvider) {
// CustomDefaultFontProvider cdfp = new CustomDefaultFontProvider();
ConverterProperties converterprops = new ConverterProperties();
// converterprops.setFontProvider(fontProvider);
converterprops.setBaseUri(ConfigurationManager.getParamValue("resource.path") + templateKey + "/resources/");
log.info("Properties for conversione are setted. Url of folder loaded " + converterprops.getBaseUri());
return converterprops;
}
在每次调用convertToDocument API之前都会创建对象
我错过了什么吗?
感谢你的帮助
最佳答案
我遇到了同样的问题。它与Itext7 generate pdf with Exception "Pdf indirect object belongs to other PDF document. Copy object to current pdf document."相关(但不是重复的)
一开始我对iText 7所不了解的是,您有一个FontProgram
和PdfFont
。FontProgram
是一个类,其中包含iText使用字体程序所需的所有信息。可以在创建许多不同PDF文件的过程中重复使用它。PdfFont
是在单个文档的上下文中使用FontProgram
的类。每个PdfFont
对象恰好属于一个PdfDocument
。
如果尝试使用PdfFont
对象创建另一个文档,则会出现错误“ Pdf间接对象属于其他PDF文档。将对象复制到当前pdf文档。”
换句话说:您不能仅重用PdfFont
对象,而只能重用FontProgram
对象。重用ConverterProperties
(或FontProvider
)时,这可能是一个问题。诀窍不是在PdfFont
中缓存FontProvider
对象,而是在FontProgram
中缓存。
因为这非常令人困惑,所以我已要求iText 7开发团队解决此问题。当我查看封闭式票务系统时,可以看到文档已修复,并且将针对ConverterProperties
进行努力。这意味着您将在下一版本中看到改进。
同时,我通过更改FontProvider
和ConverterProperties
的使用方式为自己解决了此问题。必须为每个新文档创建PdfFont
的新实例,并且我了解原因:PdfFont
跟踪特定文档中使用的字符,并使用该信息来创建字体子集。每个文档的子集都不相同;因此,每个文档都需要一个不同的PdfFont
实例。
我将在有关该主题的故障单中添加对此问题的引用。