我试图使用doc4x将docx转换为png文件,但遇到了一些错误。
分级条目,
// 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代码,
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();
}
错误,
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
发布于 2022-03-24 06:30:28
我也犯了类似的错误。在我删除了docx4j
依赖之后,就没问题了。
我有个例子。
pom.xml性质
<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依赖关系
<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
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();
}
发布于 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!
https://stackoverflow.com/questions/71595802
复制相似问题