Lauderbach_PDF_Export/pdf_export.py

190 lines
6.2 KiB
Python

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.")