能否获取XSL-FO中external-graphic的固有宽高以自定义尺寸?
好问题!在处理XSL-FO的fo:external-graphic时,确实可以获取资源的固有宽高,然后根据条件调整显示尺寸。下面分几种实用场景给你说明:
1. 利用FO处理器的扩展功能直接获取
主流的FO处理器(比如Apache FOP、RenderX XEP)都提供了专属扩展来访问外部图形的原始尺寸:
- Apache FOP:可以使用它的
fox:intrinsic-width和fox:intrinsic-height扩展属性。记得先在XSL文件顶部声明FOP的命名空间:xmlns:fox="http://xmlgraphics.apache.org/fop/extensions",然后就能在条件判断里用了:
<fo:external-graphic src="url('your-image.png')"> <!-- 判断固有宽度是否超过600pt,超过则强制缩小 --> <xsl:if test="fox:intrinsic-width() > 600pt"> <xsl:attribute name="content-width">600pt</xsl:attribute> <xsl:attribute name="content-height">scale-to-fit</xsl:attribute> </xsl:if> <!-- 未超过则保持100%自适应 --> <xsl:if test="fox:intrinsic-width() <= 600pt"> <xsl:attribute name="content-width">100%</xsl:attribute> <xsl:attribute name="content-height">100%</xsl:attribute> </xsl:if> </fo:external-graphic>
- RenderX XEP:对应的扩展是
rx:original-width和rx:original-height,用法类似,只需声明XEP的命名空间即可。
2. 在XSLT预处理阶段提前获取尺寸
如果你的FO文档是通过XSLT生成的,还可以在生成FO之前,先读取图片的元数据拿到固有宽高:
比如用XSLT的扩展函数(像EXSLT的image-size,或者处理器自带的文件操作函数)先获取尺寸,再根据这个值生成对应的FO代码:
<!-- 定义图片路径变量 --> <xsl:variable name="img-path" select="'your-image.png'" /> <!-- 获取固有宽高(具体函数取决于你用的XSLT处理器) --> <xsl:variable name="img-width" select="image-size($img-path)/width" /> <xsl:variable name="img-height" select="image-size($img-path)/height" /> <fo:external-graphic src="url($img-path)"> <xsl:choose> <xsl:when test="$img-width > 800"> <!-- 尺寸过大时设置最大宽度,自动按比例缩放高度 --> <xsl:attribute name="content-width">800pt</xsl:attribute> <xsl:attribute name="content-height">scale-to-fit</xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="content-width">100%</xsl:attribute> <xsl:attribute name="content-height">100%</xsl:attribute> </xsl:otherwise> </xsl:choose> </fo:external-graphic>
这种方式逻辑更灵活,完全在XSLT阶段处理,不用依赖FO处理器的扩展。
3. 不依赖扩展的间接限制方式
如果不想折腾扩展或预处理,也可以用FO原生的属性间接实现“尺寸过大时自动缩小”的需求,不需要显式获取固有值:
<fo:external-graphic src="url('your-image.png')" content-width="scale-to-fit" content-height="scale-to-fit" max-width="600pt" max-height="400pt" />
这样图形会自动缩放,最大不超过你设定的max-width和max-height,同时保持原始比例,适合简单的尺寸限制场景。
内容的提问来源于stack exchange,提问作者Desaretiuss
相关产品推荐
相关产品推荐

