Public release from ruodoo-project: 19.0 - 2026-05-10 21:19:01 UTC
This commit is contained in:
23
report_weasyprint/README.md
Normal file
23
report_weasyprint/README.md
Normal file
@ -0,0 +1,23 @@
|
||||
# Report WeasyPrint
|
||||
|
||||
Adds WeasyPrint PDF rendering support to Odoo PDF reports.
|
||||
|
||||
## Requirements
|
||||
|
||||
System packages (Debian/Ubuntu example):
|
||||
|
||||
```bash
|
||||
sudo apt install -y \
|
||||
libcairo2 libpango-1.0-0 libpangocairo-1.0-0 \
|
||||
libgdk-pixbuf2.0-0 libffi-dev shared-mime-info \
|
||||
fonts-dejavu-core fonts-liberation
|
||||
```
|
||||
|
||||
Python:
|
||||
```
|
||||
pip3 install WeasyPrint>=66.0
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Enable *Render with WeasyPrint* on any report (Settings → Technical → Reports).
|
||||
1
report_weasyprint/__init__.py
Normal file
1
report_weasyprint/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import models
|
||||
16
report_weasyprint/__manifest__.py
Normal file
16
report_weasyprint/__manifest__.py
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "Report WeasyPrint",
|
||||
"summary": "Рендер пдф документов через WeasyPrint вместо wkhtmltopdf",
|
||||
"version": "19.0.1.0.0",
|
||||
"category": "Reporting",
|
||||
"author": "Mk.lab",
|
||||
"license": "LGPL-3",
|
||||
"depends": ["base", "web"],
|
||||
"data": [
|
||||
"views/ir_actions_report_views.xml",
|
||||
],
|
||||
"external_dependencies": {
|
||||
"python": ["weasyprint"],
|
||||
},
|
||||
"installable": True,
|
||||
}
|
||||
1
report_weasyprint/models/__init__.py
Normal file
1
report_weasyprint/models/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import ir_actions_report_weasy
|
||||
78
report_weasyprint/models/ir_actions_report_weasy.py
Normal file
78
report_weasyprint/models/ir_actions_report_weasy.py
Normal file
@ -0,0 +1,78 @@
|
||||
import logging
|
||||
from odoo import api, fields, models
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
from weasyprint import HTML
|
||||
from weasyprint.text.fonts import FontConfiguration
|
||||
except Exception as e:
|
||||
HTML = None
|
||||
FontConfiguration = None
|
||||
_logger.warning("WeasyPrint not available: %s", e)
|
||||
|
||||
|
||||
class IrActionsReport(models.Model):
|
||||
_inherit = "ir.actions.report"
|
||||
|
||||
use_weasyprint = fields.Boolean(
|
||||
string="Render with WeasyPrint",
|
||||
help="Render this PDF report using WeasyPrint instead of wkhtmltopdf."
|
||||
)
|
||||
|
||||
def _weasyprint_enabled_for(self, report):
|
||||
if not (HTML and FontConfiguration and report):
|
||||
return False
|
||||
|
||||
ctx = self.env.context
|
||||
if ctx.get("report_force_wkhtml"):
|
||||
return False
|
||||
if ctx.get("report_force_weasy"):
|
||||
return True
|
||||
|
||||
return bool(report.use_weasyprint)
|
||||
|
||||
@api.model
|
||||
def _run_wkhtmltopdf(
|
||||
self,
|
||||
bodies,
|
||||
report_ref=False,
|
||||
header=None,
|
||||
footer=None,
|
||||
landscape=False,
|
||||
specific_paperformat_args=None,
|
||||
set_viewport_size=False,
|
||||
):
|
||||
report = None
|
||||
if report_ref:
|
||||
try:
|
||||
report = self._get_report(report_ref)
|
||||
except Exception:
|
||||
report = None
|
||||
|
||||
if not self._weasyprint_enabled_for(report):
|
||||
return super()._run_wkhtmltopdf(
|
||||
bodies,
|
||||
report_ref=report_ref,
|
||||
header=header,
|
||||
footer=footer,
|
||||
landscape=landscape,
|
||||
specific_paperformat_args=specific_paperformat_args,
|
||||
set_viewport_size=set_viewport_size,
|
||||
)
|
||||
|
||||
html = "".join(bodies)
|
||||
|
||||
base_url = (
|
||||
self.env["ir.config_parameter"].sudo().get_param("report.url")
|
||||
or self.env["ir.config_parameter"].sudo().get_param("web.base.url")
|
||||
or ""
|
||||
)
|
||||
|
||||
font_config = FontConfiguration()
|
||||
pdf_bytes = HTML(
|
||||
string=html,
|
||||
base_url=base_url,
|
||||
).write_pdf(font_config=font_config)
|
||||
|
||||
return pdf_bytes
|
||||
13
report_weasyprint/views/ir_actions_report_views.xml
Normal file
13
report_weasyprint/views/ir_actions_report_views.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="view_ir_actions_report_form_weasy" model="ir.ui.view">
|
||||
<field name="name">ir.actions.report.form.weasyprint</field>
|
||||
<field name="model">ir.actions.report</field>
|
||||
<field name="inherit_id" ref="base.act_report_xml_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='report_type']" position="after">
|
||||
<field name="use_weasyprint"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user