我正在使用ApacheFOP 1.0在Tomcat托管的OSGI包中生成PDF文档,当我在捆绑包外部运行我的代码作为独立的应用程序(在同一台服务器上)时,它的工作原理。但是在tomcat上运行的相同代码在IllegalArgumentException上失败,在行:transformer.transform(src,res);不会输出更多的堆栈跟踪或信息,并且我的PDF文件已损坏。
我进行了谷歌搜索,发现在applet中使用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 useragent来解决另一个问题,我得到了错误:“引起:java.lang.UnsupportedOperationException:不知道如何处理”application / pdf“作为输出格式。无法为此输出格式找到FOEventHandler和Renderer。“)。任何建议都非常感谢!
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;
}
答案 0 :(得分:1)
您至少需要捆绑类路径中的以下jar(我使用FOP 1.0):
图像处理特别需要较低的3。
罐子在lib下方的FOP分配中。
答案 1 :(得分:0)
FOP如何渲染png文件图像?也许它需要你的包不可见的类。使用-verbose:class
作为独立应用程序运行,并记下它加载的类。然后,您可以查看捆绑包是否显示任何内容。例如,它可能需要一些来自JRE的javax。*类,你的bundle需要导入它们。