使用 Saxon HE Apache FOP XSL-FO XSLT 2.0 调整图像大小以适合 PDF 页面

Image resizing to fit on PDF page using Saxon HE Apache FOP XSL-FO XSLT 2.0

我们正在使用 Saxon HE/Apache FOP (XSLT 2.0) 将 XML 转换为 PDF。我想调整一些图像的大小以适合页面。我了解使用 content-height 和 content-width "scale-down-to-fit" 或 "scale-to-fit" 属性,但图像的高度和宽度在 XML.
中不可用 我需要一种方法来访问 XSLT 中的图像文件尺寸。

以下是 XML 中可能描述的图形:

<graphic boardno="abcd.jpg" unitmeasure="in" inschlvl="0" delchlvl="0 />

之前他们使用的是 xalan 扩展(对于 v1.0 XSLT,我们正在升级到 v.2)

xmlns:ii="xalan://ImageInfo" and xmlns:file="xalan://FileUtils"

然后在 XSL-FO 中:

<xsl:variable name="curGraphicUri">
    <xsl:value-of select="unparsed-entity-uri(@boardno)" />
</xsl:variable>

<xsl:variable name="imgProp">
    <xsl:value-of select="ii:setInputFile(string($curGraphicUri),72)" />
</xsl:variable>

<xsl:variable name="curFunctionStatus">
    <xsl:value-of select="substring-after(substring-before($imgProp,';'),'status:')" />
</xsl:variable>

所以(我在想)如果我知道 FOP 中的等效函数或其他可用的扩展,我应该能够弄清楚其余部分。我搜索了这些论坛,但没有找到类似的问题。

EXPath Binary 模块的第 3.1 节为您提供了如何准确执行此操作的示例:

http://expath.org/spec/binary

Saxon(PE 及更高)实现了这个库。 (然而,对于 Saxon-HE,你就不走运了)。

使用 scale-down-to-fit(参见 https://www.w3.org/TR/xsl11/#content-height),您不需要知道图形的原始大小,因为 XSL-FO 格式化程序无论如何都会知道。如果全尺寸图形适合可用 space,则它将以 100% 比例呈现,否则图形将缩小直到适合可用 height/width.

如果您使用的格式化程序也支持 allowed-height-scale(请参阅 https://www.w3.org/TR/xsl11/#allowed-height-scale) and allowed-width-scale, then you could also control the scale factors that are used when the image is scaled down to fit. This can be useful, for example, to avoid Moiré patterns (see https://en.wikipedia.org/wiki/Moir%C3%A9_pattern)或在相关图形(例如,应用程序的菜单)。