跳转到内容

XQuery/XSL-FO SVG

来自维基教科书,开放世界中的开放书籍

您想将 XML 转换为 PDF 并将 SVG 图像嵌入到输出中。

eXist 从版本 2 开始支持将 svg 放置在 fop 渲染的 pdf 中,唯一的步骤是在构建源代码之前激活 XSLFO 模块。

echo "include.module.xslfo = true" > $EXIST_HOME/extensions/local.build.properties

注意:在无头 *nix 系统上,确保在启动 eXist-db 时没有设置 DISPLAY 环境变量,否则 apache batik svg 渲染器可能会抛出异常。

XQuery 示例

[编辑 | 编辑源代码]

xquery 亮点:FO 是从 xsl 转换创建的:我知道,这可以用 xquery 完成,但我可以在其他地方重用 xsl。文档是通过搜索找到的。xsl 样式表位于“views”中,就像 pdf.xq 一样。我创建了很多变量,但这样更好。文件名从请求中推断出来。可能存在错误,因为我剥离了工作代码!由于我对 xquery 功能的不了解,它可能过于复杂。我认为你会找到自己的方式。应用程序目录的布局如 XRX wiki 中建议的那样。

let $host := "https://127.0.0.1:8080/exist/rest/"
let $home := "/db/apps/myApp"
let $match := collection(concat($home, "/data"))//item[@uuid=$uuid]
let $coll := util:collection-name($match)
let $file := util:document-name($match)
let $xsls := concat($home, "/views/foPDF.xsl")
let $rand := concat("?", util:random())

let $params :=
 <parameters>
   <param name="svgfile" value="{$host}{$home}{$file}.svg"/>
   <param name="rand" value="{$rand}"/>
 </parameters>

let $tmp := transform:transform(doc(concat($coll, "/", $file)), doc($xsls), $params)
let $pdf := xslfo:render($tmp, "application/pdf", (), ())

(: substring-afer-last is in functx :)
let $fname := substring-after(request:get-path-info(), "/")
return response:stream-binary($pdf, "application/pdf", $fname)

另一种可能更高性能的方式是通过 xmldb:exist 限定符获取 svg 文件

let $host := "xmldb:exist://"

XSL 亮点

[编辑 | 编辑源代码]
<!-- passed in parameter, a fully qualified URI to the SVG file, eg:
    "https://127.0.0.1:8080/exist/rest//db/apps/myApp/data/Some.svg"
    or in exist-db "xmldb:exist///db/apps/myApp/data/Some.svg"
-->
<xsl:param name="svgfile" select="''"/>

<!-- passed in parameter, value eg: "?123", changes with every call
    used to force fop to reread the svg file each time
    starts with ? to be discarded in the end...
    can be left blank to have fop cache the svgfile
-->
<xsl:param name="rand" select="''"/>


<!-- place SVG in PDF output -->
<fo:block-container>
       <fo:block>
               <fo:external-graphic src="{$svgfile}{$rand}"/>
       </fo:block>
</fo:block-container>
华夏公益教科书