You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何opacity与rotate在@page中失效?xhtmlrenderer转PDF水印问题

解决xhtmlrenderer渲染PDF时水印opacity和rotate不生效的问题

针对xhtmlrenderer(Flying Saucer)对CSS3属性在running元素上支持有限的问题,可通过以下几种方案解决:

方案1:用RGBA颜色替代opacity

xhtmlrenderer对opacity属性在position: running()元素上支持不佳,但支持RGBA颜色值,可直接通过颜色透明度实现水印效果:

div.watermarked {
  position: running(watermarked);
  text-align: center;
  font-size: 200px;
  /* 用rgba替代opacity,最后一位是透明度 */
  color: rgba(0, 0, 0, 0.1);
  z-index: -99;
  top: 50%;
  left: 25%;
}

方案2:改用SVG实现旋转水印

xhtmlrenderer对SVG的变换支持更完善,将水印文本嵌入SVG中,可直接实现旋转和透明效果:

  1. 替换原div为SVG元素:
<body>
  <svg class="watermarked" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
    <text 
      x="50%" 
      y="50%" 
      text-anchor="middle" 
      fill="rgba(0,0,0,0.1)" 
      font-size="200px" 
      transform="rotate(-30 50% 50%)"
    >Preview</text>
  </svg>
</body>
  1. 调整CSS:
@page {
  margin: 3cm 1cm 3cm 1cm;
  size: A4 portrait;
  @left-middle{
    content: element(watermarked)
  }
}
svg.watermarked {
  position: running(watermarked);
  width: 100%;
  height: 100%;
}

方案3:放弃running元素,使用全局固定定位

如果上述方案仍不生效,可直接在body中添加固定定位的水印,确保其覆盖所有页面:

div.watermarked {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) rotate(-30deg);
  font-size: 200px;
  color: rgba(0, 0, 0, 0.1);
  z-index: -99;
  pointer-events: none; /* 避免水印遮挡交互 */
}

这种方式无需依赖@page的running元素,兼容性更好,但需确保body高度足够覆盖所有分页内容。

额外注意事项

  • 确保使用最新版本的xhtmlrenderer(如9.1.22及以上),新版本对CSS和SVG的支持更完善。
  • 测试时可先简化样式,逐步添加属性,排查具体不生效的环节。

内容的提问来源于stack exchange,提问作者Tina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:21:57