First Upload
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
API_URL=https://www.laudenbach-gera.de/shop/print/Orders.php
|
||||
ORDER_DRUCKER=PDF24
|
||||
LABEL_DRUCKER=PDF24
|
||||
Generated
+3
@@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
Generated
+10
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.12 (PDF_EXPORT_Laudenbach)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.12 (PDF_EXPORT_Laudenbach)" />
|
||||
</component>
|
||||
</project>
|
||||
Generated
+8
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/PDF_EXPORT_Laudenbach.iml" filepath="$PROJECT_DIR$/.idea/PDF_EXPORT_Laudenbach.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
Generated
+4
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings" defaultProject="true" />
|
||||
</project>
|
||||
Binary file not shown.
Binary file not shown.
+190
@@ -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.")
|
||||
Reference in New Issue
Block a user