使用XSL-FO/Antenna House Formatter 6.6如何确保图片始终适配页面?
竖长图片适配页面的解决办法
预计算动态缩放比例
既然你已经知道图片的像素尺寸、页面上下边距,还有标题的高度,直接计算出图片能使用的最大可用页面空间:- 页面可用宽度 = 页面总宽度 - 左右边距
- 页面可用高度 = 页面总高度 - 上下边距 - 标题文本的高度
接着算出两个缩放比例:宽度方向的适配比例(可用宽度/图片像素宽)、高度方向的适配比例(可用高度/图片像素高),取其中更小的那个作为最终缩放因子,把这个因子赋值给图片的scale属性,同时保留keep-with-previous="always"。这样不管是横图还是竖图,都会按最严格的限制缩放,不会超出页面范围。
示例XSL代码:
<!-- 假设从XML或外部数据获取图片尺寸、标题高度 --> <xsl:variable name="img-pixel-w" select="document('image-meta.xml')//image[@id=$img-id]/width"/> <xsl:variable name="img-pixel-h" select="document('image-meta.xml')//image[@id=$img-id]/height"/> <xsl:variable name="title-height" select="12mm"/> <!-- 实际标题高度可通过计算或预设 --> <!-- 以A4页面为例,总宽210mm,总高297mm,上下边距25mm,左右边距20mm --> <xsl:variable name="page-available-w" select="210 - 20 - 20"/> <xsl:variable name="page-available-h" select="297 - 25 - 25 - $title-height"/> <xsl:variable name="scale-w" select="$page-available-w div $img-pixel-w"/> <xsl:variable name="scale-h" select="$page-available-h div $img-pixel-h"/> <xsl:variable name="final-scale" select="if ($scale-w < $scale-h) then $scale-w else $scale-h"/> <external-graphic src="{$img-src}" scale="{$final-scale}" keep-with-previous="always"/>结合scale-to-fit与高度限制
不用手动算比例的话,可以给图片同时设置width="100%"和动态计算的剩余高度,再开启scale-to-fit="both",让格式化程序自动选择最优缩放方向。核心是要把图片的高度限制在标题下方的剩余页面空间里,示例代码:<xsl:variable name="remaining-page-h" select="297 - 25 - 25 - $title-height"/> <!-- A4示例剩余高度 --> <external-graphic src="{$img-src}" width="100%" height="{$remaining-page-h}mm" scale-to-fit="both" keep-with-previous="always"/>极端情况兜底:取消强制同行
如果遇到标题过长,导致剩余页面空间极小的情况,可以先判断缩放后的图片高度是否超过剩余空间,要是超出就自动取消keep-with-previous,让图片单独分页:<xsl:variable name="scaled-h" select="$img-pixel-h * $final-scale"/> <external-graphic src="{$img-src}" scale="{$final-scale}" keep-with-previous="{if ($scaled-h <= $page-available-h) then 'always' else 'auto'}"/>
内容的提问来源于stack exchange,提问作者Shawken X
相关产品推荐
相关产品推荐

