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