contentpanel - Aushangworkflow um docx Vorlage erweitern
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env python3
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from docx_template import fill_template
|
||||
from ollama_client import ContentMismatchError, OllamaError, transform
|
||||
from pdf_text import PdfTextError, extract_text, run
|
||||
from betteroffice_render import render
|
||||
|
||||
|
||||
def _date_label(raw: str) -> str:
|
||||
date = datetime.strptime(raw, "%Y-%m-%d")
|
||||
months = ("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli",
|
||||
"August", "September", "Oktober", "November", "Dezember")
|
||||
return f"{date.day:02d}. {months[date.month - 1]} {date.year:04d}"
|
||||
|
||||
|
||||
def _args() -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(description="PDF-Aushang in NAK-DOCX-Template überführen und rendern")
|
||||
parser.add_argument("--mode", choices=("original", "template"), default="template")
|
||||
parser.add_argument("--pdf", required=True, type=Path)
|
||||
parser.add_argument("--template", required=True, type=Path)
|
||||
parser.add_argument("--output-dir", required=True, type=Path)
|
||||
parser.add_argument("--base-name", required=True)
|
||||
parser.add_argument("--date", required=True)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main() -> int:
|
||||
args = _args()
|
||||
if not args.pdf.is_file() or (args.mode == "template" and not args.template.is_file()):
|
||||
raise RuntimeError("PDF oder DOCX-Vorlage fehlt.")
|
||||
if not args.base_name or any(ch in args.base_name for ch in "/\\\0"):
|
||||
raise RuntimeError("Ungültiger Ausgabename.")
|
||||
|
||||
args.output_dir.mkdir(parents=True, exist_ok=True)
|
||||
with tempfile.TemporaryDirectory(prefix="contentpanel_") as temp:
|
||||
render_dir = Path(temp) / "render"
|
||||
render_dir.mkdir()
|
||||
result = {"ok": True, "ocr_pages": []}
|
||||
if args.mode == "original":
|
||||
run(["gs", "-dSAFER", "-dBATCH", "-dNOPAUSE", "-sDEVICE=png16m", "-r300",
|
||||
f"-sOutputFile={render_dir}/page-%d.png", str(args.pdf)], timeout=540)
|
||||
count = len(list(render_dir.glob("page-*.png")))
|
||||
if not count:
|
||||
raise RuntimeError("Ghostscript hat keine Seiten erzeugt.")
|
||||
else:
|
||||
extraction = extract_text(args.pdf, max_pages=int(os.getenv("CONTENTPANEL_MAX_INPUT_PAGES", "10")))
|
||||
content = transform(extraction.text)
|
||||
document = Path(temp) / "aushang.docx"
|
||||
fill_template(args.template, document, content.title, _date_label(args.date), content.paragraphs)
|
||||
count = render(document, render_dir)
|
||||
result.update(title=content.title, source_pages=extraction.page_count, ocr_pages=extraction.ocr_pages)
|
||||
for number in range(1, count + 1):
|
||||
shutil.copy2(render_dir / f"page-{number}.png", args.output_dir / f"{args.base_name}_page_{number}.png")
|
||||
print(json.dumps({**result, "pages": count}, ensure_ascii=False))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
raise SystemExit(main())
|
||||
except Exception as exc:
|
||||
print(f"contentpanel-aushang: {exc}", file=sys.stderr)
|
||||
# Stable exit codes expose safe, actionable messages through PHP.
|
||||
raise SystemExit(2 if isinstance(exc, ContentMismatchError) else
|
||||
3 if isinstance(exc, OllamaError) else 4 if isinstance(exc, PdfTextError) else 1)
|
||||
Reference in New Issue
Block a user