PDF Batch Studio verbindet einen frameworkfreien Verarbeitungskern mit einer JavaFX-Oberfläche. JavaFX besitzt einen eigenen UI-Thread. Längere PDF-Verarbeitung darf ihn nicht blockieren. Der Kern beschreibt Zustände, der Desktopadapter führt Arbeit aus und die Oberfläche zeigt Fortschritt. SQLite und Flyway speichern Projekte und Verlauf. Die aktuelle Codebasis enthält Weiterentwicklungen gegenüber der öffentlichen Release v0.1.0. Dieses Tutorial verwendet deshalb die fest verlinkte Quellversion statt still einen alten Download vorauszusetzen.
01Den festen Projektstand aufsetzen
Das Setup klont das Projekt in einen eigenen Lernordner und prüft die Desktopmodule. Verwende JDK 21. Auf einem Rechner mit grafischer Oberfläche startet ./scripts/desktop-dev.sh die App. Unter Windows gibt es scripts/desktop-dev.ps1. Verwende ausschließlich die sicheren samples-Dateien.
git clone https://github.com/wasiliy-strecker/pdf-batch-studio.git pdf-batch-studio-learning
cd pdf-batch-studio-learning
git checkout 9b85992b00f8ff20b46bff2b1ed16b59eb3869af
./mvnw -pl desktop/pdf-batch-desktop -am test
02Die Zustandsregel isoliert verstehen
Der kleine Simulator zeigt DRAFT, READY und QUEUED. Er lehnt einen Start vor der Konfiguration ab. Das echte JobStatus kennt zusätzliche Verarbeitungs-, Abbruch- und Endzustände. Eine deaktivierte Schaltfläche ergänzt die Regel, ist aber nicht ihre einzige Durchsetzung.
public class Workflow {
enum State { DRAFT, READY, QUEUED }
static final class Job {
State state = State.DRAFT;
void configure(boolean mappingValid) {
if (state != State.DRAFT || !mappingValid) throw new IllegalStateException("Cannot configure");
state = State.READY;
}
void queue() {
if (state != State.READY) throw new IllegalStateException("Not ready");
state = State.QUEUED;
}
}
public static void main(String[] args) {
var job = new Job();
try { job.queue(); throw new AssertionError("Invalid start accepted"); }
catch (IllegalStateException expected) { System.out.println(expected.getMessage()); }
job.configure(true); job.queue(); System.out.println(job.state);
}
}
Starten / prüfen
java Workflow.java03Vorlage und CSV zuordnen
Öffne samples/customer-template.pdf und samples/customers.csv. Ordne name dem PDF-Feld fullName zu und customerId dem Feld customerNumber. Nutze {customerId}-{name}.pdf als Dateinamensmuster. Die Engine prüft vorhandene Felder und Spalten, bevor READY erreicht wird.
04Vorschau und Hintergrundarbeit verfolgen
Erzeuge zunächst eine Vorschau. Danach starte den Batch und beobachte die Übergänge. Lies DesktopWorkflowService und den ViewModel-Test. Der UI-Thread zeigt Status, während der Worker Dokumente verarbeitet. Ein Abbruch wird an definierten Punkten geprüft und ist kein willkürliches Töten einer beliebigen Dateioperation.
05Projekt und Verlauf auseinanderhalten
Ein gespeichertes Projekt hält Vorlage und Konfiguration. Empfängertabellen und Zwischenergebnisse liegen nur im verwalteten Arbeitsbereich. Passwörter werden nicht gespeichert. Die lokale Datenbank und Vorlagen sind laut README nicht durch die App verschlüsselt. Prüfe nach einem Neustart, welche Informationen erhalten bleiben.
06Das Ergebnis semantisch prüfen
Für customers.csv entstehen drei Dokumente. Öffne das ZIP und prüfe eindeutige Dateinamen, Empfängerwerte und Bericht. Wiederhole mit customers-duplicate-output.csv. Gleiche Namenswerte dürfen keine Ergebnisse still überschreiben. Der Desktop-Test überprüft den Ablauf ohne einen echten Nutzervertrag.
Eine Vorschau und ein ZIP mit drei individuell befüllten PDFs. Ein gespeichertes Projekt bleibt nach erneutem Öffnen vorhanden.
- JavaFX-Entwurf
- DesktopWorkflowService
- gemeinsamer Java-Kern
- PDF/CSV-Engine
- SQLite / Ergebnis / UI-Status
Deine Übung
Prüfe eine ungültige CSV mit doppeltem Header und einen Batchabbruch zwischen Zeilen. Welche Daten sollten jeweils erhalten bleiben?
Lösung mit Erklärung anzeigen
invalid-duplicate-header.csv wird bereits bei der Inspektion abgewiesen und darf nicht READY werden. Ein Abbruch behält einen nachvollziehbaren Endzustand und darf kein scheinbar vollständiges Ergebnis melden. Gespeicherte Projektkonfiguration und temporäre Empfängerdaten haben unterschiedliche Aufbewahrungsregeln. Prüfe diese im Workflow- und Repository-Test.
Projektbezug und Quellen
Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.