Kompletter Umbau in einem Rutsch auf PDF als template Grundlage

This commit is contained in:
trnq1ll0 committed 2026-06-16 20:46:45 +02:00
1 parent dbe325d305
commit 169d2167e0
12 files changed
+421 -287

No files matched your search

+38 -23
View File
@@ -3,6 +3,7 @@
from pathlib import Path
from typing import Optional
import fitz # PyMuPDF
from openpyxl import load_workbook
from openpyxl.utils import column_index_from_string
@@ -96,9 +97,9 @@ def validate_template(
mapping: list[OutputMapping],
) -> ValidationResult:
"""
Validiert ein Template:
Validiert ein PDF-Template:
- Datei existiert
- Alle target_cells aus dem Mapping sind im Template vorhanden
- Alle _Field-Platzhalter (pdf_field) sind im PDF auf irgendeiner Seite vorhanden
"""
errors: list[str] = []
warnings: list[str] = []
@@ -109,37 +110,51 @@ def validate_template(
return ValidationResult(is_valid=False, errors=errors)
try:
wb = load_workbook(template_path, data_only=True)
doc = fitz.open(template_path)
except Exception as e:
errors.append(f"Template konnte nicht geöffnet werden: {e}")
errors.append(f"PDF-Template konnte nicht geöffnet werden: {e}")
return ValidationResult(is_valid=False, errors=errors)
info["sheet_names"] = wb.sheetnames
# Wir validieren gegen das erste Sheet (üblicherweise das Haupt-Template)
if not wb.sheetnames:
errors.append("Template enthält keine Sheets.")
wb.close()
if doc.page_count == 0:
errors.append("PDF-Template enthält keine Seiten.")
doc.close()
return ValidationResult(is_valid=False, errors=errors)
ws = wb[wb.sheetnames[0]]
found_count = 0
missing_fields = []
found_cells = 0
missing_cells = []
for m in mapping:
try:
cell = ws[m.target_cell]
found_cells += 1
except (ValueError, KeyError):
missing_cells.append(m.target_cell)
if m.pdf_field is None:
continue # Kein Marker erwartet
info["found_target_cells"] = found_cells
info["total_target_cells"] = len(mapping)
# Suche auf allen Seiten
found_any = False
for page_num in range(doc.page_count):
found = doc[page_num].search_for(m.pdf_field)
if found:
found_any = True
break
if missing_cells:
errors.append(f"Zielfelder nicht im Template gefunden: {', '.join(missing_cells)}")
if found_any:
found_count += 1
else:
missing_fields.append(m.source_field)
# Zähle unique pdf_fields (nicht die source_fields, da Tätigkeit doppelt vorkommt)
unique_pdf_fields = set(m.pdf_field for m in mapping if m.pdf_field is not None)
total_pages = doc.page_count
doc.close()
info["found_fields"] = found_count
info["total_fields"] = len(unique_pdf_fields)
info["page_count"] = total_pages
if missing_fields:
errors.append(
f"Platzhalter nicht im PDF-Template gefunden: {', '.join(missing_fields)}"
)
wb.close()
return ValidationResult(
is_valid=len(errors) == 0,
errors=errors,