如何在XSL-FO中插入可设置自定义透明度的图片
XSL-FO生成PDF时如何设置插入图片的透明度
我正在使用xsl-fo生成PDF,希望插入可调整透明度的图片(例如25%、50%等),透明度数值由客户端输入后存储在数据库中。我尝试使用fo:external-graphic标签实现该需求,但该标签没有透明度或等效属性,请问该如何解决这个问题?我的代码如下:
<#assign cellPadding = "1pt"> <#assign dateFormat = "dd/MM/yyyy"> <#macro encodeText textValue>${Static["org.moqui.util.StringUtilities"].encodeForXmlAttribute(textValue!"", false)}</#macro> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="ArialUni, ArialUniBold, ArialUniItalic" font-size="10pt"> <fo:layout-master-set> <fo:simple-page-master master-name="letter-portrait" page-width="8.5in" page-height="11in" margin-top="0.05in" margin-bottom="0.1in" margin-left="0in" margin-right="0in"> <fo:region-body margin-top="0.05in" margin-bottom="0in" margin-left="0.5in"/> <fo:region-before margin-left="0in" margin-right="0in"/> <fo:region-after extent="0.2in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="letter-portrait" id="mainSequence"> <fo:static-content flow-name="xsl-region-before"> <fo:block-container absolute-position="absolute" top="0in" left="0" width="8.5in" height="11in"> <fo:block> <fo:instream-foreign-object> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="${imageLocation.getUri()}" opacity="1" width="8.5in" height="11in" scaling="non-uniform"/> </svg> </fo:instream-foreign-object> </fo:block> </fo:block-container> </fo:static-content> <fo:static-content flow-name="xsl-region-after" font-size="8pt"> <fo:block border-top="thin solid black"> <fo:block text-align="center">Trang <fo:page-number/></fo:block> </fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block>test image</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
运行结果如下:
我使用的原始图片:
解决方案
你目前采用的嵌入SVG的思路完全正确,XSL-FO原生的fo:external-graphic确实没有透明度相关属性,通过fo:instream-foreign-object嵌入支持透明度控制的SVG是通用的实现方案,仅需要微调现有代码即可实现需求:
- 先从数据库取出存储的透明度数值,转换为0-1范围的小数:比如25%透明度转换为0.25,50%透明度转换为0.5,赋值给一个Freemarker变量,例如命名为
imgOpacity。 - 把代码中SVG的
<image>标签的opacity="1"替换为opacity="${imgOpacity}",即可实现透明度的动态调整。 - 如果你使用Apache FOP作为XSL-FO处理器,确保使用2.0及以上版本,该版本对SVG的opacity属性支持完整,不会出现透明度不生效的问题。
如果后续需要给非背景位置的图片设置透明度,也可以采用相同方案,把对应位置的fo:external-graphic替换为嵌入的SVG容器即可,尺寸和坐标可以和原来的fo:external-graphic设置完全一致,不会影响原有布局。
内容的提问来源于stack exchange,提问作者kieuanhvu
相关产品推荐
相关产品推荐

