如何在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
相关产品推荐
相关产品推荐

