如何在 eXist-db 和 xQuery 中函数 运行 期间压缩二进制文件
How to zip binary files during function’s run in eXist-db and xQuery
我可以生成 pdf 并将它们作为 response:stream-binary
文件提供下载。但是,如果我尝试压缩生成的 pdf 并对 zip 做同样的事情,我会遇到问题。它提供了 zip 结果供下载。包含 pdf 但没有大小(空文件)。
let $pdf-binary :=
(
if ($pdfQuality eq 'proof' and $template eq 'draft')
then xslfo:render(transform:transform($doc, $stylesProof, ()), 'application/pdf', (), $proofConf)
else if ($pdfQuality eq 'print' and $template eq 'draft')
then xslfo:render(transform:transform($doc, $stylesPrint, ()), 'application/pdf', (), $printConf)
else if ($pdfQuality eq 'print' and $template eq 'auc-geographica')
then xslfo:render(transform:transform($doc, $stylesAUCGeographica, ()), 'application/pdf', (), $printConf)
else ()
)
return
if (not($zipAll))
then response:stream-binary($pdf-binary, 'application/pdf', $name || '.pdf')
else if ($zipAll)
then (
let $entry := <entry name="{$name}.pdf" type="binary" method="store">{util:binary-doc($pdf-binary)}</entry>
let $zip-file := compression:zip($entry, false())
return
response:stream-binary($zip-file, 'application/zip', 'test.zip')
)
else ()
重要的是我不想将 pdf 结果存储在数据库中的任何位置。
完成。最好稍微重新安排项目。我在调用渲染函数的查询中使用了整个逻辑。工作结果为:
...
let $zip as item() :=
(
let $entries as item()+ :=
(
for $article at $count in $doc/article//tei:TEI
let $year as xs:string := $article//tei:date/string()
let $issue as xs:string := $article//tei:biblScope/string()
let $pdf as xs:base64Binary := fop:render-pdf($article, $template, $name, $pdfQuality)
return
<entry name="{lower-case($name)}-{$year}-{$issue}-{$count}.pdf" type="binary" method="store">{$pdf}</entry>
)
return
compression:zip($entries, false())
)
return
response:stream-binary($zip, 'application/zip', $name || '.zip')
如果有人可以修改此解决方案,我将非常高兴。我了解到使用强类型而不依赖自动转换真的是个好主意。没有这个代码就不起作用。非常感谢 Erik Siegel 和 Adam Retter 所著的关于 eXist-db 的书,我在其中看到了提示。
我可以生成 pdf 并将它们作为 response:stream-binary
文件提供下载。但是,如果我尝试压缩生成的 pdf 并对 zip 做同样的事情,我会遇到问题。它提供了 zip 结果供下载。包含 pdf 但没有大小(空文件)。
let $pdf-binary :=
(
if ($pdfQuality eq 'proof' and $template eq 'draft')
then xslfo:render(transform:transform($doc, $stylesProof, ()), 'application/pdf', (), $proofConf)
else if ($pdfQuality eq 'print' and $template eq 'draft')
then xslfo:render(transform:transform($doc, $stylesPrint, ()), 'application/pdf', (), $printConf)
else if ($pdfQuality eq 'print' and $template eq 'auc-geographica')
then xslfo:render(transform:transform($doc, $stylesAUCGeographica, ()), 'application/pdf', (), $printConf)
else ()
)
return
if (not($zipAll))
then response:stream-binary($pdf-binary, 'application/pdf', $name || '.pdf')
else if ($zipAll)
then (
let $entry := <entry name="{$name}.pdf" type="binary" method="store">{util:binary-doc($pdf-binary)}</entry>
let $zip-file := compression:zip($entry, false())
return
response:stream-binary($zip-file, 'application/zip', 'test.zip')
)
else ()
重要的是我不想将 pdf 结果存储在数据库中的任何位置。
完成。最好稍微重新安排项目。我在调用渲染函数的查询中使用了整个逻辑。工作结果为:
...
let $zip as item() :=
(
let $entries as item()+ :=
(
for $article at $count in $doc/article//tei:TEI
let $year as xs:string := $article//tei:date/string()
let $issue as xs:string := $article//tei:biblScope/string()
let $pdf as xs:base64Binary := fop:render-pdf($article, $template, $name, $pdfQuality)
return
<entry name="{lower-case($name)}-{$year}-{$issue}-{$count}.pdf" type="binary" method="store">{$pdf}</entry>
)
return
compression:zip($entries, false())
)
return
response:stream-binary($zip, 'application/zip', $name || '.zip')
如果有人可以修改此解决方案,我将非常高兴。我了解到使用强类型而不依赖自动转换真的是个好主意。没有这个代码就不起作用。非常感谢 Erik Siegel 和 Adam Retter 所著的关于 eXist-db 的书,我在其中看到了提示。