Was ist die Sprache PDFLang?
PDFLang ist eine Skriptsprache mit genau einer Aufgabe: festzuhalten, wie ein korrektes PDF aussieht, damit eine Maschine Dateien dagegen prüfen kann.
Skripte tragen die Endung .pdfl. Ausgeführt werden sie von pdfl, einem in
Rust geschriebenen Kommandozeilenwerkzeug.
Das Problem, das sie löst
Abschnitt betitelt „Das Problem, das sie löst“Irgendjemand muss entscheiden, ob ein PDF in den Druck gehen, eingereicht oder an Kundschaft geschickt werden darf.
Die Regeln hinter dieser Entscheidung sind konkret. Farbauftrag unter 300 %. Alle Schriften eingebettet. Auf jeder Seite eine Trimbox. Der Barcode passend zu der daneben gedruckten Nummer. Keine versehentlich gedrehte Seite.
Diese Regeln liegen meist an drei Orten gleichzeitig: im Kopf der Person, die den Job am längsten macht, in einer Checkliste, die niemand öffnet, und in einem Skript, das nur die Autorin oder der Autor pflegen kann. Dann geht diese Person, die Checkliste veraltet, und das Skript wird unantastbar.
PDFLang gibt es, damit die Regeln in einer einzigen Datei stehen, die die Person, die sie kennt, auch lesen kann.
Wie ein Skript aussieht
Abschnitt betitelt „Wie ein Skript aussieht“profile "press-ready" {
check "Farbauftrag im Limit" tags: ["prepress"] { require prepress::validate_tac_limits(300) }
check "Schriften eingebettet" { doc.fonts.each { |font| assert font.is_embedded, "Schrift #{font.name} ist nicht eingebettet" } }}Vier Wörter tragen den größten Teil der Sprache:
profilefasst die Checks zusammen und benennt das Set.checkist eine Regel und wird zu einem Abschnitt des Berichts.requirebricht den Check ab, wenn eine Voraussetzung fehlt.asserthält einen Befund fest, mit der Meldung, die Sie geschrieben haben.
Warum sie sich so liest
Abschnitt betitelt „Warum sie sich so liest“Keine Klassen, keine Vererbung, keine Typdeklarationen, keine Semikolons. Das ist eine Entscheidung und kein Versäumnis: Die gemeinte Leserschaft kennt die Druckvorstufe, nicht die Programmierung.
Dieselbe Absicht zeigt sich im Kleinen. Seiten zählen ab 1, so wie alle
außerhalb eines Compilers zählen. Maße nehmen 3mm und 1in direkt an.
Prozentwerte schreibt man 300%.
Was sie prüfen kann
Abschnitt betitelt „Was sie prüfen kann“Sieben Namensräume, einer je Art von Arbeit:
text::— Extraktion, Normalisierung, Suche, Prüfungen, personenbezogene Datenstruct::— Objekte, Metadaten, XMP, Sicherheit, Hashesvisual::— Auflösung, visueller Vergleich, perzeptuelle Hashes, Qualitätprepress::— Farbauftrag, Separationen, Sonderfarben, Schriften, Boxencodes::— Erkennung, Decodierung und Prüfung von Barcodes und QR-Codesfix::— Boxen, Seiten, Wasserzeichen, Zusammenführen und Teilen, Optimierungdata::— Glossare, Datensätze und Nachschlagetabellen von außerhalb der Datei
Was zurückkommt
Abschnitt betitelt „Was zurückkommt“Ein Bericht. Gekürzt sieht ein fehlgeschlagener Check so aus:
{ "script_name": "prepress.pdfl", "input_file": "magazine.pdf", "status": "FAIL", "error_count": 2, "diagnostics": [ { "id": "PDFL-093751a2", "severity": "error", "check_name": "Ink coverage", "message": "page 7: 324% ink (limit 300%)" } ]}Sehen Sie sich diese message an. Sie ist kein Stacktrace, sondern ein Satz,
den jemand an die Lieferantin weiterleiten kann, die die Datei geschickt hat —
und genau deshalb lässt die Sprache Sie ihn selbst schreiben, direkt neben der
zugehörigen Regel.
JSON ist die Vorgabe. CSV, HTML und PDF gibt es für Menschen, die den Bericht lesen statt parsen müssen, und SARIF und JUnit für den Fall, dass der Befund dort landen soll, wo das Team ohnehin hinschaut.
In einer Pipeline ausführen
Abschnitt betitelt „In einer Pipeline ausführen“pdfl run press-ready.pdfl magazine.pdf > report.jsonDer Exit-Code trägt das Urteil, ein Shell-Skript oder ein CI-Job verzweigt darauf, ohne irgendetwas zu parsen:
| Code | Bedeutung |
|---|---|
0 |
alles bestanden |
1 |
nur Warnungen |
2 |
Validierungsfehler |
3 |
Syntaxfehler im Skript |
10 |
das Dokument war gar nicht lesbar |
Das Werkzeug spricht Englisch, Ihre Skripte müssen es nicht
Abschnitt betitelt „Das Werkzeug spricht Englisch, Ihre Skripte müssen es nicht“Die Meldungen, die pdfl selbst ausgibt — Diagnosen, Fehler, Hilfe auf der
Kommandozeile — sind auf Englisch, wie bei Kommandozeilenwerkzeugen üblich.
Diese Dokumentation ist in sieben Sprachen übersetzt, ein fehlgeschlagener Check
meldet aber weiterhin page 7: 324% ink (limit 300%).
Die Meldungen in Ihren eigenen Skripten gehören Ihnen. Schreiben Sie sie in der Sprache der Person, die den Bericht liest.
Wo anfangen
Abschnitt betitelt „Wo anfangen“Das Sprachhandbuch ist das eine Kapitel, das sich von vorn bis hinten zu lesen lohnt. Alles danach ist Referenz: ein Kapitel je Namensraum, die CLI-Befehle und die Rezepte, gebaut um vollständige Fälle — eine Druckerei, ein juristischer Verlag, ein Labor, eine CI-Pipeline.
Wer lieber Code liest als Prosa: die Beispiele sind lauffähige Profile samt ihren Kommentaren.