From 4c1952d76f84bf71a94217a85ea49d3b5ed7022a Mon Sep 17 00:00:00 2001 From: magicfelix <felix@felix-zauberer.de> Date: Tue, 28 Jan 2025 17:55:17 +0100 Subject: [PATCH] Fix PDF rendering by using Firefox instead of Chromium --- Dockerfile | 2 -- aleksis/core/util/pdf.py | 36 +++++++++++++++++------------------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index 38dec3ced..11475ede4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,8 +30,6 @@ RUN apt-get -y update && \ eatmydata apt-get -y upgrade && \ eatmydata apt-get install -y --no-install-recommends \ build-essential \ - chromium \ - chromium-driver \ curl \ dumb-init \ gettext \ diff --git a/aleksis/core/util/pdf.py b/aleksis/core/util/pdf.py index 1a6062201..21fe87b48 100644 --- a/aleksis/core/util/pdf.py +++ b/aleksis/core/util/pdf.py @@ -28,34 +28,32 @@ from aleksis.core.util.celery_progress import recorded_task, render_progress_pag from aleksis.core.util.core_helpers import has_person, process_custom_context_processors -def _generate_pdf_with_chromium(temp_dir, pdf_path, html_url, lang): +def _generate_pdf_with_webdriver(temp_dir, pdf_path, html_url, lang): """Generate a PDF file from a HTML file.""" - chrome_options = webdriver.ChromeOptions() - chrome_options.add_argument("--kiosk-printing") - chrome_options.add_argument("--headless") - chrome_options.add_argument("--no-sandbox") - chrome_options.add_argument("--disable-gpu") - chrome_options.add_argument("--disable-dev-shm-usage") - chrome_options.add_argument("--disable-setuid-sandbox") - chrome_options.add_argument("--dbus-stub") - chrome_options.add_argument("--temp-profile") - chrome_options.add_argument(f"--lang={lang}") - - driver = webdriver.Chrome(options=chrome_options) + driver_options = webdriver.FirefoxOptions() + driver_options.add_argument("--kiosk-printing") + driver_options.add_argument("--headless") + driver_options.add_argument("--no-sandbox") + driver_options.add_argument("--disable-gpu") + driver_options.add_argument("--disable-dev-shm-usage") + driver_options.add_argument("--disable-setuid-sandbox") + driver_options.add_argument("--dbus-stub") + driver_options.add_argument("--temp-profile") + driver_options.add_argument(f"--lang={lang}") + + driver = webdriver.Firefox(options=driver_options) driver.get(html_url) - pdf = driver.execute_cdp_cmd( - "Page.printToPDF", {"printBackground": True, "preferCSSPageSize": True} - ) + pdf = driver.print_page() driver.close() with open(pdf_path, "wb") as f: - f.write(base64.b64decode(pdf["data"])) + f.write(base64.b64decode(pdf)) @recorded_task def generate_pdf( file_pk: int, html_url: str, recorder: ProgressRecorder, lang: Optional[str] = None ): - """Generate a PDF file by rendering the HTML code using a headless Chromium.""" + """Generate a PDF file by rendering the HTML code using a headless Firefox.""" file_object = get_object_or_404(PDFFile, pk=file_pk) recorder.set_progress(0, 1) @@ -65,7 +63,7 @@ def generate_pdf( pdf_path = os.path.join(temp_dir, "print.pdf") lang = lang or get_language() - _generate_pdf_with_chromium(temp_dir, pdf_path, html_url, lang) + _generate_pdf_with_webdriver(temp_dir, pdf_path, html_url, lang) # Upload PDF file to media storage with open(pdf_path, "rb") as f: -- GitLab