diff --git a/jdav_web/members/pdf.py b/jdav_web/members/pdf.py index 83d74f9..851d79c 100644 --- a/jdav_web/members/pdf.py +++ b/jdav_web/members/pdf.py @@ -5,7 +5,7 @@ import subprocess import time import glob from io import BytesIO -from pypdf import PdfReader, PdfWriter +from pypdf import PdfReader, PdfWriter, PageObject from django import template from django.template.loader import get_template from django.conf import settings @@ -73,6 +73,30 @@ def render_tex(name, template_path, context, save_only=False): return serve_pdf(filename_pdf) +def scale_pdf_page_to_a4(page): + A4_WIDTH, A4_HEIGHT = 595, 842 + + page_width = page.mediabox.width + page_height = page.mediabox.height + scale_x = A4_WIDTH / page_width + scale_y = A4_HEIGHT / page_height + scale_factor = min(scale_x, scale_y) + + new_page = PageObject.create_blank_page(width=A4_WIDTH, height=A4_HEIGHT) + page.scale_by(scale_factor) + x_offset = (A4_WIDTH - page.mediabox.width) / 2 + y_offset = (A4_HEIGHT - page.mediabox.height) / 2 + new_page.merge_translated_page(page, x_offset, y_offset) + + return new_page + +def scale_pdf_to_a4(pdf): + scaled_pdf = PdfWriter() + for page in pdf.pages: + scaled_pdf.add_page(scale_pdf_page_to_a4(page)) + + return scaled_pdf + def fill_pdf_form(name, template_path, fields, attachments=[], save_only=False): filename = normalize_filename(name) filename_pdf = filename + '.pdf' @@ -96,9 +120,12 @@ def fill_pdf_form(name, template_path, fields, attachments=[], save_only=False): else: # convert ensures that png files with an alpha channel can be appended img = Image.open(fp).convert("RGB") - img_pdf = BytesIO() - img.save(img_pdf, "pdf") - writer.append(img_pdf) + img_io = BytesIO() + img.save(img_io, "pdf") + img_io.seek(0) + img_pdf = PdfReader(img_io) + img_pdf_scaled = scale_pdf_to_a4(img_pdf) + writer.append(img_pdf_scaled) except Exception as e: print("Could not add image", fp) print(e)