diff --git a/CHANGELOG.md b/CHANGELOG.md index ce56402..41bf697 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/). ## [Unreleased] +### Pfad B: Repository-Discoverability, zweisprachige README-Architektur, Badges & Sequenzdiagramme (2026-11-08) +- **Zweisprachige Mermaid-Sequenzdiagramme**: Asynchroner Verarbeitungslebenszyklus (`QThread` Worker, Poppler-Seitenrasterisierung, Bildnormalisierung, Tesseract OCR-Textextraktion und pikepdf Volltext-PDF-Assembly) in Abschnitt `Local data flow` / `Lokaler Datenfluss` von `README.md` und `README_de.md` integriert; Mermaid-Syntax mit `_tools/lint_mermaid.py` validiert (0 Syntaxfehler). +- **Badges & Verifikations-Transparenz**: Verifiziertes Test-Badge auf 180 bestandene Tests aktualisiert, Code-Stil-Badge (`Ruff`) und Local-First Verarbeitungs-Badge (`processing: local-first`) in beiden Sprachausgaben ergänzt. +- **PEP 621 SEO-Keywords**: `pyproject.toml` um `multilingual-ocr`, `document-scanner`, `offline-first` und `privacy-first` erweitert. +- **Vertragstests**: `tests/test_metadata.py` um `test_readme_sequence_diagram_and_badges_parity` zur dauerhaften Absicherung von Diagramm- und Badge-Parität erweitert. + ### Tier-2 Mehrsprachigkeits- und Store-Harmonisierung (TW-PDF-05..10) (2026-11-07) - **Store-Packaging & Manifest-Harmonisierung (TW-PDF-05)**: `store_package.json` um alle 6 Tier-2 Sprachen (`de-DE`, `en-US`, `es-ES`, `zh-CN`, `ja-JP`, `ru-RU`) mit Kurzbeschreibungen (<= 100 Zeichen) und exakt 7 Richtlinien-konformen Keywords je Sprache (<= 30 Zeichen, keine Marken) nach Microsoft Partner Center Policy 10.1.3 erweitert. - **6-Sprachen Store-Listing & Staging (TW-PDF-06)**: `STORE_LISTING.md` um vollständige Abschnitte für `## Español`, `## 简体中文`, `## 日本語` und `## Русский` erweitert; Staging-Verzeichnis `releases/windowsstore/` mit `store_settings.json`, `BUILD.md`, `WACK_PROTOCOL.md`, `StoreLogo.png` und `store_listing_.md` für alle 6 Sprachen angelegt; `.gitignore` für Staging freigegeben. @@ -155,6 +161,12 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/). ## [Unreleased] +### Pfad B: Repository-Discoverability, zweisprachige README-Architektur, Badges & Sequenzdiagramme (2026-11-08) +- **Zweisprachige Mermaid-Sequenzdiagramme**: Asynchroner Verarbeitungslebenszyklus (`QThread` Worker, Poppler-Seitenrasterisierung, Bildnormalisierung, Tesseract OCR-Textextraktion und pikepdf Volltext-PDF-Assembly) in Abschnitt `Local data flow` / `Lokaler Datenfluss` von `README.md` und `README_de.md` integriert; Mermaid-Syntax mit `_tools/lint_mermaid.py` validiert (0 Syntaxfehler). +- **Badges & Verifikations-Transparenz**: Verifiziertes Test-Badge auf 180 bestandene Tests aktualisiert, Code-Stil-Badge (`Ruff`) und Local-First Verarbeitungs-Badge (`processing: local-first`) in beiden Sprachausgaben ergänzt. +- **PEP 621 SEO-Keywords**: `pyproject.toml` um `multilingual-ocr`, `document-scanner`, `offline-first` und `privacy-first` erweitert. +- **Vertragstests**: `tests/test_metadata.py` um `test_readme_sequence_diagram_and_badges_parity` zur dauerhaften Absicherung von Diagramm- und Badge-Parität erweitert. + ### Tier-2 Mehrsprachigkeits- und Store-Harmonisierung (TW-PDF-05..10) (2026-11-07) - **Store-Packaging & Manifest-Harmonisierung (TW-PDF-05)**: `store_package.json` um alle 6 Tier-2 Sprachen (`de-DE`, `en-US`, `es-ES`, `zh-CN`, `ja-JP`, `ru-RU`) mit Kurzbeschreibungen (<= 100 Zeichen) und exakt 7 Richtlinien-konformen Keywords je Sprache (<= 30 Zeichen, keine Marken) nach Microsoft Partner Center Policy 10.1.3 erweitert. - **6-Sprachen Store-Listing & Staging (TW-PDF-06)**: `STORE_LISTING.md` um vollständige Abschnitte für `## Español`, `## 简体中文`, `## 日本語` und `## Русский` erweitert; Staging-Verzeichnis `releases/windowsstore/` mit `store_settings.json`, `BUILD.md`, `WACK_PROTOCOL.md`, `StoreLogo.png` und `store_listing_.md` für alle 6 Sprachen angelegt; `.gitignore` für Staging freigegeben. diff --git a/README.md b/README.md index a3ea3b6..ba50ffa 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ [![Version 1.1.4](https://img.shields.io/badge/version-1.1.4-blue.svg)](pyproject.toml) [![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![Platforms](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey.svg)](#requirements--platform-matrix) +[![Tests: 180 passed](https://img.shields.io/badge/tests-180%20passed-brightgreen.svg)](#tests--quality-verification) +[![Code Style: Ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff) +[![Local-First](https://img.shields.io/badge/processing-local--first-success.svg)](#local-data-flow--privacy-isolation) PDFtoPDFocr is a desktop application that turns scanned PDFs and image files into searchable PDFs using Tesseract OCR. It supports batch input, selectable OCR languages, and preservation of the original files. @@ -69,6 +72,44 @@ The detailed component and workflow views are in the [archived guide](README-arc PDF processing uses local tools. The source includes a GitHub request to obtain missing Tesseract language data. This describes the application path; it does not establish a system-wide network restriction. See [`SECURITY.md`](SECURITY.md) for the project’s security contact and scope. +```mermaid +sequenceDiagram + autonumber + actor User as User / Batch Operator + participant GUI as PySide6 Desktop GUI + participant Worker as Background Worker Thread + participant Normalizer as Image Normalizer + participant Poppler as Poppler / pdf2image + participant Tesseract as Tesseract OCR Engine + participant Assembler as pikepdf PDF Assembler + participant FS as Local Filesystem Boundary + + User->>GUI: Add PDF or Image Files (Drag & Drop / File Dialog) + User->>GUI: Select Target OCR Language (e.g. deu, eng, fra, spa) + User->>GUI: Trigger Batch Conversion (Ctrl+Return or Button) + GUI->>Worker: Launch asynchronous conversion task + loop For Each Document in Queue + alt Input is Scanned PDF + Worker->>Poppler: Rasterize PDF pages into memory bitmaps + Poppler-->>Worker: High-resolution rendered page buffers + else Input is Direct Image (PNG, JPG, multi-frame TIFF) + Worker->>Normalizer: Alpha-composite transparency onto white background + Normalizer-->>Worker: Standardized RGB image frames + end + loop For Each Page / Frame + Worker->>Tesseract: Extract text and bounding boxes via local engine + Tesseract-->>Worker: Return OCR text and hOCR / PDF layers + end + Worker->>Assembler: Inject searchable full-text layer into PDF structure + Assembler->>FS: Save output as _ocred.pdf (Non-destructive) + Worker-->>GUI: Update progress bar and color-coded status badge + end + opt Portable Job Manifest Export + GUI->>FS: Write pdftopdfocr-job-v1.json (job settings and file metadata) + end + Note over User,FS: Local OCR/PDF processing - missing language data request may use GitHub +``` + ## Quick start diff --git a/README_de.md b/README_de.md index 83e1f8d..f14df0a 100644 --- a/README_de.md +++ b/README_de.md @@ -8,6 +8,9 @@ [![Version 1.1.4](https://img.shields.io/badge/version-1.1.4-blue.svg)](pyproject.toml) [![MIT-Lizenz](https://img.shields.io/badge/lizenz-MIT-green.svg)](LICENSE) [![Plattformen](https://img.shields.io/badge/plattform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey.svg)](#voraussetzungen--plattformmatrix) +[![Tests: 180 bestanden](https://img.shields.io/badge/tests-180%20bestanden-brightgreen.svg)](#tests--qualitätsprüfung) +[![Code-Stil: Ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff) +[![Lokal-Zuerst](https://img.shields.io/badge/verarbeitung-lokal--zuerst-success.svg)](#lokaler-datenfluss--datenschutz-isolation) PDFtoPDFocr ist eine Desktop-Anwendung, die gescannte PDFs und Bilddateien mit Tesseract-OCR in durchsuchbare PDFs umwandelt. Sie unterstützt Stapelverarbeitung, wählbare OCR-Sprachen und den Erhalt der Quelldateien. @@ -69,6 +72,44 @@ Die ausführlichen Komponenten- und Ablaufansichten stehen in der [archivierten Die PDF-Verarbeitung verwendet lokale Werkzeuge. Der Quellcode enthält eine GitHub-Anfrage zum Abruf fehlender Tesseract-Sprachdaten. Das beschreibt den Anwendungspfad, keine systemweite Netzwerksperre. Kontakt und Geltungsbereich der Sicherheitsrichtlinie stehen in [`SECURITY.md`](SECURITY.md). +```mermaid +sequenceDiagram + autonumber + actor Nutzer as Nutzer / Stapel-Bediener + participant GUI as PySide6 Desktop-GUI + participant Worker as Hintergrund-Worker-Thread + participant Normalizer as Bild-Normalisierer + participant Poppler as Poppler / pdf2image + participant Tesseract as Tesseract-OCR-Engine + participant Assembler as pikepdf PDF-Assembler + participant FS as Lokales Dateisystem + + Nutzer->>GUI: PDF- oder Bilddateien hinzufügen (Drag & Drop / Dateidialog) + Nutzer->>GUI: Ziel-OCR-Sprache wählen (z. B. deu, eng, fra, spa) + Nutzer->>GUI: Stapelverarbeitung starten (Strg+Eingabe oder Schaltfläche) + GUI->>Worker: Asynchronen Konvertierungs-Task starten + loop Für jedes Dokument in der Warteschlange + alt Eingabe ist gescanntes PDF + Worker->>Poppler: PDF-Seiten in Speicher-Bitmaps rasterisieren + Poppler-->>Worker: Hochauflösende gerenderte Seitenpuffer + else Eingabe ist Direktbild (PNG, JPG, Multiframe-TIFF) + Worker->>Normalizer: Alpha-Transparenz auf weißem Hintergrund zusammenführen + Normalizer-->>Worker: Standardisierte RGB-Bildframes + end + loop Für jede Seite / jeden Frame + Worker->>Tesseract: Text und Bounding Boxes über lokale Engine extrahieren + Tesseract-->>Worker: OCR-Text und hOCR / PDF-Ebenen zurückliefern + end + Worker->>Assembler: Durchsuchbare Volltextebene in PDF-Struktur einfügen + Assembler->>FS: Ausgabe als _ocred.pdf speichern (Zerstörungsfrei) + Worker-->>GUI: Fortschrittsbalken und farbcodierten Status aktualisieren + end + opt Portabler Jobmanifest-Export + GUI->>FS: pdftopdfocr-job-v1.json schreiben (Jobeinstellungen und Metadaten) + end + Note over Nutzer,FS: Lokale OCR/PDF-Verarbeitung - fehlende Sprachdaten können von GitHub geladen werden +``` + ## Schnelleinstieg diff --git a/pyproject.toml b/pyproject.toml index e3aa92f..cbf5514 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,10 @@ keywords = [ "local-first", "batch-ocr", "accessibility", + "multilingual-ocr", + "document-scanner", + "offline-first", + "privacy-first", ] classifiers = [ "Development Status :: 5 - Production/Stable", diff --git a/tests/test_metadata.py b/tests/test_metadata.py index e541820..89afdbf 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -392,3 +392,28 @@ def test_no_tracked_files_ignored_by_gitignore() -> None: if res.returncode == 0: ignored_tracked.append(rel_path) assert not ignored_tracked, f"Tracked files match .gitignore patterns: {ignored_tracked}" + + +def test_readme_sequence_diagram_and_badges_parity() -> None: + """Verifies that both README.md and README_de.md include the lifecycle sequence diagram and verified badges.""" + readme_en = (ROOT / "README.md").read_text(encoding="utf-8") + readme_de = (ROOT / "README_de.md").read_text(encoding="utf-8") + + for readme in (readme_en, readme_de): + assert "sequenceDiagram" in readme + assert "autonumber" in readme + assert "Poppler" in readme + assert "Tesseract" in readme + assert "pikepdf" in readme + assert "pdftopdfocr-job-v1.json" in readme + + # Badge parity + assert "badge/tests-180%20passed-brightgreen.svg" in readme_en + assert "badge/tests-180%20bestanden-brightgreen.svg" in readme_de + assert "badge/processing-local--first-success.svg" in readme_en + assert "badge/verarbeitung-lokal--zuerst-success.svg" in readme_de + + # Extended SEO keywords + pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8") + for kw in ("multilingual-ocr", "document-scanner", "offline-first", "privacy-first"): + assert f'"{kw}"' in pyproject