问题描述
嗨,我正在尝试使用 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 中重新加载项目。