首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docx4j加载docx给NullPointerException

Docx4j加载docx给NullPointerException
EN

Stack Overflow用户
提问于 2015-03-23 18:35:10
回答 3查看 3.8K关注 0票数 3

我想把docx转换成html。我开始编写与github中给出的示例相同的代码。这只是装货部分。问题就在这里。

代码语言:javascript
复制
import org.docx4j.Docx4J;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

public class Main {

    public static void main(String[] args) throws Docx4JException, 
        String inputfilepath = "myfilepathhere";


        OutputStream os = new FileOutputStream(inputfilepath + ".html");

        WordprocessingMLPackage wordMLPackage = Docx4J
                .load(new FileInputStream(inputfilepath));

    }
}

我要去接NullPointerException了。看到github中的异常跟踪并在源代码中导航,我怀疑它与这个类https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/jaxb/Context.java中与JAXB有关的事情有关。

Docx4j源代码可在https://github.com/plutext/docx4j上获得。

异常跟踪:

代码语言:javascript
复制
Exception in thread "main" org.docx4j.openpackaging.exceptions.Docx4JException: Couldn't get [Content_Types].xml from ZipFile
    at org.docx4j.openpackaging.io3.Load3.get(Load3.java:134)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:454)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:371)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:337)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:302)
    at org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(WordprocessingMLPackage.java:170)
    at org.docx4j.Docx4J.load(Docx4J.java:195)
    at Main.main(Main.java:29)
Caused by: org.docx4j.openpackaging.exceptions.InvalidFormatException: Bad [Content_Types].xml
    at org.docx4j.openpackaging.contenttype.ContentTypeManager.parseContentTypesFile(ContentTypeManager.java:713)
    at org.docx4j.openpackaging.io3.Load3.get(Load3.java:132)
    ... 7 more
Caused by: java.lang.NullPointerException
    at org.docx4j.openpackaging.contenttype.ContentTypeManager.parseContentTypesFile(ContentTypeManager.java:679)
    ... 8 more

docx文档很好(由Word 2010创建)。我甚至把它解压缩,看看Content_Types.xml是否在那里。它就在那里。

我使用Eclipse和Java 7,我在项目属性中将所有必需的jar文件添加到Java构建路径中。

请帮帮我。

更新:

实际上,当我将这一行从Context.java添加到我的类中时,看看这是否是问题所在。

代码语言:javascript
复制
     JAXBContext.newInstance("org.docx4j.openpackaging.contenttype");

我可以在我的控制台中看到以下异常:

代码语言:javascript
复制
    Exception in thread "main" javax.xml.bind.JAXBException: Provider org.eclipse.persistence.jaxb.JAXBContextFactory not found
 - with linked exception:
[java.lang.ClassNotFoundException: org.eclipse.persistence.jaxb.JAXBContextFactory]
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
    at javax.xml.bind.ContextFinder.find(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at Main.main(Main.java:26)
Caused by: java.lang.ClassNotFoundException: org.eclipse.persistence.jaxb.JAXBContextFactory
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    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)
    at javax.xml.bind.ContextFinder.safeLoadClass(Unknown Source)
    ... 6 more
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-25 09:07:23

docx4j支持几种不同的JAXB实现:

  • 参考实施
  • Java 6/7/8中包含的one Sun/Oracle
  • EclipseLink MOXy

如果您想使用MOXy,您需要:

  1. 相关的EclipseLink jars
  2. docx4j-MOXy-JAXBContext-3.0.0.jar (它只包含jaxb.properties文件)

jaxb.properties文件只是说:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

如果您使用的是maven,则只需添加:

代码语言:javascript
复制
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-MOXy-JAXBContext</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.1</version>
</dependency>

类路径上是否有docx4j-MOXy-JAXBContext jar?要么删除它,要么添加相关的EclipseLink jars

票数 2
EN

Stack Overflow用户

发布于 2015-03-23 20:03:03

这个对我有用,试试这个

代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.docx4j.Docx4J;
import org.docx4j.Docx4jProperties;
import org.docx4j.convert.out.HTMLSettings;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

public class Test {
    public static void main(String[] args) throws Docx4JException,
            FileNotFoundException {
        String inputfilepath = "c:/file.docx";


        WordprocessingMLPackage wordMLPackage = Docx4J
                .load(new FileInputStream(inputfilepath));

        // HTML exporter setup (required)
        //.. the HTMLSettings object
        HTMLSettings htmlSettings = Docx4J.createHTMLSettings();

        htmlSettings.setImageDirPath(inputfilepath + "_files");
        htmlSettings.setImageTargetUri(inputfilepath.substring(inputfilepath
                .lastIndexOf("/") + 1) + "_files");
        htmlSettings.setWmlPackage(wordMLPackage);

        OutputStream os = new FileOutputStream(inputfilepath + ".html");

        // If you want XHTML output
        Docx4jProperties.setProperty("docx4j.Convert.Out.HTML.OutputMethodXML", true);

        //Prefer the exporter, that uses a xsl transformation
        Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);

    }

}
票数 0
EN

Stack Overflow用户

发布于 2022-07-24 10:34:30

确保您拥有所有正确的依赖项(包括适当的JAXB运行时)

代码语言:javascript
复制
implementation 'org.docx4j:docx4j-core:11.4.7'
implementation 'org.docx4j:docx4j-MOXy-JAXBContext:6.0.0'
implementation 'org.docx4j:docx4j-export-fo:11.4.7'
implementation 'org.docx4j:docx4j-JAXB-Internal:8.3.8'
implementation 'org.docx4j:docx4j-JAXB-ReferenceImpl:11.4.7'
implementation 'org.docx4j:docx4j-JAXB-MOXy:11.4.7'
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.0'
implementation 'jakarta.activation:jakarta.activation-api:2.1.0'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29217821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档