要将我的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之前每次调用都会创建对象
我错过了什么吗?感谢所有人的帮助
答案 0 :(得分:3)
起初我对iText 7的理解是,您有一个@Override
public void onStop() {
super.onStop();
if (mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
}
和一个FontProgram
。
PdfFont
是一个包含iText使用字体程序所需的所有信息的类。它可以在创建许多不同PDF文件的过程中重复使用。FontProgram
是一个在单个文档的上下文中使用PdfFont
的类。每个FontProgram
对象只属于一个PdfFont
。如果您尝试使用PdfDocument
对象创建另一个文档,则会收到错误“Pdf间接对象属于其他PDF文档。将对象复制到当前的pdf文档。” < / p>
换句话说:您不能只重用PdfFont
个对象,只能重用PdfFont
个对象。重用FontProgram
(或ConverterProperties
)时,这可能是一个问题。诀窍不是在FontProvider
中缓存PdfFont
个对象,而是缓存FontProvider
。
由于这非常令人困惑,我已经要求iText 7开发团队解决这个问题。当我查看已关闭的票务系统时,我可以看到文档将被修复,并且将在FontProgram
方面完成工作。这意味着您将在下一个版本中看到改进。
与此同时,我通过更改ConverterProperties
和FontProvider
的使用方式为自己解决了这个问题。必须为每个新文档创建ConverterProperties
的新实例,并且我理解为什么:PdfFont
跟踪特定文档中使用的字符,并使用该信息创建字体子集。每个文件的子集都不同;因此,每个文档都需要一个不同的PdfFont
实例。
我将在关于此主题的门票中添加对此问题的引用。