在itext7中将html转换为pdf时出错

时间:2017-07-11 20:12:54

标签: java itext html2pdf itext7

要将我的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之前每次调用都会创建对象

我错过了什么吗?

感谢所有人的帮助

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。它与Itext7 generate pdf with Exception "Pdf indirect object belongs to other PDF document. Copy object to current pdf document."

有关(但不是重复)

起初我对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方面完成工作。这意味着您将在下一个版本中看到改进。

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

我将在关于此主题的门票中添加对此问题的引用。