Ein PDF mit PDFLang auseinandernehmen
Auf dem Bildschirm sieht ein PDF aus wie ein flaches Stück, wie das Foto einer Seite. Das ist es nicht. Es ist eine Kiste voller Teile, und die meisten Fragen, die Menschen zu einer Datei stellen — druckt das sauber? fehlt etwas? — sind in Wahrheit Fragen zu einem dieser Teile.
PDFLang gibt Ihnen fünf Wege hinein. Vier sind schon da, wenn Ihr Skript startet. Den fünften zeichnen Sie selbst.
Das Dokument
Abschnitt betitelt „Das Dokument“Jedes Skript beginnt mit einer Variablen namens doc. Nichts zu öffnen, nichts
zu laden: doc ist die Datei, die gerade geprüft wird.
check "Was sehe ich hier" { print("Datei:", doc.filename) print("Seiten:", doc.page_count) print("Titel:", doc.title)}doc.title und doc.author stammen aus den Metadaten der Datei — den Angaben,
die ein PDF über sich selbst mitführt und die man auf der Seite nie sieht. Oft
sind sie leer, weil sie beim Export niemand ausgefüllt hat. Das ist eine eigene
Prüfung wert:
check "Die Datei sagt, was sie ist" { assert doc.title != "", "das PDF hat keinen Titel in den Metadaten"}doc hält außerdem drei Listen bereit: doc.pages, doc.fonts und
doc.images. Es sind gewöhnliche Listen — alles, was mit einer Liste geht, geht
auch mit ihnen.
Die Seiten
Abschnitt betitelt „Die Seiten“doc.pages gibt Ihnen die Seiten einzeln. Jede kennt ihr eigenes Format, wie
viel Farbe sie trägt und welche ihrer Boxen definiert sind.
Maße stehen in Punkt, der Einheit, in der ein PDF denkt: 72 Punkt auf das Zoll,
eine A4-Seite misst also 595 × 842. In Punkt denken müssen Sie deshalb nicht —
schreiben Sie 210mm oder 8.5in, der Vergleich funktioniert:
check "Alles A4" { doc.pages.each { |page| assert page.width > 200mm, "Seite #{page.number} ist zu schmal: #{page.width}pt" }}Beachten Sie page.number. Seiten zählen ab 1, so wie im Gespräch — die Zahl in
einer Fehlermeldung ist also die Seite, die jemand aufschlagen wird.
Dann die Boxen. Eine druckfertige Seite trägt mehrere Rechtecke, die sagen, was mit ihr zu tun ist: Die TrimBox ist die Stelle, an der die Schneidemaschine schneidet, die BleedBox der etwas größere Bereich, in dem Farbe über den Schnitt hinauslaufen muss, damit ein Millimeter Versatz keine weiße Blitzer hinterlässt. Eine Datei ohne sie kann am Bildschirm perfekt aussehen und in der Druckerei trotzdem unbrauchbar sein:
check "Bereit für den Schnitt" { doc.pages.each { |page| assert page.has_trim_box, "Seite #{page.number} hat keine TrimBox" assert page.has_bleed_box, "Seite #{page.number} hat keine BleedBox" }}Eine Seite meldet auch page.tac: wie viel Farbe an ihrer schwersten Stelle
liegt, in Prozent. Vier Farben in voller Stärke wären 400 %, das nimmt keine
Maschine an; 300 % ist eine übliche Obergrenze.
Die Schriften
Abschnitt betitelt „Die Schriften“doc.fonts listet die Schriften auf, die die Datei verwendet, und jede
beantwortet eine einzige wichtige Frage: ist sie eingebettet?
Eine eingebettete Schrift reist im PDF mit. Eine nicht eingebettete Schrift ist nur benannt, und das Gerät, das die Datei öffnet, ersetzt sie durch etwas Vorhandenes. Der Text verschwindet nicht — er ändert seine Form. Zeilen brechen anders um, eine Überschrift, die auf eine Zeile passte, braucht plötzlich zwei, und niemand merkt es, bis gedruckt ist.
check "Jede Schrift reist mit der Datei" { doc.fonts.each { |font| assert font.is_embedded, "Schrift '#{font.name}' ist nicht eingebettet" }}Die Bilder
Abschnitt betitelt „Die Bilder“doc.images liefert alle Bilder der Datei, page.images die einer bestimmten
Seite. Die Eigenschaft, die man verstanden haben sollte, ist dpi.
DPI sind Punkte je Zoll — wie viel Detail in jedem gedruckten Zoll steckt. PDFLang meldet nicht den Wert, der in den Metadaten des Bildes steht. Es meldet die effektive Auflösung: die Pixel, die das Bild tatsächlich hat, geteilt durch die Größe, in der es gedruckt wird. Ziehen Sie ein Foto mit 1000 Pixeln auf 20 Zentimeter, ist es ein niedrig aufgelöstes Bild, ganz gleich, was es über sich behauptet. Diese Zahl entscheidet, ob der Druck scharf wird.
check "Scharf genug für den Druck" { doc.images.each { |img| assert img.dpi >= 300, "Bild auf Seite #{img.page_number}: #{img.dpi} DPI, nötig sind 300" }}img.color_space ist die zweite häufig gebrauchte Eigenschaft. Offsetmaschinen
arbeiten in CMYK; ein Bild, das noch in RGB vorliegt, muss umgerechnet werden,
und die Umrechnung verschiebt Farben. Besser vor dem Plattenbelichten merken.
Die Bereiche, die Sie selbst zeichnen
Abschnitt betitelt „Die Bereiche, die Sie selbst zeichnen“Die vier bisherigen kommen mit der Datei. Der fünfte nicht: eine region ist ein Rechteck, das Sie definieren, um nach einem Teil der Seite zu fragen statt nach der ganzen.
fuss = region(0, 0, 595, 60, "Fußbereich")band = region(20mm, 250mm, 60mm, 15mm, "Warnband")Zu merken ist nur eines: wo der Ursprung liegt. In einem PDF ist 0, 0 die
linke untere Ecke der Seite, nicht die obere. Y wächst nach oben.
Regions sind das, womit sich die Regeln schreiben lassen, auf die es bei einem Auftrag wirklich ankommt. Nicht „steht der Pflichttext in dieser Datei“, sondern „steht der Pflichttext in dem Band, das dafür reserviert ist“:
check "Warnband" { band = region(0, 700, 595, 142, "Band") inhalt = text::extract_from_region(1, band) assert inhalt.contains("VERSCHREIBUNGSPFLICHTIG"), "im Band fehlt der Pflichttext"}Regions lassen sich auch vergleichen. fuss.intersects(kopf) sagt Ihnen, ob
sich zwei Bereiche überlappen — so erwischt man ein Element, das in
reservierten Platz gewandert ist. fuss.expand(5mm) und fuss.inset(3mm)
liefern eine weitere oder engere Kopie, für Toleranzen.
Wo es weitergeht
Abschnitt betitelt „Wo es weitergeht“Das Kapitel zu den Dokumenttypen listet jede Eigenschaft und Methode aller fünf auf, mit Beispielen. Es ist Nachschlagematerial — lesen Sie es, wenn Sie etwas Bestimmtes brauchen, nicht von vorn bis hinten.
Wer die fünf im Zusammenspiel an echten Aufträgen sehen will, findet das in den Rezepten und in den Beispielen.