eXist-db 中 XSL-FO 中的图像

Images in XSL-FO in eXist-db

在我之前的问题中,我触及了更广泛的路径问题及其在 eXist-db 应用程序中的识别。

目前,我无法将图像导入 PDF 文件。我已经尝试了 2 个 eXist 安装(2.2 和 3RC)和许多可能的场景。当然,我已经测试过那些图片可以通过浏览器访问。

在源文件中,我试过:

1. <graphic url="img/tealover.jpg"/>
2. <graphic url="/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg"/>
3. <graphic url="http://46.28.111.241:8081/exist/rest/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg"/>

4. <graphic url="url(img/tealover.jpg)"/>
5. <graphic url="url(/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg)"/>
6. <graphic url="url(http://46.28.111.241:8081/exist/rest/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg)"/>

7. <graphic url="url('img/tealover.jpg')"/>
8. <graphic url="url('/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg')"/>
9. <graphic url="url('http://46.28.111.241:8081/exist/rest/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg')"/>

正如预期的那样,示例 3、6 和 9 工作 但是 只有当我在源代码中以硬编码链接的形式拥有它们时。如果我在我的 XSLT 样式表中建立链接,它们在 FO 文件中完全相同,但在生成的 PDF 中没有任何内容。

FO 文件中产生的等价物:

1. <fo:external-graphic src="img/tealover.jpg"/>
2. <fo:external-graphic src="/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg"/>
3. <fo:external-graphic src="http://46.28.111.241:8081/exist/rest/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg"/>

4. <fo:external-graphic src="url(img/tealover.jpg)"/>
5. <fo:external-graphic src="url(/db/apps/karolinum-apps/data/2015080/img/tealover.jpg)"/>
6. <fo:external-graphic src="url(http://46.28.111.241:8081/exist/rest/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg)"/>

7. <fo:external-graphic src="url('img/tealover.jpg')"/>
8. <fo:external-graphic src="url('/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg')"/>
9. <fo:external-graphic src="url('http://46.28.111.241:8081/exist/rest/db/apps/karolinum-apps/data/mono/2015080/img/tealover.jpg')"/>

当我将这些链接硬编码到源代码中时,样式表有效 src="{@url}"。当我到处使用 url 的简短版本时 (url="img/tealover.jpg"),在属性样式表中我使用

<xsl:value-of select="concat('http://46.28.111.241:8081/exist/rest', $imgPath, @url)"/>

或直接在模板中

src="concat('http://46.28.111.241:8081/exist/rest', $imgPath, @url)"

$imgPath 变量作为参数从应用程序传递:

let $bookUri := base-uri($resource)
let $imgPath := replace($bookUri, '[^/]*?$', '')

有了这个,链接 1、4 和 7 应该可以工作,剩下的就是一团糟。我可以在 eXide 中复制这些链接,它们在浏览器中仍然有效。

当我测试时,一切看起来都很好。在PDF中,仍然没有图片。我想我现在肯定漏掉了一个小细节。

得到解决方案。没想到,最好的办法是让url保持原样,专注于根路径的解析。有了这个,FOP 处理器就能够解析相对路径,一切都按预期工作。在我的例子中,我为 xslfo:render() 函数提供动态配置文件。最重要的部分是:

<hyphenation-base>{replace(request:get-url(), '/apps(.*?)$', '/rest')}/db/apps/karolinum-apps/modules/resources/hyph/</hyphenation-base>
<hyphenation-pattern lang="cs" country="CZ">cs</hyphenation-pattern>
<base>{replace(request:get-url(), '/apps(.*?)$', '/rest') || replace(base-uri($doc), '[^/]*?$', '')}</base>
<font-base>{replace(request:get-url(), '/apps(.*?)$', '/rest')}/db/apps/karolinum-apps/modules/resources/fonts/</font-base>

现在我可以将所有内容存储在项目中并在我的源文件中使用相对路径。希望这个解决方案能够在下一次测试中幸存下来!如果你知道更优雅的方法如何做到这一点,请告诉我(好的,首先我可以将那些笨拙的路径操作放入变量中)。