如何评估FOP-2.8的XSLT渲染中图片的实际分配宽度
我在渲染PNG图片时遇到了两种场景,想明确图片实际分配宽度的取值规则:
场景1:可用视口宽度 < content-width
页面定义:
<fo:simple-page-master master-name="page-one" page-width="297mm" page-height="210mm" margin="12mm"> <fo:region-body margin-bottom="5mm" margin-right="63.85mm"/> <fo:region-before extent="186.9mm" region-name="page-one-header"/> <fo:region-after extent="5mm" region-name="page-one-footer"/> </fo:simple-page-master>
根据计算,表头的可用视口宽度为63.85mm。
表格及图片代码:
<fo:table table-layout="fixed" width="100%"> <fo:table-column column-width="proportional-column-width(4.6)"/> <fo:table-column column-width="proportional-column-width(0.9)"/> <fo:table-body> <fo:table-row> <fo:table-cell column-number="2"> <fo:block> <fo:external-graphic src="file:///{$Logo}/Img.png" content-height="16mm" content-width="44mm" scaling="non-uniform"/> </fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table>
计算得出第2列宽度约为10.448mm,小于设置的content-width(44mm)。
场景2:可用视口宽度 > content-width
页面定义:
<fo:simple-page-master master-name="page-two-page" page-width="297mm" page-height="210mm" margin="12mm"> <fo:region-body margin-top="18.5mm" margin-bottom="5mm"/> <fo:region-before extent="18.5mm" region-name="page-two-header"/> <fo:region-after extent="5mm" region-name="page-two-footer"/> </fo:simple-page-master>
表头可用视口宽度为273mm。
表格及图片代码:
<fo:table table-layout="fixed" width="100%"> <fo:table-column column-width="proportional-column-width(2)" /> <fo:table-column column-width="proportional-column-width(2.6)" /> <fo:table-column column-width="proportional-column-width(1)" /> <fo:table-body> <fo:table-row > <fo:table-cell column-number="3"> <fo:block> <fo:external-graphic src="file:///{$Logo}/Img.png" content-height="16mm" content-width="45mm" scaling="non-uniform"/> </fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table>
第3列分配宽度为48.75mm,大于设置的content-width(45mm)。
两种场景下显示的Logo视觉上无差异,现明确:两种情况下图片的实际分配宽度应取可用视口宽度还是content-width?对应的显示区域是多少?
解答
场景1(可用视口宽度 < content-width)
图片实际显示宽度受限于表格单元格的宽度(10.448mm)——因为单元格是图片的直接容器,当容器宽度小于设置的content-width时,图片会适配容器尺寸。结合scaling="non-uniform"的设置,图片会被拉伸/压缩至单元格宽度(10.448mm),高度保持设置的16mm,最终显示区域为10.448mm × 16mm。场景2(可用视口宽度 > content-width)
表格单元格宽度(48.75mm)大于content-width(45mm),此时图片会按照设置的content-width和content-height渲染,显示区域为45mm × 16mm,单元格剩余的3.75mm空间会留白。
核心规则:content-width和content-height是图片的期望尺寸,但实际显示尺寸会被直接容器(此处为表格单元格)的尺寸限制——容器尺寸小于期望尺寸时,容器成为图片的最大显示边界;容器尺寸大于期望尺寸时,图片使用设置的期望尺寸,容器剩余空间留白。
内容的提问来源于stack exchange,提问作者Rito Sarkar

