【问题标题】:Apache POI exceptionApache POI 异常
【发布时间】:2019-02-19 16:53:56
【问题描述】:

我需要将 docx 转换为 PDF,并且我将使用 Apache POI。这是我的 POM:

<dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.0.0</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
        <version>1.0.6</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.0.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.0.0</version>
    </dependency>


  </dependencies>

由于某种原因,我在转换运行期间遇到异常:

线程“主”java.lang.NoClassDefFoundError 中的异常: org/apache/poi/POIXMLDocumentPart 在 org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument.getFontsDocument(XWPFStylesDocument.java:1477) 在 org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument.(XWPFStylesDocument.java:190) 在 org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument.(XWPFStylesDocument.java:184) 在 org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.createStylesDocument(XWPFDocumentVisitor.java:166) 在 org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.(XWPFDocumentVisitor.java:159) 在 org.apache.poi.xwpf.converter.pdf.internal.PdfMapper.(PdfMapper.java:149) 在 org.apache.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:55) 在 org.apache.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:38) 在 org.apache.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:45) 在 temp.main.Teste(main.java:30) 在 temp.main.main(main.java:18) 引起:java.lang.ClassNotFoundException: org.apache.poi.POIXMLDocumentPart 在 java.net.URLClassLoader.findClass(未知来源)在 java.lang.ClassLoader.loadClass(Unknown Source) 在 sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 11 更多

我用谷歌搜索试图找到我缺少的依赖项,至少我认为是这样,但我找不到有关能够解决我的问题的 POIXMLDocumentPart 的信息。

这是我用来转换 docx 的方法:

public static void Teste(File file, String destino) {

        try {
            InputStream doc = new FileInputStream(file);
            XWPFDocument document = new XWPFDocument(doc);
            PdfOptions options = PdfOptions.create();
            OutputStream out = new FileOutputStream(new File(destino));
            PdfConverter.getInstance().convert(document, out, options);
            new File(destino);
        } catch(Exception e) {

        }
    }

【问题讨论】:

  • 对于正在为 POI 4.0.x 寻找工作 pom.xml 的任何人,这里是:&lt;dependency&gt; &lt;groupId&gt;fr.opensagres.xdocreport&lt;/groupId&gt; &lt;artifactId&gt;fr.opensagres.poi.xwpf.converter.pdf&lt;/artifactId&gt; &lt;version&gt;2.0.2&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &lt;artifactId&gt;poi&lt;/artifactId&gt; &lt;version&gt;4.0.1&lt;/version&gt; &lt;/dependency&gt; &lt;!-- and other poi deps --&gt;

标签: java apache pdf apache-poi


【解决方案1】:

XDocReport 是针对 POI 3.17 编译的。 POI 4.0.0 有一些变化,XDocReport 不适用于 POI 4.0.0。 POIXMLDocumentPart 移至包 org.apache.poi.ooxml。

https://github.com/opensagres/xdocreport/pull/324

更新(2019 年 3 月):看起来 XDocReport 2.0.2 已更新为使用 POI 4.0.1。

【讨论】:

  • 即使使用apache poi 3.17 也不能与org.apache.poi.xwpf.converter.pdf 一起使用。这是使用apache poi3.9。请参阅 stackoverflow.com/questions/51330192/…stackoverflow.com/questions/51440312/…fr.opensagres.poi.xwpf.converter.pdf 必须用于 apache poi 3.17
  • @AxelRichter 你是对的,我还必须更改 thw xwpf.converter 库,之后,它起作用了。遗憾的是,PDF 输出损坏,页数不正确,图像定位不正确,页脚上也没有链接。回来寻找更合适的解决方案。谢谢大家。
  • 在我的例子中,它适用于 POI 3.17 依赖项和 fr.opensagres.xdocreport 2.0.1
【解决方案2】:
compile group: 'fr.opensagres.xdocreport', name: 'fr.opensagres.poi.xwpf.converter.pdf', version: '2.0.2'
compile group: 'org.apache.poi', name: 'poi-ooxml-schemas', version: '4.1.2'

这两个依赖足以执行上面的例子。

【讨论】:

    【解决方案3】:

    我遇到过类似的问题,但我有“两步”脚本。
    1.从docx模板文档创建docx(用值替换占位符)
    2. 从创建的 docx 生成 PDF
    我面临的问题是两种方法都使用的一些库之间的冲突。当我升级 poi-ooxml 库版本-> PDF 生成器抛出no class found java.lang.NoClassDefFoundError: org/apache/poi/POIXMLDocumentPart 并且如果版本较旧,则 docx 生成器失败。
    对我来说,正确配合的黄金比例是:

    'org.apache.poi',名称:'poi-ooxml',版本:'3.10.1'
    'fr.opensagres.xdocreport',名称:'fr.opensagres.xdocreport.converter.docx.xwpf',版本:'1.0.5'
    'fr.opensagres.xdocreport',名称:'fr.opensagres.xdocreport.core',版本:'1.0.6'
    'fr.opensagres.xdocreport',名称:'org.apache.poi.xwpf.converter.xhtml',版本:'1.0.6'


    希望对某人有所帮助。我花了几个小时解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 2017-03-17
      • 1970-01-01
      • 2014-04-04
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多