Zum Inhalt springen

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.

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.

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:

  • profile fasst die Checks zusammen und benennt das Set.
  • check ist eine Regel und wird zu einem Abschnitt des Berichts.
  • require bricht den Check ab, wenn eine Voraussetzung fehlt.
  • assert hält einen Befund fest, mit der Meldung, die Sie geschrieben haben.

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%.

Sieben Namensräume, einer je Art von Arbeit:

  • text:: — Extraktion, Normalisierung, Suche, Prüfungen, personenbezogene Daten
  • struct:: — Objekte, Metadaten, XMP, Sicherheit, Hashes
  • visual:: — Auflösung, visueller Vergleich, perzeptuelle Hashes, Qualität
  • prepress:: — Farbauftrag, Separationen, Sonderfarben, Schriften, Boxen
  • codes:: — Erkennung, Decodierung und Prüfung von Barcodes und QR-Codes
  • fix:: — Boxen, Seiten, Wasserzeichen, Zusammenführen und Teilen, Optimierung
  • data:: — Glossare, Datensätze und Nachschlagetabellen von außerhalb der Datei

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.

Terminal window
pdfl run press-ready.pdfl magazine.pdf > report.json

Der 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.

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.

DigitalOceanDank an DigitalOcean für das Hosting dieser Website.