Odoo 11 QWeb发票报表如何获取单页行数设置条件判断逻辑
核心说明
Odoo 11的QWeb发票类报表,流程是服务端先把所有内容拼成完整HTML,再丢给wkhtmltopdf引擎转成PDF。整个服务端阶段根本感知不到PDF生成时的内容排布,不存在任何可以直接获取单页实际承载明细行数的原生接口。
你要做的固定行数分页,本质是自定义规则:由你自己定死单页固定放多少行明细,通过计数器在拼HTML的阶段主动插分页标记,不是等PDF生成完了再去读每页有多少行。
你现有代码的问题
你写的参考代码有三处硬伤,根本跑不通:
- 没给计数器设初始值:第一次判断的时候计数器都是未定义状态,条件永远不会触发
- 执行顺序错了:现在的逻辑是先判断要不要分页,再把计数器加1,就算初始化了计数器,也要等到第11行才触发分页,单页会多塞1行,完全错位
- 作用域不对:把分页判断、计数器赋值写在明细循环外面,循环过程里拿不到最新的计数结果,计数器永远停在初始值不动
正确的固定行数分页实现
按照下面的结构写模板,就能实现每累计10行自动分页的效果:
<main> <!-- 明细循环开始前,先把计数器初始化设为0 --> <t t-set="row_counter" t-value="0"/> <!-- 遍历发票所有明细行 --> <t t-foreach="o.invoice_line_ids" t-as="line"> <!-- 每轮循环先判断计数到没到分页阈值,计数为0的时候(也就是第一行)不触发分页 --> <t t-if="row_counter % 10 == 0 and row_counter != 0"> <div style="page-break-after: always;"></div> </t> <!-- 渲染当前明细行的内容 --> <div class="invoice-line"> <span t-esc="line.name"/> <span t-esc="line.quantity"/> <span t-esc="line.price_subtotal"/> </div> <!-- 本行渲染完成后,计数器加1 --> <t t-set="row_counter" t-value="row_counter + 1"/> </t> </main>
实操注意点
- 别花时间找什么读取单页实际行数的方法:wkhtmltopdf会根据行高、纸张边距、内容长度动态调整分页位置,服务端根本拿不到这些动态变化的值,严格控制单页行数只能靠主动插分页标记实现
- 如果发现计数器不更新,检查是不是把计数器赋值写在了独立作用域块里(比如
t-call调用的子模板、嵌套的iframe块),Odoo 11的QWeb作用域是静态继承的,跨作用域改的变量不会同步回父上下文 - 分页标记一定要用
page-break-after: always的行内样式,不要靠JS控制分页,PDF引擎解析HTML的时候会直接识别这个样式强制分页,JS的动态逻辑根本不会被PDF引擎执行
内容的提问来源于stack exchange,提问作者K.ju
相关产品推荐
相关产品推荐

