首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docx4j - Docx到图像转换

Docx4j - Docx到图像转换
EN

Stack Overflow用户
提问于 2022-03-24 00:53:43
回答 2查看 545关注 0票数 0

我试图使用doc4x将docx转换为png文件,但遇到了一些错误。

分级条目,

代码语言:javascript
运行
复制
// https://mvnrepository.com/artifact/org.docx4j/docx4j
    implementation group: 'org.docx4j', name: 'docx4j', version: '6.1.2'

    // https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
    implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.4.0-b180830.0359'
    
    // https://mvnrepository.com/artifact/org.docx4j/docx4j-export-fo
    implementation group: 'org.docx4j', name: 'docx4j-export-fo', version: '11.4.5'
    
    // https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api
    implementation group: 'jakarta.xml.bind', name: 'jakarta.xml.bind-api', version: '4.0.0-RC3'

Java代码,

代码语言:javascript
运行
复制
public static void main(String args[]) throws Exception {
        String sourceFile = "/Users/test/test1.docx";
        String destFile = "/Users/test/test1.png";
        
        File theFile = new File(sourceFile);
        File outile=new File(destFile);
        WordprocessingMLPackage wordMLPckg = Docx4J.load(theFile);
        OutputStream os = new FileOutputStream(outile);
        FOSettings settings = Docx4J.createFOSettings();
        settings.setWmlPackage(wordMLPckg);
        settings.setApacheFopMime(MimeConstants.MIME_PNG);
        Docx4J.toFO(settings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
        os.close();
    }

错误,

代码语言:javascript
运行
复制
17:48:29.976 [main] ERROR org.docx4j.XmlUtils - java.lang.NoSuchMethodError: 'jakarta.xml.bind.JAXBElement org.docx4j.wml.ObjectFactory.createRT(org.docx4j.wml.Text)'
javax.xml.transform.TransformerException: java.lang.NoSuchMethodError: 'jakarta.xml.bind.JAXBElement org.docx4j.wml.ObjectFactory.createRT(org.docx4j.wml.Text)'
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:417) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:440) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:222) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:475) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:208) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.XPath.execute(XPath.java:337) [xalan-2.7.2.jar:2.7.2]
    at org.apache.xalan.templates.ElemCopyOf.execute(ElemCopyOf.java:134) [xalan-2.7.2.jar:?]
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2402) [xalan-2.7.2.jar:?]


Caused by: java.lang.NoSuchMethodError: 'jakarta.xml.bind.JAXBElement org.docx4j.wml.ObjectFactory.createRT(org.docx4j.wml.Text)'
    at org.docx4j.convert.out.fo.FOPAreaTreeHelper.createFillerP(FOPAreaTreeHelper.java:167) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.FOPAreaTreeHelper.trimContent(FOPAreaTreeHelper.java:100) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.LayoutMasterSetBuilder.fixExtents(LayoutMasterSetBuilder.java:136) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.LayoutMasterSetBuilder.getLayoutMasterSetFragment(LayoutMasterSetBuilder.java:97) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.XsltFOFunctions.getLayoutMasterSetFragment(XsltFOFunctions.java:85) ~[docx4j-export-fo-11.4.5.jar:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:343) ~[xalan-2.7.2.jar:?]
    ... 24 more
17:48:30.002 [main] ERROR org.docx4j.XmlUtils - java.lang.NoSuchFieldError: jc
javax.xml.transform.TransformerException: java.lang.NoSuchFieldError: jc
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:417) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:440) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:222) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:475) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:208) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.XPath.execute(XPath.java:337) [xalan-2.7.2.jar:2.7.2]

Caused by: java.lang.NoSuchFieldError: jc
    at org.docx4j.convert.out.fo.XsltFOFunctions.createBlock(XsltFOFunctions.java:324) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.XsltFOFunctions.createBlockForPPr(XsltFOFunctions.java:141) ~[docx4j-export-fo-11.4.5.jar:?]
    at jdk.internal.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:300) ~[xalan-2.7.2.jar:?]
    ... 32 more
Exception in thread "main" org.docx4j.openpackaging.exceptions.Docx4JException: Exception exporting package
    at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:106)
    at org.docx4j.Docx4J.toFO(Docx4J.java:734)
    at com.whskr.service.admin.report.spring.handler.Test.main(Test.java:71)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: You must invoke FORendererApacheFOP.getFOUserAgent
    at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:124)
    at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:168)
    at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:47)
    at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:81)
    ... 2 more
EN

回答 2

Stack Overflow用户

发布于 2022-03-24 06:30:28

我也犯了类似的错误。在我删除了docx4j依赖之后,就没问题了。

我有个例子。

pom.xml性质

代码语言:javascript
运行
复制
<docx4j-JAXB-Internal.version>8.3.4</docx4j-JAXB-Internal.version>
<docx4j-JAXB-ReferenceImpl.version>8.3.4</docx4j-JAXB-ReferenceImpl.version>
<docx4j-JAXB-MOXy.version>8.3.4</docx4j-JAXB-MOXy.version>
<docx4j-export-fo.version>8.3.4</docx4j-export-fo.version>

pom.xml依赖关系

代码语言:javascript
运行
复制
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-Internal</artifactId>
    <version>${docx4j-JAXB-Internal.version}</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
    <version>${docx4j-JAXB-ReferenceImpl.version}</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-MOXy</artifactId>
    <version>${docx4j-JAXB-MOXy.version}</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-export-fo</artifactId>
    <version>${docx4j-export-fo.version}</version>
</dependency>

docx到png

代码语言:javascript
运行
复制
public static void docx2Png(String docxPath, String pngPath) throws Exception {
    FileInputStream fis = new FileInputStream(docxPath);
    WordprocessingMLPackage wordPackage = WordprocessingMLPackage.load(fis);
    // font mapper
    wordPackage.setFontMapper(IFontHandler.getFontMapper());
    FOSettings foSettings = Docx4J.createFOSettings();
    foSettings.setApacheFopMime(MimeConstants.MIME_PNG);
    foSettings.setOpcPackage(wordPackage);

    FopFactoryBuilder fopFactoryBuilder = FORendererApacheFOP.getFopFactoryBuilder(foSettings);
    FORendererApacheFOP.getFOUserAgent(foSettings, fopFactoryBuilder.build());

    FileOutputStream fos = new FileOutputStream(pngPath);
    Docx4J.toFO(foSettings, fos, Docx4J.FLAG_EXPORT_PREFER_XSL);
    fos.flush();
    fos.close();
    fis.close();
}
票数 1
EN

Stack Overflow用户

发布于 2022-03-25 08:57:06

docx4j 11.4.5是第一个使用jakarta.xml.bind的版本(与前一个javax.xml.bind不同)。

因此,如果您使用的是docx4j-export版本11.4.5,不要添加jaxb-api v2.4;您需要jakarta.xml.bind:jakarta.xml.bind-api:jar:3.0.1。

不要添加docx4j v6.1.2!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71595802

复制
相关文章

相似问题

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