我正在使用 ApacheFOP 1.0 在 Tomcat 托管的 OSGI 包中生成 PDF 文档,当我在包外作为独立应用程序(在同一服务器上)运行我的代码时,它可以正常工作。但是在 tomcat 上运行的相同代码因 IllegalArgumentException 而失败,在线:transformer.transform(src, res);没有进一步的堆栈跟踪或信息输出,我得到损坏的 PDF 文件。
我进行了谷歌搜索,发现有人在小程序中使用 FOP 时收到了类似的错误消息,但通过包含 xalan.jar 解决了这个问题。我在 WAR 文件的类路径中肯定有 xalan.jar,我也尝试运行没有 xalan.jar 的独立应用程序,它仍然有效,所以我的代码实际上没有使用它。
我为 FOP 使用的 jar 文件做了一个“find/-name”,以查看 tomcat 中是否有其他可能存在冲突的文件,但没有找到。
有趣的是,如果我从我的源 xsl 文件中删除图像元素,那么一切都有效。我在 xsl 中定义图像:
<fo:external-graphic src="/images/im.png"/>
如果我注释掉这一行,它就可以在 tomcat 中运行。问题是我的 PDF 中需要图像。
代码如下(我还需要创建一个 PDFRenderer 用户代理来解决另一个问题,在那里我得到了错误:“Caused by: java.lang.UnsupportedOperationException: Don’t know how to handle “application/pdf” as an输出格式。对于这种输出格式,找不到 FOEventHandler 或渲染器。”)。非常感谢任何建议!
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent useragent = fopFactory.newFOUserAgent();
PDFRenderer pdfrenderer = new PDFRenderer();
pdfrenderer.setUserAgent(useragent);
useragent.setRendererOverride(pdfrenderer);
fopFactory.addElementMapping(new FOElementMapping());
fopFactory.addElementMapping(new SVGElementMapping());
fopFactory.addElementMapping(new BatikExtensionElementMapping());
fopFactory.addElementMapping(new ExtensionElementMapping());
fopFactory.addElementMapping(new XMPElementMapping());
fopFactory.addElementMapping(new RDFElementMapping());
fopFactory.addElementMapping(new PSExtensionElementMapping());
fopFactory.addElementMapping(new AFPElementMapping());
fopFactory.addElementMapping(new PSExtensionElementMapping());
fopFactory.addElementMapping(new InternalElementMapping());
fopFactory.addElementMapping(new OldExtensionElementMapping());
fopFactory.addElementMapping(new PCLElementMapping());
try {
// Step 3: Construct fop with desired output format
Fop fop = null;
try {
fop = fopFactory.newFop(MimeConstants.MIME_PDF, useragent, outfile);
//fop = fopFactory.newFop(MimeConstants.MIME_PDF, outfile);
} catch (FOPException e) {
logger.log(Level.SEVERE, "Failed to create FOP object: " + e.getLocalizedMessage());
e.printStackTrace();
return null;
}
Source src = new StreamSource(new File(interimFile));
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = null;
try {
res = new SAXResult(fop.getDefaultHandler());
} catch (FOPException e) {
logger.log(Level.SEVERE, "Failed to setup pdf result file: " + e.getLocalizedMessage());
e.printStackTrace();
return null;
}
// Step 6: Start XSLT transformation and FOP processing
try {
transformer.transform(src, res);
} catch (Exception e) {
logger.log(Level.SEVERE, "Failed to transform xsl to PDF " + e.getLocalizedMessage());
e.printStackTrace();
return null;
}
最佳答案
您的包类路径中至少需要以下 jar(我使用 FOP 1.0):
- commons-io
- xml-apis-ext
- 对付
- xmlgraphics-common
- 阿瓦隆框架
- 全蜡染
图像处理特别需要下面的 3 个。
jar 在 lib 下面的 FOP 分发中。
关于tomcat - ApacheFOP Tomcat/OSGI 错误 : java. lang.IllegalArgumentException:未知函数:gatherContextInfo - 使用图像创建 PDF 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27066409/