ApacheFOP Tomcat / OSGI错误:java.lang.IllegalArgumentException:未知函数:gatherContextInfo - 用图像创建PDF时

时间:2014-11-21 16:53:48

标签: tomcat osgi classpath apache-fop

我正在使用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;
        }

2 个答案:

答案 0 :(得分:1)

您至少需要捆绑类路径中的以下jar(我使用FOP 1.0):

  • commons-io
  • xml-apis-ext
  • fop
  • xmlgraphics-common
  • Avalon的框架
  • 蜡染所有

图像处理特别需要较低的3。

罐子在lib下方的FOP分配中。

答案 1 :(得分:0)

FOP如何渲染png文件图像?也许它需要你的包不可见的类。使用-verbose:class作为独立应用程序运行,并记下它加载的类。然后,您可以查看捆绑包是否显示任何内容。例如,它可能需要一些来自JRE的javax。*类,你的bundle需要导入它们。