From 463d1f2b05440400f030f0c4d48f28ded5da877a Mon Sep 17 00:00:00 2001 From: Maharshi Patel Date: Fri, 14 Feb 2025 17:04:13 +0530 Subject: [PATCH] fix: code changes as pdf_generator is now select field --- frappe/__init__.py | 36 +++++++++----- .../doctype/print_format/print_format.py | 2 +- .../pdf_header_footer_chrome.html | 49 ------------------- frappe/utils/pdf.py | 16 ++---- frappe/utils/print_format.py | 5 +- frappe/www/printview.py | 2 +- 6 files changed, 33 insertions(+), 77 deletions(-) delete mode 100644 frappe/templates/print_formats/pdf_header_footer_chrome.html diff --git a/frappe/__init__.py b/frappe/__init__.py index e887763463..98582c76de 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -2082,7 +2082,7 @@ def get_print( password=None, pdf_options=None, letterhead=None, - chrome_pdf_generator=None, + pdf_generator: Literal["wkhtmltopdf", "chrome"] | None = None, ): """Get Print Format for given document. @@ -2091,21 +2091,23 @@ def get_print( :param print_format: Print Format name. Default 'Standard', :param style: Print Format style. :param as_pdf: Return as PDF. Default False. - :param password: Password to encrypt the pdf with. Default None""" + :param password: Password to encrypt the pdf with. Default None + :param pdf_generator: PDF generator to use. Default 'wkhtmltopdf' + """ from frappe.utils.pdf import get_pdf from frappe.website.serve import get_response_without_exception_handling """ - local.form_dict.chrome_pdf_generator is set from before_request hook (print designer app) for download_pdf endpoint + local.form_dict.pdf_generator is set from before_request hook (print designer app) for download_pdf endpoint if it is not set (internal function call) then set it """ - if "chrome_pdf_generator" not in local.form_dict: + if "pdf_generator" not in local.form_dict: # if arg is passed, use that, else get setting from print format - if chrome_pdf_generator is None: - chrome_pdf_generator = frappe.get_cached_value( - "Print Format", print_format, "chrome_pdf_generator" + if pdf_generator is None: + pdf_generator = ( + frappe.get_cached_value("Print Format", print_format, "pdf_generator") or "wkhtmltopdf" ) - local.form_dict.chrome_pdf_generator = bool(cint(chrome_pdf_generator)) + local.form_dict.pdf_generator = pdf_generator original_form_dict = copy.deepcopy(local.form_dict) try: @@ -2129,16 +2131,24 @@ def get_print( if not as_pdf: return html - if local.form_dict.chrome_pdf_generator: - hook_func = frappe.get_hooks("chrome_pdf_generator") - if hook_func: - return frappe.call( - hook_func[-1], + if local.form_dict.pdf_generator != "wkhtmltopdf": + hook_func = frappe.get_hooks("pdf_generator") + for hook in hook_func: + """ + check pdf_generator value in your hook function. + if it matches run and return pdf else return None + """ + pdf = frappe.call( + hook, print_format=print_format, html=html, options=pdf_options, output=output, + pdf_generator=local.form_dict.pdf_generator, ) + # if hook returns a value, assume it was the correct pdf_generator and return it + if pdf: + return pdf return get_pdf(html, options=pdf_options, output=output) diff --git a/frappe/printing/doctype/print_format/print_format.py b/frappe/printing/doctype/print_format/print_format.py index f8e2a594f4..4e5029944b 100644 --- a/frappe/printing/doctype/print_format/print_format.py +++ b/frappe/printing/doctype/print_format/print_format.py @@ -22,7 +22,6 @@ class PrintFormat(Document): absolute_value: DF.Check align_labels_right: DF.Check - chrome_pdf_generator: DF.Check css: DF.Code | None custom_format: DF.Check default_print_language: DF.Link | None @@ -41,6 +40,7 @@ class PrintFormat(Document): page_number: DF.Literal[ "Hide", "Top Left", "Top Center", "Top Right", "Bottom Left", "Bottom Center", "Bottom Right" ] + pdf_generator: DF.Literal["wkhtmltopdf"] print_format_builder: DF.Check print_format_builder_beta: DF.Check print_format_type: DF.Literal["Jinja", "JS"] diff --git a/frappe/templates/print_formats/pdf_header_footer_chrome.html b/frappe/templates/print_formats/pdf_header_footer_chrome.html deleted file mode 100644 index 0cb2857340..0000000000 --- a/frappe/templates/print_formats/pdf_header_footer_chrome.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - {% for tag in head -%} - {{ tag | string }} - {%- endfor %} - - - - {% for tag in styles -%} - {{ tag | string }} - {%- endfor %} - - - - - diff --git a/frappe/utils/pdf.py b/frappe/utils/pdf.py index 871adf9b4c..9f0469f0b4 100644 --- a/frappe/utils/pdf.py +++ b/frappe/utils/pdf.py @@ -33,10 +33,9 @@ PDF_CONTENT_ERRORS = [ ] -def pdf_header_html(soup, head, content, styles, html_id, css): - path = "templates/print_formats/pdf_header_footer.html" - if frappe.local.form_dict.get("chrome_pdf_generator", False): - path = "templates/print_formats/pdf_header_footer_chrome.html" +def pdf_header_html(soup, head, content, styles, html_id, css, path=None): + if not path: + path = "templates/print_formats/pdf_header_footer.html" return frappe.render_template( path, { @@ -78,14 +77,9 @@ def _guess_template_error_line_number(template) -> int | None: return frame.lineno -def pdf_footer_html(soup, head, content, styles, html_id, css): +def pdf_footer_html(soup, head, content, styles, html_id, css, path=None): return pdf_header_html( - soup=soup, - head=head, - content=content, - styles=styles, - html_id=html_id, - css=css, + soup=soup, head=head, content=content, styles=styles, html_id=html_id, css=css, path=path ) diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py index c4e1b6f5b6..e64ad10545 100644 --- a/frappe/utils/print_format.py +++ b/frappe/utils/print_format.py @@ -3,6 +3,7 @@ import json import os import uuid from io import BytesIO +from typing import Literal from pypdf import PdfWriter @@ -225,7 +226,7 @@ def download_pdf( no_letterhead=0, language=None, letterhead=None, - chrome_pdf_generator=None, + pdf_generator: Literal["wkhtmltopdf", "chrome"] | None = None, ): doc = doc or frappe.get_doc(doctype, name) validate_print_permission(doc) @@ -239,7 +240,7 @@ def download_pdf( as_pdf=True, letterhead=letterhead, no_letterhead=no_letterhead, - chrome_pdf_generator=chrome_pdf_generator, + pdf_generator=pdf_generator, ) frappe.local.response.filename = "{name}.pdf".format(name=name.replace(" ", "-").replace("/", "-")) diff --git a/frappe/www/printview.py b/frappe/www/printview.py index 9b56ababd4..62515e482a 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -99,7 +99,7 @@ def get_context(context) -> PrintContext: "print_format": getattr(print_format, "name", None), "letterhead": letterhead, "no_letterhead": frappe.form_dict.no_letterhead, - "chrome_pdf_generator": frappe.form_dict.get("chrome_pdf_generator", False), + "pdf_generator": frappe.form_dict.get("pdf_generator", "wkhtmltopdf"), }