阿拉伯语(RTL)场景下fo:table内实现fo:leader前导点的技术咨询
适配Apache FOP的RTL场景前导圆点实现方案
Apache FOP确实不支持在fo:table内部使用fo:float,以下两种方案均无需嵌套fo:table,兼容性、渲染性能和可维护性更优:
方案1:fo:list-block实现(推荐,兼容性最佳)
你之前尝试list结构失败大概率是未配置对齐属性适配RTL和底部对齐需求,正确实现代码如下:
<fo:table-cell> <fo:block font-family="Liberation Serif" font-size="8pt" font-style="normal" font-weight="normal" color="#000000" writing-mode="rl"> <fo:list-block provisional-label-separation="3pt" provisional-distance-between-starts="20pt"> <fo:list-item> <!-- 前导圆点区域 --> <fo:list-item-label end-indent="label-end()"> <fo:block text-align="end" alignment-baseline="after-edge" line-height="8pt"> <fo:leader leader-pattern="dots" leader-length.optimum="100%" font-size="8pt"/> </fo:block> </fo:list-item-label> <!-- 文本内容区域 --> <fo:list-item-body start-indent="body-start()"> <fo:block linefeed-treatment="preserve">0000: Net Income</fo:block> </fo:list-item-body> </fo:list-item> </fo:list-block> </fo:block> </fo:table-cell>
关键属性说明:
- writing-mode="rl":适配阿拉伯语RTL布局,若需适配LTR场景移除该属性即可
- alignment-baseline="after-edge":让前导圆点自动对齐文本块最后一行的底部,完全符合换行对齐需求
- 可通过调整
provisional-distance-between-starts参数控制前导圆点的长度
方案2:fo:inline-container实现(代码更精简)
如果不想使用列表结构,可使用该方案,仅需配置对齐属性即可实现预期效果:
<fo:table-cell> <fo:block font-family="Liberation Serif" font-size="8pt" font-style="normal" font-weight="normal" color="#000000" writing-mode="rl"> <fo:inline-container alignment-baseline="after-edge" width="20pt"> <fo:block text-align="end"> <fo:leader leader-pattern="dots" leader-length.optimum="100%" font-size="8pt"/> </fo:block> </fo:inline-container> <fo:inline-container> <fo:block linefeed-treatment="preserve">0000: Net Income</fo:block> </fo:inline-container> </fo:block> </fo:table-cell>
该方案适合文本长度固定的场景,可通过调整第一个inline-container的width参数控制前导圆点长度。
内容的提问来源于stack exchange,提问作者user1423596
相关产品推荐
相关产品推荐

