eXist-db 中的商用 FO 处理器

Commercial FO processors in eXist-db

对于我的项目,我想测试XEP 和AH Formatter。我喜欢 FOP,但在某些情况下它确实失败了(浮动、裁切标记、pdf/x 标准等),我需要知道一些替代方案。

XEP

我对 XEP 非常了解。我已将所有 jar 复制到 $EXIST_HOME/lib/user 并更改了 $EXIST_HOME/conf.xml 中的适配器。此外,我已将 xep.xml 配置文件上传到数据库中。

正在测试 XQuery:

xquery version "3.0";

declare namespace fo = "http://46.28.111.241:8081/exist/db/apps/bunny/modules/fop";

let $config := doc('/db/apps/bunny/test/xep.xml')
let $fo := doc('/db/apps/bunny/data/test.fo')
let $pdf := xslfo:render($fo, "application/pdf", (), $config)
return response:stream-binary($pdf, "application/pdf", "output.pdf")

它抛出:

exerr:ERROR org.exist.dom.persistent.NodeProxy cannot be cast to org.w3c.dom.Node [at line 7, column 13]

AH 格式化程序

有了AH Formatter,我现在迷路了。它不包括我可以复制到 $EXIST_HOME/lib/user 中的任何特定 jar 文件,或者至少看起来不是这样。在 AH 站点上,有一条关于在 linux 机器上使用 AH Formatter 的注释,但这条注释对将其包含到 eXist 的整个过程没有帮助。

安装包括几个文件夹,这些文件夹都在 run.sh 文件中提到,它是比 XEP 更碎片化的应用程序。

我正在 Ubuntu 服务器 14.04 和 eXist-db RC01 上进行测试。

eXist 目前仅支持 Apache FOP 或 RenderX XEP。

@wolfgang-meier 之前添加了对 Antenna House 格式化程序的支持(2012 年 8 月 22 日,git 提交:ffda3b7), but he then again removed it on 12 Sept 2012 (git commit: 5a2a0aa),并评论说它将被移动到一个单独的项目中......我实际上找不到单独的项目。

如果您想使用 Antenna House,我建议您联系 Wolfgang 或从相关的 Git 提交中获取代码。

关于您在使用 RenderX XEP 时遇到的错误,当您收到错误 exerr:ERROR org.exist.dom.persistent.NodeProxy cannot be cast to org.w3c.dom.Node 时,您的 $EXIST_HOME/webapp/WEB-INF/logs/exist.log 中还应该有一个关联的堆栈跟踪,请问 post 相关的那个节也?

虽然这是一个老问题,但我想我会 post 在这里提供一个替代答案,以防在搜索中出现。

作为替代方案,您可以安装 RenderX 的 EnMasse(或 Windows 上的 WinMasse),它为格式化程序提供 SOAP 接口。注意,这可以是任何机器上的 运行,甚至根本不需要在 eXist 服务器上。 EnMasse 提供了一个 SOAP 端口来提交您的 FO 并取回 PDF(或替代格式)。然后就像构建 SOAP 消息并将其发送到 EnMasse 服务器一样简单。

xquery version "3.0";
declare namespace fo = "http://www.w3.org/1999/XSL/Format";

(: web address for the EnMasse server :)
let $xepsoap := 'http://www.yourserver.com:6577/fairy'
(: The base for any relative references (if any) -- cannot be empty and does not need to exist at all on the formatting server, just a path to resolve relative references :)
let $in0 := 'c:/foo.xml'
(: The base64 encoded XSL FO :)
let $in1 := util:base64-encode(serialize(doc('/db/EIDO/data/edit/_scratch/sample.fo')/fo:root))

let $soapMessage := <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:fairy="http://www.yourserver.com:6577/fairy"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
        <fairy:format SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
            <in0>{$in0}</in0> 
            <in1>{$in1}</in1> 
        </fairy:format> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>

let $xepout := httpclient:post(xs:anyURI($xepsoap),$soapMessage,false(),<headers/>)
return $xepout//formatReturn/string()

在此示例代码中,它 returns base64 编码了 PDF,但您明白了,您可以使用 response-stream-binary() 来取回 PDF。

这可以用于非常高性能的环境,因为 EnMasse 可以扩展以在多个 JVM、内核甚至不同机器中使用许多 RenderX XEP 线程。