2014-01-23 43 views
1

我想使用docx4j 3.0加载现有的docx文件,进行一些简单的文本更改并另存为PDF格式。我的代码如下所示:docx4j 3.0 pdf导出失败,Docx4JException

 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load (new File (template)); 
     MainDocumentPart doc = wordMLPackage.getMainDocumentPart(); 

     try 
     { 
      VariablePrepare.prepare (wordMLPackage); 
     } 
     catch (Exception e) 
     { 
      System.err.println ("Warning: VariablePrepare failed: " + e); 
     } 

        (here I enumerate all Text nodes and make changes as required) 

     PdfConversion c = new Conversion (wordMLPackage); 
     try (FileOutputStream out = new FileOutputStream (outputFile)) { 
      c.output (out, new PdfSettings()); 
     } 

这是产生以下异常:

org.docx4j.openpackaging.exceptions.Docx4JException: Exception exporting package 
    at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:79) 
    at org.docx4j.Docx4J.toFO(Docx4J.java:467) 
    at org.docx4j.Docx4J.toPDF(Docx4J.java:477) 
    at org.docx4j.convert.out.pdf.viaXSLFO.Conversion.output(Conversion.java:70) 
    at net.meridiandigital.binco.invoicegen.InvoiceGenerator.generateFile(InvoiceGenerator.java:80) 
    at net.meridiandigital.binco.invoicegen.Test.main(Test.java:46) 
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Exception loading default template "org/docx4j/convert/out/fo/docx2fo.xslt", Cannot convert argument/return type in call to method 'org.docx4j.convert.out.common.XsltCommonFunctions.notImplemented(reference, node-type, string)' 
    at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:92) 
    at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getDefaultTemplate(AbstractXsltExporterDelegate.java:75) 
    at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.getTemplates(AbstractXsltExporterDelegate.java:66) 
    at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.process(AbstractXsltExporterDelegate.java:57) 
    at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:63) 
    at org.docx4j.convert.out.common.AbstractWmlExporter.process(AbstractWmlExporter.java:32) 
    at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:71) 
    ... 5 more 
Caused by: javax.xml.transform.TransformerConfigurationException: Cannot convert argument/return type in call to method 'org.docx4j.convert.out.common.XsltCommonFunctions.notImplemented(reference, node-type, string)' 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:945) 
    at org.docx4j.XmlUtils.getTransformerTemplate(XmlUtils.java:842) 
    at org.docx4j.convert.out.common.AbstractXsltExporterDelegate.loadDefaultTemplates(AbstractXsltExporterDelegate.java:88) 
    ... 11 more 

任何想法是怎么回事?

回答

2

它不应该被使用

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

而是

org.apache.xalan.processor.TransformerFactoryImpl

(你需要在你的classpath中真正的Xalan)

参见instantiateTransformerFactory()在第012行https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/XmlUtils.java

+0

谢谢。很不幸的是,您使用的日志记录系统决定不显示有用的消息,例如默认包含的消息(我的个人偏好是显示除非另行配置的所有消息的系统),并且由于我没有想出了如何配置日志记录,但我错过了它。 :( – Jules

+0

有趣的是,虽然我在我的类路径上有xalan-2.7.1.jar,但是它对'serializer-2.7.1.jar'有一个传递依赖关系,我不知何故错失了它 – Jules

+0

(和,是,我知道我*真的应该使用maven ...) – Jules