如何从Python生成Odoo PDF报告?



我想生成一个PDF,其中包含给定销售订单的所有交付的所有stock.report_picking报告,并合并到一个文件中。我已经为运输标签做了类似的事情,其中每个标签被保存为ir.attachment记录。

但在这种情况下,stock.report_picking报告似乎没有被保存在任何地方,据我所知。每当用户打开"打印"菜单并单击报告操作(或者如果我转到/report/pdf/stock.report_picking/<id>)。

那么,我如何在Python中生成报告,以便我可以获得报告的二进制PDF数据(类似于附件记录上的datas字段),这样我就可以将报告datas的列表传递给odoo.tools.pdf.merge_pdf函数?然后,我可以得到我的最终结果,并做我想做的任何事情(通过HTTP响应将其发送回,将其保存在附件记录中,或其他)。

我知道我可以为我想要报告的每个记录向/report/pdf/stock.report_picking/<id>发出HTTP请求,然后从响应中获取二进制数据。但这似乎是一种错误的方式来实现我应该在Python内部完成的事情。我在官方文档中找不到任何关于如何实现这一点的内容。

那么,回到标题:如何从Python生成Odoo PDF报告?

我明白了!答案在odoo/addons/web/controllers/main.py,从1964年开始。这是在我的问题中简要提到的/report/<converter>/<reportname>/<docids>路由的源代码,在这里报告的官方文档的最后。

首先,事实证明,如果你想要一个包含多个记录的PDF报告合并到一个文件中,/report/pdf/stock.report_picking/<id>URL也可以将<id>参数设置为逗号分隔的列表报告id。这样,您甚至不需要单独获取每个报告并将它们与odoo.tools.pdf.merge_pdf合并。为什么这没有被记录下来对我来说是个谜。

但是,此外,路由的源代码还显示了您可以调用什么来从您自己的代码生成报告!很简单:

report_name = "stock.report_picking"
report = env["ir.actions.report"]._get_report_from_name(report_name)
# `report_output` is a tuple where `report_output[0]` is the binary output
# and `report_output[1]` is the "converter" (in this case, "pdf").
report_output = report.render_qweb_pdf([<id>, ...])

你可以拿report_output[0]做任何你想做的事。例如:

with open("report.pdf", "wb") as pdf_file:
pdf_file.write(report_output[0])

Odoo非常棒,但是文档跳过了太多平台可以做的事情。如果你想编写模块,你最好善于搜索和阅读源代码!

最新更新