odoo自定义打印、定制打印

  • Post author:
  • Post category:其他

需求:客户部分单据使用针式打印机,纸张尺寸215mm*140mm

先看实现效果:固定的表头表尾,支持多页且带有页码 

 odoo打印的基础这里就不讲了,直接从关键位置开始,使用自定义打印。

关键代码:

这里需要了解,odoo打印其实是分了header、page、 footer,分别为表头、打印内容、表尾。在设置中我们也能看到是可以配置表头表尾的,这里我们引用web.basic_layout 进行自定义表头、表尾。然后使用自定义打印设置纸张尺寸。

#自定义打印的定义        
<record id="EL_Needle_printing" model="report.paperformat">
    <field name="name">针孔打印</field>
    <field name="default" eval="True"/>
    # format 打印的类型有很多种,这里使用自定义打印custom
    <field name="format">custom</field>
    <field name="page_height">215</field>
    <field name="page_width">140</field>
    <field name="orientation">Landscape</field> #Landscape横向打印
    # 内容的外边距,就是内容距离顶部的距离,如果有表头这个高度需要大于表头的高度。
    <field name="margin_top">28</field> 
    <field name="margin_bottom">8</field>
    <field name="margin_left">4</field>
    <field name="margin_right">5</field>
    #有表头记得设置为True并设置header_spacing,不然打印内容会在表头下方显示不出来
    <field name="header_line" eval="True"/> 
    <field name="header_spacing">25</field> #定义表头的高度
    <field name="dpi">80</field>
</record>
<report 
    id="action_report_mrp_stock_order"
    string="生产领料单"
    model="mrp.production"
    report_type="qweb-pdf"
    name="yuanPC.report_mrp_stock_order"
    file="yuanPC.report_mrp_stock_order"
    print_report_name="'生产单 - %s' % (object.name)"
    paperformat="EL_Needle_printing" #自定义打印的id
/>

报表xml概览:

 这里讲下分页码的设置:

<div class="footer">
    <div style="width:100%;">
    <table style="width:100%;">
        <td style="width:5%;"/>
        <td style="width:25%;">
            <strong>审核人:</strong>
        </td>
        <td style="width:25%;">
            <strong>审核日期:</strong>
        </td>
        <td style="width:25%;">
            <strong>制单人:</strong>
            <span t-esc="request.env.user.name"/>
        </td>
        <td style="width:20%;">
            # page为当前页,topage为总页码。这两个class Odoo会自动解析
            第<span class="page"/>/<span class="topage"/>页
        </td>
    </table>
    </div>
</div>

涉及到表格的一些数据计算:

# 循环输出明细行,这里每循环一次就会创建一个tr
<t t-if="o.move_raw_ids">
    <tr t-foreach="o.move_raw_ids" t-as="raw_line" t-if="not raw_line.product_id.is_recoil" style="height:28px;">
        <td style="border: 1px solid #000">
            <span t-field="raw_line.product_id.default_code"/>
        </td>
    </tr>
</t>

<td style="border: 1px solid #000">
    # 计算模型中的字段,这里需要通过变量进行计算,然后使用t-esc输出
    <span t-set="foo" t-value="o.product_qty / o.wrap.wrap_qty * 1"/>
    # t-options 输出的时候可以对输的类型/格式进行定义,这里是定义计算结果保留2位小数
    <span t-esc="foo" t-options='{"widget": "float", "decimal_precision": "Product Unit of Measure"}'/>
</td>

版权声明:本文为qq_31214923原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。