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

标签 tomcat osgi classpath apache-fop

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

相关文章:

java - 如何在 LINUX 上设置环境变量 CLASSPATH 和 NoClassDefFoundError

java - JADE 平台的错误

java - 套接字异常 : TOO MANY OPEN FILES

java - Axis2在tomcat上运行时不断在temp文件夹中生成文件

java - 从嵌入式 OSGi 框架使用 Log4j2

java - 如何让 Barcode4J FOP 扩展在 OSGi 中工作(用于使用条形码生成 PDF)

python - 什么时候删除 Tomcat 8/temp 目录是安全的?

java - 用于 MS SQL Server 的 Eclipse 中 Tomcat 的连接池

java - 基于 REST/SOAP 的服务中用于域模型更改的 OSGi

java - 如何在 groovy 脚本中包含 jar?