在 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。 (呸!)