Odoo 打印 A4 纸时内容不从纸张顶端开始,核心是系统默认纸张格式的上边距、页眉间距、QWeb 布局结构、wkhtmltopdf 渲染规则共同叠加的结果,和普通浏览器打印原理不同。
一、核心原因(Odoo 特有)
默认纸张格式的上边距(最主要)
Odoo 内置 A4 纸张格式(report.paperformat)默认上边距(margin_top)约 40mm,页眉间距(header_spacing)约 35mm。这是系统预设的安全值,内容从该边距下方开始渲染,而非物理纸顶。
页眉与内容的双层间距
Odoo 报表分三层:页眉(header)→ 页眉间距(header_spacing)→ 正文(page)。默认 35mm 的header_spacing专门预留页眉与正文的间隔,进一步推高正文位置。
QWeb 布局模板的固定结构
报表模板(如web.external_layout)强制包含header、page、footer区块,即使隐藏页眉,布局仍会保留页眉容器的占位空间。
wkhtmltopdf 渲染限制
Odoo 用wkhtmltopdf将 HTML 转 PDF,它会严格遵循 Odoo 纸张格式的边距参数,且多数打印机有物理不可打印边距(约 3–5mm),无法完全消除顶部空白。
报表模板自身的 CSS 边距
模板中body或page容器可能有默认margin-top,与系统边距叠加。
二、快速解决:调整纸张格式(后台操作)
1. 进入纸张格式设置(需开启调试模式)
开启开发者模式(设置 → 激活开发者模式)。
进入:设置 → 技术 → 报告 → 纸张格式。
找到默认的A4格式,或新建自定义格式。
2. 修改关键参数(直接生效)
上边距(margin_top):从 40mm 改为0–5mm(建议 5mm 兼容打印机)。
页眉间距(header_spacing):从 35mm 改为0(无页眉时)。
页眉线(header_line):取消勾选(隐藏页眉分隔线)。
保存后,重启 Odoo 服务使设置生效。
3. 绑定到指定报表(可选)
在纸张格式的关联报表字段,选择要应用的报表(如销售订单、发票),避免影响全局。
三、前端定制:QWeb 模板优化(彻底可控)
1. 自定义纸张格式(XML)
在模块中创建新纸张格式,覆盖默认值:
xml
<record id="report_paperformat_a4_tight" model="report.paperformat">
<field name="name">A4 紧凑(无边距)</field>
<field name="format">A4</field>
<field name="margin_top">5</field> <!-- 顶部5mm -->
<field name="margin_bottom">10</field>
<field name="margin_left">10</field>
<field name="margin_right">10</field>
<field name="header_spacing">0</field> <!-- 无页眉间距 -->
<field name="header_line" eval="False"/>
<field name="dpi">90</field>
</record>
2. 报表模板绑定新格式
在报表动作(ir.actions.report)中指定纸张格式:
xml
<record id="action_report_saleorder" model="ir.actions.report">
<field name="name">销售订单</field>
<field name="model">sale.order</field>
<field name="report_name">sale.report_saleorder</field>
<field name="paperformat_id" ref="your_module.report_paperformat_a4_tight"/>
</record>
3. 清除模板内边距(CSS)
在报表模板中加入打印样式,清除容器默认边距:
xml
<template id="report_saleorder_document">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<div class="page" style="margin-top: 0 !important; padding-top: 0 !important;">
<!-- 报表内容 -->
</div>
</t>
</t>
<style type="text/css" media="print">
@page { margin: 0; }
body { margin: 0; padding: 0; }
.page { margin-top: 0 !important; }
</style>
</template>
四、常见问题排查
顶部仍有空白:检查wkhtmltopdf版本(建议 0.12.5+),低版本可能不兼容边距设置。
页眉被裁剪:若保留页眉,margin_top需≥页眉高度,header_spacing≥5mm。
内容溢出:调整margin_top后,适当缩小内容缩放比例(Odoo 打印预览中设置)。
五、总结
内容不从顶端开始 = Odoo 默认 margin_top(40mm)+ header_spacing(35mm)+ 布局占位 + 打印机物理边距。
最快修复:后台将 A4 格式的margin_top 设为 5mm、header_spacing 设为 0。
彻底可控:自定义纸张格式 + 报表模板绑定 + CSS 清除内边距。