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

如何在Odoo的Qweb报表所有PDF页面添加水印图片?

解决Odoo QWeb报表水印仅第一页显示的问题

你的问题根源在于,QWeb使用wkhtmltopdf渲染PDF时,position:absolute的元素只会在初始页面渲染,不会随分页重复出现。下面提供两种可靠的解决方案,按推荐程度排序:

方法1:使用CSS @page 规则(推荐,最简洁)

直接通过CSS页面规则为所有页面设置背景水印,这是wkhtmltopdf原生支持的方式,效果最稳定。

在你的QWeb报表模板的<style>标签中添加以下代码:

@page {
    /* 插入base64格式的水印图片,居中显示 */
    background: url('data:image/png;base64,{{ o.employee_id.company_id.watermark_img }}') no-repeat center center;
    /* 设置水印透明度 */
    background-opacity: 0.1;
    /* 调整页面边距,避免水印被报表内容遮挡 */
    margin: 50px;
}

关键说明:

  • background-opacity是wkhtmltopdf支持的专属属性,用来控制背景透明度(普通CSS的opacity会影响整个页面,这里只针对背景)。
  • 确保o.employee_id.company_id.watermark_img确实存储了有效的base64图片字符串,避免为空导致无显示。
  • 调整margin值适配你的报表内容布局,防止水印被页眉/页脚或正文覆盖。

方法2:使用fixed定位的元素(兼容旧版场景)

如果你的Odoo版本搭配的wkhtmltopdf对@page背景支持不佳,可以将水印元素改为position:fixed,这种定位在PDF渲染中会自动在每一页重复显示。

替换你原来的代码为:

<div style="position:fixed; top:0; left:0; right:0; bottom:0; z-index:-1; opacity:0.1; display:flex; align-items:center; justify-content:center;">
    <img t-att-src="'data:image/png;base64,%s' % o.employee_id.company_id.watermark_img" style="max-width:80%; max-height:80%;"/>
</div>

关键说明:

  • position:fixed让元素固定在视口(PDF的每一页)中,而非仅第一页。
  • 使用flex布局display:flex; align-items:center; justify-content:center;确保水印在页面正中央。
  • max-width和max-height防止水印尺寸过大超出页面范围,同时保持比例。
  • z-index:-1确保水印在内容下方,不会遮挡报表文字。

额外注意事项

  • 请确保使用的wkhtmltopdf版本不低于0.12.5,旧版本对CSS属性支持有限,可能导致异常。
  • 测试时可以先输出base64图片到页面,确认图片本身是有效的(避免因图片损坏导致无显示)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:56:14