如何在 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 的书,我在其中看到了提示。