在 eXist-db 中使用 FOP 处理 XSL-FO 文件以 "permission denied" 退出(仅在 Linux 上)
processing an XSL-FO file with FOP in eXist-db exits with "permission denied" (only on Linux)
我将首先说明这个问题所基于的上下文:我 运行ning eXist-4.7.1 在 Tomcat 容器中,并试图在使用 FOP 进行 PDF 转换的配置文件(eXist-4.7.1 附带 FOP 2.3 版)。
好消息:自从早些时候在 eXist-open 邮件列表 (https://markmail.org/message/so43jgratswpu4dz) 上报告字体配置以来,似乎已经取得了一些进展,我现在可以通过 http 加载字体:// 协议。这是一个自包含的 XQuery 示例(可以存储在数据库中并 运行 来自数据库):
xquery version "3.1";
import module namespace xslfo="http://exist-db.org/xquery/xslfo";
let $fo :=
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my_page" margin="0.5in">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my_page">
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="urbanist">Hello world!</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
let $fop.config :=
<fop version="1.0">
<use-cache>false</use-cache>
<renderers>
<renderer mime="application/pdf">
<fonts>
<font kerning="yes" embed-url="https://github.com/coreywho/Urbanist/raw/master/fonts/static/Urbanist-Black.ttf">
<font-triplet name="urbanist" style="normal" weight="normal"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
let $pdf := xslfo:render($fo, "application/pdf", (), ($fop.config))
return response:stream-binary($pdf, "application/pdf", "output.pdf")
更好的消息:这在我的 Windows 盒子上运行没有问题,它生成的 PDF 文档如下所示(使用正确的字体):
坏消息:当在我的 Linux 生产服务器上 运行 在完全相同的 Tomcat 设置中使用完全相同的 XQuery 示例时, xslfo:render() 调用退出并出现错误:
<exception>
<path>/db/apps/test-fop-fonts/test-fop-fonts.xq</path>
<message>exerr:ERROR .fop (Permission denied) [at line 40, column 13]</message>
</exception>
不幸的是,这是关于正在记录的所有内容。显然,Linux 框出了问题,但我不知道是什么原因。除了这个故障,eXist 在我的 Linux Tomcat 中运行完美,所以我非常有信心文件权限应该没问题。
有没有其他人遇到过这个“权限被拒绝”的错误?
最佳,
罗恩
显然,这是一个 lower-level OS 问题:当 Tomcat 以 root 用户身份启动时问题消失了,之后 eXist 可以愉快地创建 PDF 文件。
进一步挖掘后,似乎 FOP 将文件缓存在用户 运行 的主目录中,这对我的 non-privileged Tomcat 用户来说是缺少的... 并且可以通过为该用户创建一个 主目录 或在 Tomcat 启动脚本,例如-Duser.home=$CATALINA_TMPDIR
!
如果其他人遇到这个问题,我在这里找到了解决方案:https://forum.xwiki.org/t/pdf-export-issue-with-file-permissions/4933/11。 (呸!)
我将首先说明这个问题所基于的上下文:我 运行ning eXist-4.7.1 在 Tomcat 容器中,并试图在使用 FOP 进行 PDF 转换的配置文件(eXist-4.7.1 附带 FOP 2.3 版)。
好消息:自从早些时候在 eXist-open 邮件列表 (https://markmail.org/message/so43jgratswpu4dz) 上报告字体配置以来,似乎已经取得了一些进展,我现在可以通过 http 加载字体:// 协议。这是一个自包含的 XQuery 示例(可以存储在数据库中并 运行 来自数据库):
xquery version "3.1";
import module namespace xslfo="http://exist-db.org/xquery/xslfo";
let $fo :=
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my_page" margin="0.5in">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my_page">
<fo:flow flow-name="xsl-region-body">
<fo:block font-family="urbanist">Hello world!</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
let $fop.config :=
<fop version="1.0">
<use-cache>false</use-cache>
<renderers>
<renderer mime="application/pdf">
<fonts>
<font kerning="yes" embed-url="https://github.com/coreywho/Urbanist/raw/master/fonts/static/Urbanist-Black.ttf">
<font-triplet name="urbanist" style="normal" weight="normal"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
let $pdf := xslfo:render($fo, "application/pdf", (), ($fop.config))
return response:stream-binary($pdf, "application/pdf", "output.pdf")
更好的消息:这在我的 Windows 盒子上运行没有问题,它生成的 PDF 文档如下所示(使用正确的字体):
坏消息:当在我的 Linux 生产服务器上 运行 在完全相同的 Tomcat 设置中使用完全相同的 XQuery 示例时, xslfo:render() 调用退出并出现错误:
<exception>
<path>/db/apps/test-fop-fonts/test-fop-fonts.xq</path>
<message>exerr:ERROR .fop (Permission denied) [at line 40, column 13]</message>
</exception>
不幸的是,这是关于正在记录的所有内容。显然,Linux 框出了问题,但我不知道是什么原因。除了这个故障,eXist 在我的 Linux Tomcat 中运行完美,所以我非常有信心文件权限应该没问题。
有没有其他人遇到过这个“权限被拒绝”的错误?
最佳,
罗恩
显然,这是一个 lower-level OS 问题:当 Tomcat 以 root 用户身份启动时问题消失了,之后 eXist 可以愉快地创建 PDF 文件。
进一步挖掘后,似乎 FOP 将文件缓存在用户 运行 的主目录中,这对我的 non-privileged Tomcat 用户来说是缺少的... 并且可以通过为该用户创建一个 主目录 或在 Tomcat 启动脚本,例如-Duser.home=$CATALINA_TMPDIR
!
如果其他人遇到这个问题,我在这里找到了解决方案:https://forum.xwiki.org/t/pdf-export-issue-with-file-permissions/4933/11。 (呸!)