如何在XSL-FO中实现文本点状下划线效果
XSL-FO实现点状下划线方案
XSL-FO 1.1标准原生的text-decoration="underline"仅支持实线下划线,没有提供直接修改下划线为点状样式的内置参数,你可以通过以下两种方案实现效果:
方案1:底部边框模拟(兼容性最佳,推荐)
绝大多数常用XSL-FO渲染器(包括Apache FOP、Antenna House Formatter等)都支持边框样式配置,用下边框模拟点状下划线是适配性最高的方案,修改后的模板代码如下:
<xsl:template match="db:link"> <fo:basic-link internal-destination="{@idref}"> <fo:inline font-family="AvenirNextLTPro-It" border-bottom="1pt dotted #000" padding-bottom="1.5pt"> <xsl:apply-templates/> </fo:inline> </fo:basic-link> </xsl:template>
相关参数可以根据排版需求调整:
border-bottom的三个值分别对应下划线粗细、点状样式、下划线颜色padding-bottom用于控制下划线和文字底部的间距,避免线条和文字粘连- 这里将
fo:basic-link移到外层,是为了保证整个带下划线的文本区域都可正常点击,不会出现点击热区偏移的问题
方案2:使用高级文本装饰属性(仅适配高版本商业渲染器)
如果你使用的是支持XSL-FO 2.0草案特性的最新版商业渲染器,可以直接使用text-decoration-style属性指定下划线样式,写法更贴近原生下划线逻辑:
<xsl:template match="db:link"> <fo:inline font-family="AvenirNextLTPro-It" text-decoration="underline" text-decoration-style="dotted" text-decoration-color="#000"> <fo:basic-link internal-destination="{@idref}"> <xsl:apply-templates/> </fo:basic-link> </fo:inline> </xsl:template>
注意:目前Apache FOP等开源渲染器暂不支持
text-decoration-style属性,如果你的渲染链路用的是开源工具,直接选第一种方案即可,最终渲染效果和原生点状下划线几乎无差异。
内容的提问来源于stack exchange,提问作者user17710829
相关产品推荐
相关产品推荐

