Source code for satcfdi.render

import json
from collections.abc import Sequence
from lxml.etree import QName

from .environment import DefaultCFDIEnvironment
from ..xelement import XElement

try:
    import weasyprint

    PDF_CSS = weasyprint.CSS(string="@page {margin: 1.0cm 1.27cm 1.1cm 0.85cm;}")
except OSError as ex:
    weasyprint = None

MAIN_TEMPLATE = DefaultCFDIEnvironment.get_template("_main.html")
BODY_TEMPLATE = DefaultCFDIEnvironment.get_template("_body.html")


[docs]def json_write(xlm: XElement, target, pretty_print=False): if isinstance(target, str): with open(target, 'w') as f: json.dump(xlm, f, ensure_ascii=False, default=str, indent=2 if pretty_print else None) return json.dump(xlm, target, ensure_ascii=False, default=str, indent=2 if pretty_print else None)
[docs]def json_str(xlm: XElement, pretty_print=False) -> str: return json.dumps(xlm, ensure_ascii=False, default=str, indent=2 if pretty_print else None)
[docs]def html_write(xlm: XElement | Sequence[XElement], target, template=MAIN_TEMPLATE): if isinstance(xlm, Sequence): template.stream({"c": [(QName(a.tag).localname, a) for a in xlm], "k": '_multiple'}).dump(target) else: template.stream({"c": xlm, "k": QName(xlm.tag).localname}).dump(target)
[docs]def html_str(xlm: XElement | Sequence[XElement], template=MAIN_TEMPLATE) -> str: if isinstance(xlm, Sequence): return template.render({"c": [(QName(a.tag).localname, a) for a in xlm], "k": '_multiple'}) else: return template.render({"c": xlm, "k": QName(xlm.tag).localname})
[docs]def pdf_write(xlm: XElement | Sequence[XElement], target, template=MAIN_TEMPLATE): if weasyprint is None: raise ImportError("weasyprint is not installed") weasyprint.HTML(string=html_str(xlm, template=template)).write_pdf( target=target, stylesheets=[PDF_CSS] )
[docs]def pdf_bytes(xlm: XElement | Sequence[XElement], template=MAIN_TEMPLATE) -> bytes: if weasyprint is None: raise ImportError("weasyprint is not installed") return weasyprint.HTML(string=html_str(xlm, template=template)).write_pdf( stylesheets=[PDF_CSS] )