iText 7 HtmlConverter.convertToPdf 正在崩溃

问题描述

嗨,我正在尝试使用 Maven 存储库中提供的 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

谢谢

解决方法

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

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

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

,

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