我将XSLstyle表和一些XML示例文件更改为PDF。我已经验证了XSL表是正确的(使用命令行版本Apache-FOP 2.3
生成的PDF是一致的,并且不会抛出任何错误)。当Eclipse > Run > Transform
与Xalan 2.7.1
一起使用时,结果与命令行版本的FO
输出相同。
但是我从那以后尝试在java中实现嵌入式版本并且它一直没有用。我检查了FO
结果,它似乎没有任何FO
个标记,结果文件只包含XML的文本值。这会产生fop.fo.ValidationException
。
我怀疑它与某些库的冲突版本有关,或者可能是属性文件中缺少的参数,但到目前为止我还没有找到错误。
修改 我不能共享XSL和XML文件,但这是我的java片段:
private void transformToPdf(Document docJDOM, OutputStream destination, File xslFile)
throws SAXException, IOException, JDOMException, TransformerException {
FopFactory fopFactory = FopFactory.newInstance(FOPCONFIGFILE);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, destination);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new
StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, result);
}
FOPCONFIGFILE是我的fop.xconf文件(我使用的是Apache-FOP网站提供的默认文件),docJDom是我希望转换的xml文件的JDomDocument,xslFile是我想申请的xslStylesheet。我检查了docJDom,xslFile的值,它们是正确的。
编辑2 我刚刚尝试使用嵌入代码输出fo结果文件 通过改变这个
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new
StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, result);
到这个
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslFile));
Source source = new DOMSource(transformJdomToDom(docJDOM));
Result result = new StreamResult(destination);
transformer.transform(source, result);
并检查结果错误。我能够找到多个行,例如<fo:table-row height="0.5cm"/>
,它们是错误的来源。
然而,我然后使用相同的XSL样式表转换了相同的XML文件,但使用Apache-FOP 2.3二进制分发,结果是正确的,并且不包含这些错误。
答案 0 :(得分:1)
我找到了错误:XSL样式表是正确的,问题是使用这些文件的模块将它们复制到不同的文件夹并使用这些副本进行pdf转换。通过单独运行单元测试,我的校正XSL表没有被复制,因此我使用的是旧的错误版本。