2016-10-10 99 views
1

我想使用其網站上提供的Docx4j社區包將Word文件轉換爲PDF。 (http://www.docx4java.org/docx4j/docx4j-community-3.3.1.zip使用Docx4j和FOP將docx轉換爲PDF時出錯

看起來他們在該軟件包中有docx4j和FOP之間的版本不兼容性,我想知道是否有人在之前遇到過這個問題,以及是否知道哪些版本的庫會使其工作。

這裏是我的代碼:

FOSettings foSettings = Docx4J.createFOSettings(); 
String inputfilepath = "path/to/file.docx"; 
String outputfilepath = "path/to/file.pdf"; 

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath)); 
FileOutputStream os = new java.io.FileOutputStream(outputfilepath); 

foSettings.setFoDumpFile(new java.io.File(inputfilepath + ".fo")); 
foSettings.setWmlPackage(wordMLPackage); 

Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); 

我複製下面的堆棧跟蹤,但錯誤抱怨FOPFactory沒有方法的newInstance()不帶參數。 這是從FORendererApacheFOP.java中調用的,我可以看到舊版本的FOP用於擁有該方法,我試圖替換軟件包上的版本,但是打破了其他依賴關係。

在封裝我有Docx4j 3.3.1和FOP 2.1

感謝您的幫助。

java.lang.NoSuchMethodException:在org.docx4j.convert.out org.apache.fop.apps.FopFactory.newInstance() 在java.lang.Class.getDeclaredMethod(Class.java:2130) .fo.renderers.FORendererApacheFOP.createFopFactory(FORendererApacheFOP.java:329) at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.getFopFactory(FORendererApacheFOP.java:253) at org.docx4j.convert.out.fo .renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:119) at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:168) at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess (AbstractFOExporter.java:47)org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:82) at org.docx4j.Docx4J.toFO(Docx4J.java:568) at org.docx4j.convert.out.fo。 FOPAreaTreeHelper.getAreaTreeViaFOP(FOPAreaTreeHelper.java:191) 在org.docx4j.convert.out.fo.LayoutMasterSetBuilder.fixExtents(LayoutMasterSetBuilder.java:138) 在org.docx4j.convert.out.fo.LayoutMasterSetBuilder.getLayoutMasterSetFragment(LayoutMasterSetBuilder。的java:97) 在org.docx4j.convert.out.fo.XsltFOFunctions.getLayoutMasterSetFragment(XsltFOFunctions.java:81) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl .java:62) at sun.reflect.DelegatingMethodAccessorImpl.i nvoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:497) 在org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:343) 在有機apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:440) at org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:222) at org.apache.xalan.transformer.TransformerImpl.extFunction( TransformerImpl.java:475) at org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:208) at org.apache.xpath.XPath.execute(XPath.java:337) at org.apache。 xalan.templates.ElemCopyOf.execute(ElemCopyOf.java:134) at org.apache.xa lan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2402) at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:1376) at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates。的java:395)在org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:178) 在org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2402) 在org.apache。 xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2272) at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1358) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl。 java:711) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1275) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1253) at org.docx4j。 XmlUtils.transform(XmlUtils.java:1275) at org.docx4j.XmlUt ils.transform(XmlUtils.java:1100) at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.process(AbstractXsltExporterDelegate.java:66) at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter。 (org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:79) at org.docx4j.Docx4J.toFO(Docx4J.java:568) 在PDFConversion.main(PDFConversion.java:26) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl .java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMetho dAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:497) 在com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) java.lang中.NoSuchMethodException:org.apache.fop.apps.FopFactory.newInstance() at java.lang.Class.getDeclaredMethod(Class.java:2130) at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.createFopFactory() FOREdererApacheFOP.java:329) at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.getFopFactory(FORendererApacheFOP.java:253) at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP。 java:119) at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:168) at org.docx4j.convert.out.fo.Ab stractFOExporter.postprocess(AbstractFOExporter.java:47) 在org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:82) 在org.docx4j.Docx4J.toFO(Docx4J.java:568) 在PDFConversion.main(PDFConversion.java:26) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl .java:43) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) org.docx4j。java.lang.reflect.Method.invoke(Method.java:497) 。 openpackaging.exceptions.Docx4JException:異常導出包 at或g.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:109) 在org.docx4j.Docx4J.toFO(Docx4J.java:568) 在PDFConversion.main(PDFConversion.java:26) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect中.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 引起:java.lang.NullPointerException at org.docx4j.convert。 out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:199) at org。docx4j.convert.out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:159) at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:168) at org.docx4j.convert。 out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:47) 在org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:82) ... 7更

回答

0

堆棧跟蹤你正在看到發生異常後發生(FOP無法初始化FOP V2.1,所以回落到FOP 1.0或1.1配置,這是行不通的,因爲你有FOP 2.1)

爲什麼不能FOP 2.1 init?我們需要看到的是診斷在https://github.com/plutext/docx4j-export-FO/blob/master/src/main/java/org/docx4j/convert/out/fo/renderers/FORendererApacheFOP.java#L320

【JAVA] }趕上(例外五){ log.warn( 「無法設置FOP SVN;」 + e.getMessage()); log.debug(e.getMessage(),e); [/ JAVA]

所以,請打開類DEBUG級別的日誌org.docx4j.convert.out.fo.renderers.FORendererApacheFOP

要做到這一點,請查看評論在https://github.com/plutext/docx4j/blob/master/src/samples/_resources/log4j.xml

這問題正在積極討論在http://www.docx4java.org/forums/pdf-output-f27/error-on-convert-pdf-with-fo-on-dox4j-3-3-1-t2446.html

但現在跟蹤它作爲https://github.com/plutext/docx4j-export-FO/issues/1

貴FOP 2.1來自Maven的,或介於埃爾斯è?

+0

您的classpath上的蠟染罐和jaxb-xslfo-1.0.1.jar?請嘗試http://www.docx4java.org/docx4j/docx4j-export-fo-nightly-20161012.jar並報告堆棧跟蹤 – JasonPlutext