# PDF OCR Hotfolder Verwandelt eingehende gescannte PDFs automatisch in **durchsuchbare PDFs** (PDF/A optional) per OCR. Hauptanwendung: Kunden-Scanner schiebt PDF in einen Ordner β€” Sekunden spΓ€ter liegt die OCR-Version im Ausgang oder wird in Nextcloud / per SFTP weitergeleitet. ## Features - πŸ” **OCR via ocrmypdf + Tesseract** (Library-Call, kein Subprozess-Overhead) - πŸ“‚ **Hotfolder via watchdog** β€” reagiert auf `created`, `moved`, `closed` Events - 🧠 **StabilitΓ€ts-Erkennung**: wartet bis Scanner fertig geschrieben hat - πŸ” **Parallelverarbeitung** mehrerer PDFs (ThreadPool, konfigurierbar) - βœ… **PDF/A-Output** (1, 2 oder 3) optional - πŸ›‘οΈ **veraPDF-Validierung** optional - ☁️ **Upload-Ziele**: lokaler Ordner, Nextcloud (WebDAV via Python), SFTP - πŸ“§ **E-Mail-Notify** (immer / nur Fehler / nie) - πŸ” **Service-User-Support** fΓΌr lokale **und AD-User mit lokaler UID** (SSSD/Winbind) - βš™οΈ Saubere systemd-Integration mit auto-Restart ## Schnellstart ```bash git clone https://gitea.sonith.de/sonith_ug/pdf-ocr-hotfolder.git cd pdf-ocr-hotfolder sudo ./install.sh ``` Der Installer: 1. Installiert einmalig Code + venv + systemd-Template-Unit 2. Fragt nach Instanz-Name, Basis-Pfad, Service-User 3. Legt so viele Hotfolder-Instanzen an, wie du willst (`Weitere Instanz anlegen? [j/N]`) Bei jedem erneuten Aufruf erkennt der Installer bestehende Instanzen und fragt nur nach neuen. Test: ```bash cp irgendein-scan.pdf /var/lib/pdf-ocr-hotfolder//incoming/ journalctl -u pdf-ocr-hotfolder@ -f ``` Nach wenigen Sekunden liegt das OCR-PDF im `outgoing/`-Ordner der Instanz. ## Multi-Instanz-Betrieb Das Tool arbeitet komplett **instanzbasiert** ΓΌber eine systemd Template-Unit `pdf-ocr-hotfolder@.service`. Jede Instanz hat: - eigene Config-Datei: `/etc/pdf-ocr-hotfolder/.toml` - eigene Datenverzeichnisse: `/var/lib/pdf-ocr-hotfolder//{incoming,working,outgoing,error}/` - eigene systemd-Unit: `pdf-ocr-hotfolder@.service` - optional eigenen Service-User (via Drop-in `/etc/systemd/system/pdf-ocr-hotfolder@.service.d/user.conf`) Beispiel fΓΌr 3 Hotfolder: ```bash sudo ./install.sh # β†’ legt z.B. kunde-a, kunde-b, buchhaltung an systemctl status 'pdf-ocr-hotfolder@*' journalctl -u pdf-ocr-hotfolder@kunde-a -f ``` Manuell eine weitere Instanz anlegen geht auch β€” einfach `install.sh` erneut starten, er fragt wieder nach. ## Verzeichnisse | Pfad | Zweck | |------|-------| | `/opt/pdf-ocr-hotfolder/` | Code + venv (fΓΌr alle Instanzen gemeinsam) | | `/etc/pdf-ocr-hotfolder/.toml` | Config pro Instanz | | `/etc/systemd/system/pdf-ocr-hotfolder@.service` | systemd Template-Unit | | `/var/lib/pdf-ocr-hotfolder//incoming` | Eingang (Scanner schreibt hier rein) | | `/var/lib/pdf-ocr-hotfolder//working` | Arbeitsverzeichnis wΓ€hrend OCR | | `/var/lib/pdf-ocr-hotfolder//outgoing` | Ausgang (fertige PDFs) | | `/var/lib/pdf-ocr-hotfolder//error` | Fehlgeschlagene PDFs | | `/var/log/pdf-ocr-hotfolder/` | Logs (zusΓ€tzlich zu journald) | | `/var/backups/pdf-ocr-hotfolder/` | Update-Backups | ## Konfiguration VollstΓ€ndiges Beispiel: [`config.example.toml`](config.example.toml). Wichtigste Sektionen: ### `[ocr]` ```toml languages = "deu+eng" # Tesseract-Sprachen jobs = 4 # Threads pro PDF skip_text = true # bereits OCR-haltige Seiten ΓΌberspringen pdfa_level = "2" # "1", "2", "3" oder "" fΓΌr reines PDF deskew = true max_workers = 2 # parallele PDFs timeout = 1800 ``` ### `[upload.nextcloud]` ```toml enabled = true url = "https://cloud.example.com" username = "scanuser" password = "app-password" remote_path = "Scans/Inbox" ``` ### `[upload.sftp]` ```toml enabled = true host = "sftp.example.com" username = "scanuser" key_file = "/etc/pdf-ocr-hotfolder/sftp_key" remote_path = "/uploads" ``` ### `[notify.email]` ```toml enabled = true smtp_host = "smtp.example.com" smtp_port = 587 smtp_user = "alerts@example.com" smtp_password = "secret" from_addr = "PDF OCR " to_addrs = ["admin@example.com"] on = "errors" # always | errors | never ``` ## Service-Verwaltung ```bash # Eine bestimmte Instanz sudo systemctl status pdf-ocr-hotfolder@kunde-a sudo systemctl restart pdf-ocr-hotfolder@kunde-a journalctl -u pdf-ocr-hotfolder@kunde-a -f # Alle Instanzen sudo systemctl status 'pdf-ocr-hotfolder@*' sudo systemctl restart 'pdf-ocr-hotfolder@*' ``` ## Update ```bash cd /pfad/zum/repo git pull sudo ./update.sh ``` `update.sh`: 1. Stoppt alle laufenden Instanzen 2. Sichert den alten Code nach `/var/backups/pdf-ocr-hotfolder/` 3. Aktualisiert Code + venv + systemd-Template-Unit in `/opt/pdf-ocr-hotfolder/` 4. Startet alle zuvor laufenden Instanzen neu Config-Dateien unter `/etc/pdf-ocr-hotfolder/` werden **nie** ΓΌberschrieben. Das Repo muss bestehen bleiben β€” `update.sh` kopiert daraus. ## Manueller Lauf (One-Shot) Bestehende PDFs einer Instanz einmalig verarbeiten und beenden: ```bash sudo -u pdfocr /opt/pdf-ocr-hotfolder/venv/bin/python -m pdf_ocr_hotfolder \ --config /etc/pdf-ocr-hotfolder/kunde-a.toml --once ``` ## Troubleshooting ### Tesseract findet die Sprache nicht ```bash sudo apt install tesseract-ocr-deu tesseract-ocr-eng ``` ### "PriorOcrFoundError" ocrmypdf erkennt bereits vorhandenen OCR-Text. `skip_text = true` in der Config setzen. ### Berechtigungsprobleme bei AD-User Service-User braucht **rw** auf alle vier Verzeichnisse unter `/var/lib/pdf-ocr-hotfolder/`. Bei AD-User mit lokaler UID: ```bash sudo chown -R DOMAIN\\scanuser:DOMAIN\\scangroup /var/lib/pdf-ocr-hotfolder ``` ### veraPDF-Validierung schlΓ€gt immer fehl veraPDF binary prΓΌfen (`[verapdf].binary`). Wenn nicht zwingend gebraucht: `enabled = false`. ## Architektur ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” watchdog β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” ocrmypdf β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Scanner β”‚ ──────────────▢ β”‚ incoming/ β”‚ ─────────────▢ β”‚ working/ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ PDF-Datei β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ (Library) β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ optional veraPDF β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ outgoing/ β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β–Ό β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Nextcloud β”‚ β”‚ SFTP β”‚ β”‚ E-Mail β”‚ β”‚ (WebDAV) β”‚ β”‚ (paramiko) β”‚ β”‚ Notify β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## Lizenz MIT β€” Β© Sonith UG --- **Version:** 0.2.0 **Repo:** https://gitea.sonith.de/sonith_ug/pdf-ocr-hotfolder