commit 4aca9f9e58abe89033affb758ec141f60eabd423 Author: Sebastian Serfling Date: Fri Apr 25 10:51:55 2025 +0200 First Upload diff --git a/.env b/.env new file mode 100644 index 0000000..46321b0 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +API_URL=https://www.laudenbach-gera.de/shop/print/Orders.php +ORDER_DRUCKER=PDF24 +LABEL_DRUCKER=PDF24 \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/PDF_EXPORT_Laudenbach.iml b/.idea/PDF_EXPORT_Laudenbach.iml new file mode 100644 index 0000000..2c4cacc --- /dev/null +++ b/.idea/PDF_EXPORT_Laudenbach.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a764ada --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9304642 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..d843f34 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/original/original_2025-04-25_10-50-18.pdf b/original/original_2025-04-25_10-50-18.pdf new file mode 100644 index 0000000..3efe37e Binary files /dev/null and b/original/original_2025-04-25_10-50-18.pdf differ diff --git a/original/original_2025-04-25_10-51-06.pdf b/original/original_2025-04-25_10-51-06.pdf new file mode 100644 index 0000000..0a4537f Binary files /dev/null and b/original/original_2025-04-25_10-51-06.pdf differ diff --git a/pdf_export.py b/pdf_export.py new file mode 100644 index 0000000..92d3b32 --- /dev/null +++ b/pdf_export.py @@ -0,0 +1,190 @@ +import os +import requests +from dotenv import load_dotenv +from datetime import datetime +import fitz # PyMuPDF +import win32print +import win32ui +from PIL import Image, ImageWin +import tempfile +import time + +# .env laden +load_dotenv() + +# .ENV Import +url = os.getenv('API_URL') +label_printer = os.getenv('LABEL_DRUCKER') # Name des Labels-Druckers +order_printer = os.getenv('ORDER_DRUCKER') # Name des Order-Druckers + +# Zeitstempel für die Dateien +timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + +# Pfad der Dateien +original_storage_path = "./original" +order_storage_path = "./orders" +label_storage_path = "./label" + +# Verzeichnisse erstellen +os.makedirs(original_storage_path, exist_ok=True) +os.makedirs(order_storage_path, exist_ok=True) +os.makedirs(label_storage_path, exist_ok=True) + +# PDF von der API herunterladen +if url: + response = requests.get(url) + if response.status_code == 200: + file_name = f'{original_storage_path}/original_{timestamp}.pdf' + with open(file_name, 'wb') as file: + file.write(response.content) + print(f'PDF erfolgreich heruntergeladen: "{file_name}"') + else: + print(f'Fehler beim Herunterladen. Statuscode: {response.status_code}') + exit(1) +else: + print('API-URL nicht in .env gefunden.') + exit(1) + +# Dokument verarbeiten +doc = fitz.open(f'{original_storage_path}/original_{timestamp}.pdf') + +label_sections = {} +current_label = None +start_page = None +order_end_page = None + +markers = { + "########## DHL LABELS ##########": "DHL", + "########## DPD LABELS ##########": "DPD", + "########## UPS LABELS ##########": "UPS" +} + +# Dokument in Abschnitte teilen +for page_number in range(len(doc)): + page = doc.load_page(page_number) + text = page.get_text() + + found_label = None + for marker_text, label_name in markers.items(): + if marker_text in text: + found_label = label_name + break + + if found_label: + if current_label is None: + order_end_page = page_number - 1 + + if current_label is not None and start_page is not None: + section_doc = fitz.open() + section_doc.insert_pdf(doc, from_page=start_page, to_page=page_number - 1) + label_sections.setdefault(current_label, []).append(section_doc) + + current_label = found_label + start_page = page_number + 1 + +# Letzten Abschnitt speichern +if current_label is not None and start_page is not None and start_page < len(doc): + section_doc = fitz.open() + section_doc.insert_pdf(doc, from_page=start_page, to_page=len(doc) - 1) + label_sections.setdefault(current_label, []).append(section_doc) + +# Bestellung speichern +if order_end_page is not None and order_end_page >= 0: + order_doc = fitz.open() + order_doc.insert_pdf(doc, from_page=0, to_page=order_end_page) + order_filename = f"{order_storage_path}/order_{timestamp}.pdf" + order_doc.save(order_filename) + print(f"Bestellung gespeichert als {order_filename}") + +# Labels speichern +for label, docs in label_sections.items(): + for idx, pdf in enumerate(docs, start=1): + filename = f"{label_storage_path}/{label}_label_{idx}_{timestamp}.pdf" + pdf.save(filename) + print(f"{label} Label gespeichert als {filename}") + + +# Verbesserte Druckfunktion mit reinen Python-Mitteln +def print_pdf(file_path, printer_name): + if not os.path.exists(file_path): + print(f'Datei nicht gefunden: {file_path}') + return False + + try: + # Drucker initialisieren + hprinter = win32print.OpenPrinter(printer_name) + hdc = win32ui.CreateDC() + hdc.CreatePrinterDC(printer_name) + hdc.StartDoc(file_path) + + # PDF öffnen + pdf_document = fitz.open(file_path) + + # Druckereinstellungen für korrekte Skalierung + printer_size = hdc.GetDeviceCaps(8), hdc.GetDeviceCaps(10) # Horizontale/Vertikale Größe in Pixel + printer_margins = (0, 0) # Keine Ränder + + for page_number in range(len(pdf_document)): + page = pdf_document.load_page(page_number) + + # Höhere Qualität für Labels + zoom = 3.0 # Erhöhter Zoom für bessere Qualität + mat = fitz.Matrix(zoom, zoom) + pix = page.get_pixmap(matrix=mat, alpha=False) + + # Bild vorbereiten + image = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) + dib = ImageWin.Dib(image) + + # Skalierung berechnen, um das ganze Bild einzupassen + scale_x = printer_size[0] / pix.width + scale_y = printer_size[1] / pix.height + scale = min(scale_x, scale_y) + + # Zentrierte Positionierung + x_pos = int((printer_size[0] - (pix.width * scale)) // 2) + y_pos = int((printer_size[1] - (pix.height * scale)) // 2) + width = int(pix.width * scale) + height = int(pix.height * scale) + + # Seite drucken + hdc.StartPage() + try: + dib.draw(hdc.GetHandleOutput(), + (x_pos, y_pos, x_pos + width, y_pos + height)) + except Exception as draw_error: + print(f"Zeichenfehler: {draw_error}") + # Fallback: Einfache Skalierung + dib.draw(hdc.GetHandleOutput(), (0, 0, printer_size[0], printer_size[1])) + hdc.EndPage() + + hdc.EndDoc() + hdc.DeleteDC() + win32print.ClosePrinter(hprinter) + print(f"Erfolgreich gedruckt: {file_path}") + return True + + except Exception as e: + print(f"Fehler beim Drucken von {file_path}: {str(e)}") + import traceback + traceback.print_exc() + return False + +# Druckvorgang +print("\nStarte Druckvorgang:") + +# Labels drucken +for label in label_sections: + for idx, pdf in enumerate(label_sections[label], start=1): + label_filename = f"{label_storage_path}/{label}_label_{idx}_{timestamp}.pdf" + print(f"\nDrucke {label} Label {idx}...") + print_pdf(label_filename, label_printer) + time.sleep(1) # Kurze Pause zwischen den Druckaufträgen + +# Bestellung drucken +if order_end_page is not None: + print("\nDrucke Bestellung...") + order_filename = f"{order_storage_path}/order_{timestamp}.pdf" + print_pdf(order_filename, order_printer) + +print("\nDruckvorgang abgeschlossen.") \ No newline at end of file