【问题标题】:iText 7 HtmlConverter.convertToPdf is breakingiText 7 HtmlConverter.convertToPdf 正在破坏
【发布时间】:2021-05-27 19:34:41
【问题描述】:

您好,我正在尝试使用 maven repo 中提供的 itext 7(最新版本 7.1.15)将 HTML 字符串转换为 pdf。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;

public class PdfHtmlResponsiveDesign 

{
    public static void main(String[] args) throws IOException
    {

        String htmlSource = "<h1>aaa</h1>";
        File pdfDest = new File("C:\\Users\\acme\\Desktop\\tester\\itext7.pdf");
        // pdfHTML specific code
        ConverterProperties converterProperties = new ConverterProperties();
        converterProperties.setBaseUri("");
        HtmlConverter.convertToPdf(htmlSource,
                                   new FileOutputStream(pdfDest), converterProperties);
    }
}

但是这个简单的代码会引发错误。这适用于 itext 5.x。 任何找到问题的指针都会非常有帮助。

Exception in thread "main" java.lang.NoClassDefFoundError: com/itextpdf/kernel/counter/event/IMetaInfo
    at com.pegado.qpguard.demo.PdfHtmlResponsiveDesign.main(PdfHtmlResponsiveDesign.java:19)
Caused by: java.lang.ClassNotFoundException: com.itextpdf.kernel.counter.event.IMetaInfo
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

注意:

Itext 7 版本 7.1.15

html2pdf 版本 3.0.4

其他信息

如果我将 itext 的版本更改为 7.1.14,同样的代码会给我另一个错误

Exception in thread "main" java.lang.NoClassDefFoundError: com/itextpdf/layout/renderer/FlexContainerRenderer
    at com.itextpdf.html2pdf.attach.util.WaitingInlineElementsHelper.flushHangingLeaves(WaitingInlineElementsHelper.java:196)
    at com.itextpdf.html2pdf.attach.impl.tags.DivTagWorker.processEnd(DivTagWorker.java:97)
    at com.itextpdf.html2pdf.attach.impl.tags.HTagWorker.processEnd(HTagWorker.java:67)
    at com.itextpdf.html2pdf.attach.impl.DefaultHtmlProcessor.visit(DefaultHtmlProcessor.java:345)
    at com.itextpdf.html2pdf.attach.impl.DefaultHtmlProcessor.visit(DefaultHtmlProcessor.java:338)
    at com.itextpdf.html2pdf.attach.impl.DefaultHtmlProcessor.visit(DefaultHtmlProcessor.java:338)
    at com.itextpdf.html2pdf.attach.impl.DefaultHtmlProcessor.processDocument(DefaultHtmlProcessor.java:253)
    at com.itextpdf.html2pdf.attach.Attacher.attach(Attacher.java:78)
    at com.itextpdf.html2pdf.HtmlConverter.convertToDocument(HtmlConverter.java:325)
    at com.itextpdf.html2pdf.HtmlConverter.convertToPdf(HtmlConverter.java:139)
    at com.itextpdf.html2pdf.HtmlConverter.convertToPdf(HtmlConverter.java:127)
    at com.itextpdf.html2pdf.HtmlConverter.convertToPdf(HtmlConverter.java:104)
    at com.itextpdf.html2pdf.HtmlConverter.convertToPdf(HtmlConverter.java:92)
    at com.pegado.qpguard.demo.PdfHtmlResponsiveDesign.main(PdfHtmlResponsiveDesign.java:19)
Caused by: java.lang.ClassNotFoundException: com.itextpdf.layout.renderer.FlexContainerRenderer
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 14 more

谢谢

【问题讨论】:

  • 最后,我不得不用 PdfBox 来做这个

标签: java itext itext7


【解决方案1】:

如果 iText 5 用户只需要一个 jar 来完成所有功能,则相反,iText 7 会将不同的功能拆分为单独的模块。应该有:

  • 依赖html2pdf(单独的项目)来利用 html 到 pdf 的转换功能;
  • layout(iTextCore 项目的独立模块)的依赖可以将元素布局为 PDF;
  • 一些核心内容对kernel(iTextCore 项目的单独模块)的依赖(在您的情况下,IMetaInfo,在考虑是否加载任何许可证时在内部使用)。

所以 iTextcore 7.1.15 + pdfHTML 3.0.4 没有问题,您只需要再添加一个依赖项。至于 iTextcore 7.1.14 + pdfHTML 3.0.4:它们确实是不兼容的,更准确地说,在 pdfHTML 级别的 3.0.4 中已经支持 flex 元素,但在布局级别尚不支持。兼容性矩阵可以在这里找到:https://kb.itextpdf.com/home/it7kb/compatibility-matrix

【讨论】:

    【解决方案2】:

    这个问题肯定与 iText 本身无关。我无法使用 Itext 7.1.15 和 html2pdf 3.0.4 重现此问题。 java.lang.NoClassDefFoundError 异常通常在类路径出现问题时引发。见Why am I getting a NoClassDefFoundError in Java?。我可以建议清理您的 .m2 文件夹或尝试在 intellij 中重新加载项目。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 2021-07-05
      • 2021-08-07
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2016-07-02
      相关资源
      最近更新 更多