要将我的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所不了解的是,您有一个FontProgramPdfFont


FontProgram是一个类,其中包含iText使用字体程序所需的所有信息。可以在创建许多不同PDF文件的过程中重复使用它。
PdfFont是在单个文档的上下文中使用FontProgram的类。每个PdfFont对象恰好属于一个PdfDocument


如果尝试使用PdfFont对象创建另一个文档,则会出现错误“ Pdf间接对象属于其他PDF文档。将对象复制到当前pdf文档。”

换句话说:您不能仅重用PdfFont对象,而只能重用FontProgram对象。重用ConverterProperties(或FontProvider)时,这可能是一个问题。诀窍不是在PdfFont中缓存FontProvider对象,而是在FontProgram中缓存。

因为这非常令人困惑,所以我已要求iText 7开发团队解决此问题。当我查看封闭式票务系统时,可以看到文档已修复,并且将针对ConverterProperties进行努力。这意味着您将在下一版本中看到改进。

同时,我通过更改FontProviderConverterProperties的使用方式为自己解决了此问题。必须为每个新文档创建PdfFont的新实例,并且我了解原因:PdfFont跟踪特定文档中使用的字符,并使用该信息来创建字体子集。每个文档的子集都不相同;因此,每个文档都需要一个不同的PdfFont实例。

我将在有关该主题的故障单中添加对此问题的引用。

09-25 21:40