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 线程。
对于我的项目,我想测试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 线程。