跳转到主要内容

基于Libreoffice的报表引擎(ODT -> ODT, ODT -> PDF, ODT -> DOC, ODT -> DOCX, ODS -> ODS等)

项目描述

Beta License: AGPL-3 OCA/reporting-engine Translate me on Weblate Try me on Runbot

py3o报表引擎是基于Libreoffice的Odoo报表引擎

  • 报表由Libreoffice(ODT或ODS)创建

  • 报表以OpenDocument格式(.odt或.ods文件)存储在服务器上

  • 报表以OpenDocument格式或Libreoffice(PDF、HTML、DOC、DOCX、Docbook、XLS等)支持的任何输出格式发送给用户

基于Libreoffice的报表引擎的关键优势包括

  • 无需是开发者即可创建或修改报表:报表是用Libreoffice创建和修改的。因此,这个报表引擎具有完整的WYSIWYG报表开发工具!

  • 对于A4/Letter格式的PDF报表,使用设计用于创建A4/Letter文档的工具(如Libreoffice)开发它比在HTML/CSS中开发它更容易,而且一些打印特性(背景、页边框)在基于HTML/CSS的解决方案中支持得不是很好。

  • 如果您希望用户能够在Odoo生成文档后修改该文档,只需将文档配置为ODT输出(或DOC或DOCX),用户在Odoo生成后即可使用Libreoffice(或Word)修改该文档。

  • 轻松开发ODS格式的电子表格报表(XLS输出可能)。

本模块 report_py3o 是 Py3o 报告引擎的基础模块。如果单独使用,将为每个 ODT 到 PDF(或 ODT 到 DOCX 等)文档转换启动一个 libreoffice 进程。这很慢,如果你有大量的报告需要从 ODT 转换为其他格式,可能会成为问题。在这种情况下,你应该考虑添加额外的模块 report_py3o_fusion_server,该模块旨在与 libreoffice 守护进程一起工作。使用 report_py3o_fusion_server,技术环境更复杂,因为你必须安装额外的软件组件并运行 2 个守护进程,但你将获得更好的性能,并且可以在 Odoo 中配置 libreoffice PDF 导出选项(允许生成 PDF 表单、PDF/A 文档、受密码保护的 PDF、水印 PDF 等)。

此报告引擎是 Aeroo 的替代方案:这两个报告引擎具有类似的功能,但它们的实现完全不同。虽然你不能直接使用 aeroo 模板作为替代品,但你必须更改一些细节。

目录

安装

安装所需的 Python 库

pip install py3o.template
pip install py3o.formats

为了允许将 ODT 或 ODS 报告转换为其他格式(PDF、DOC、DOCX 等),请安装 libreoffice

apt-get --no-install-recommends install libreoffice

配置

例如,要替换原生发票报告为自定义 py3o 报告,请在您的自定义模块中添加以下 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="account.account_invoices" model="ir.actions.report">
    <field name="report_type">py3o</field>
    <field name="py3o_filetype">odt</field>
    <field name="module">my_custom_module_base</field>
    <field name="py3o_template_fallback">report/account_invoice.odt</field>
</record>

</odoo>

其中 my_custom_module_base 是自定义 Odoo 模块的名称。在此示例中,发票 ODT 文件位于 my_custom_module_base/report/account_invoice.odt

还可以引用位于 Odoo 服务器受信任路径中的模板。在这种情况下,必须留空 module 条目,并将模板的路径指定为 py3o_template_fallback

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="account.account_invoices" model="ir.actions.report">
    <field name="report_type">py3o</field>
    <field name="py3o_filetype">odt</field>
    <field name="py3o_template_fallback">/odoo/templates/py3o/report/account_invoice.odt</field>
</record>

</odoo>

此外,您还必须修改 Odoo 服务器配置文件,以声明 py3o 模板允许的根目录。只有位于此目录中的模板才能由 py3o 报告加载。

[options]
...

[report_py3o]
root_tmpl_path=/odoo/templates/py3o

如果您想以 PDF 格式而不是 ODT 格式获取发票,XML 文件应如下所示

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="account.account_invoices" model="ir.actions.report">
    <field name="report_type">py3o</field>
    <field name="py3o_filetype">pdf</field>
    <field name="module">my_custom_module_base</field>
    <field name="py3o_template_fallback">report/account_invoice.odt</field>
</record>

</odoo>

如果您想添加新的 py3o PDF 报告(而不是替换原生报告),XML 文件应如下所示

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="partner_summary_report" model="ir.actions.report">
    <field name="name">Partner Summary</field>
    <field name="model">res.partner</field>
    <field name="report_name">res.partner.summary</field>
    <field name="report_type">py3o</field>
    <field name="py3o_filetype">pdf</field>
    <field name="module">my_custom_module_base</field>
    <field name="py3o_template_fallback">report/partner_summary.odt</field>
    <!-- Add entry in "Print" drop-down list -->
    <field name="binding_type">report</field>
    <field name="binding_model_id" ref="base.model_res_partner"/>
</record>

</odoo>

配置参数

py3o.conversion_command

用于运行转换的命令,默认为 libreoffice。如果您更改此设置,则在此处设置的任何内容都必须接受参数 --headless --convert-to $ext $file 并将结果文件放入 $file 的目录中,扩展名为 $ext。命令将在 $file 的目录中启动。

使用方法

模板语言有详细的文档 http://py3otemplate.readthedocs.io/en/latest/templating.html,记录在 libreoffice 中作为 objects 揭示,您还可以在它们上调用函数。

可用的函数和对象

user

浏览当前用户的记录

lang

用户公司语言字符串(ISO 代码)

b64decode

base64.b64decode

format_multiline_value(string)

生成多行字段的 ODF 相当物(ODF 内部是 XML,否则将跳过这些)

html_sanitize(string)

净化 HTML 字符串

time

Python 的 time 模块

display_address(partner)

返回合作伙伴地址的格式化字符串

o_format_lang(value, lang_code=False, digits=None, grouping=True, monetary=False, dp=False, currency_obj=False, no_break_space=True)

根据上下文语言和时区返回格式化的数字或货币值

o_format_date(value, lang_code=False, date_format=False)

根据上下文语言和时区返回格式化的日期或时间值

示例报告模板

主要Odoo原生报告(发票、销售订单、采购订单、拣货等)的py3o报告模板示例可在GitHub项目odoo-py3o-report-templates中找到。

已知问题 / 路线图

  • 生成条形码?

  • 在演示文件中添加更多详细示例以展示功能

  • 添加aeroo -> py3o迁移指南

错误追踪器

错误在GitHub Issues上跟踪。如有问题,请检查是否已经报告了您的问题。如果您是第一个发现它的人,请通过提供详细且受欢迎的反馈来帮助我们解决它。

请不要直接联系贡献者以获取支持或技术问题的帮助。

鸣谢

作者

  • XCG咨询

  • ACSONE SA/NV

贡献者

维护者

本模块由OCA维护。

Odoo Community Association

OCA,即Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。

本模块是GitHub上OCA/reporting-engine项目的一部分。

欢迎您贡献力量。要了解如何贡献,请访问https://odoo-community.org/page/Contribute

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

本发布版本没有可用的源代码分发文件。请参阅生成分发存档的教程

构建分发

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面