Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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_<lang>.md` für alle 6 Sprachen angelegt; `.gitignore` für Staging freigegeben.
Expand Down Expand Up @@ -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_<lang>.md` für alle 6 Sprachen angelegt; `.gitignore` für Staging freigegeben.
Expand Down
41 changes: 41 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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 <filename>_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
```

<a id="quick-start--key-operations"></a>
<a id="schnelleinstieg--kernabläufe"></a>
## Quick start
Expand Down
41 changes: 41 additions & 0 deletions README_de.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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 <dateiname>_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
```

<a id="quick-start--key-operations"></a>
<a id="schnelleinstieg--kernabläufe"></a>
## Schnelleinstieg
Expand Down
4 changes: 4 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ keywords = [
"local-first",
"batch-ocr",
"accessibility",
"multilingual-ocr",
"document-scanner",
"offline-first",
"privacy-first",
]
classifiers = [
"Development Status :: 5 - Production/Stable",
Expand Down
25 changes: 25 additions & 0 deletions tests/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading