RecolorDocument überführt ein ganzes PDF in einen einzigen Farbraum, und RecolorPage tut dasselbe für eine einzelne Seite. Beide nehmen 1 für Graustufen, 2 für RGB und 3 für CMYK entgegen und geben zurück, wie viele Farben umgewandelt wurden. Geometrie, Text und Bilder bleiben exakt an ihrem Platz; nur die Farbe ändert sich
Das ist der Vorgang, den man vor dem Versand an eine Druckmaschine möchte, die einen einzigen Raum erwartet, oder wenn ein Farbdokument zu einem Graustufen-Dokument werden muss, ohne neu erzeugt zu werden. Die Alternative — das Dokument aus seinen Quelldaten im Zielraum neu aufbauen — steht nur zur Verfügung, solange man die Quelldaten noch hat, was bei allem, was von außen hereinkommt, nicht der Fall ist
Was umgewandelt wird, und in welcher Reihenfolge
Zuerst die Farboperatoren: die Füllungen und Striche, die eine Seite während des Zeichnens setzt. Eine Farbe, die bereits im Zielraum liegt, bleibt unangetastet, sodass eine Seite, deren Farben keine Änderung brauchen, ihre ursprünglichen Bytes behält statt auf identische Werte neu geschrieben zu werden. Diese Eigenschaft ist bei einem großen Dokument wichtiger, als sie klingt, weil unangetastete Objekte unangetastet in der Datei bleiben
Darauf folgen die Bilder, und sie sind der Teil, der früher fehlte. Ein Dokument, das nur in seinen Operatoren auf Graustufen umgestellt wurde, zeigte auf grauen Seiten weiterhin farbige Bilder — was schlimmer ist als jeder der beiden Extreme. Ein Bild wird umgewandelt, wenn es acht Bits pro Komponente trägt, einen Geräte-Farbraum und entweder keine Komprimierung oder schlichtes Flate aufweist
Indizierte Bilder werden über ihre Farbtabelle umgewandelt: Die Palette wird umgewandelt, und jede Abtastung behält den Index, den sie ohnehin schon hielt. Das deckt die Palettenbilder ab, als die ein Screenshot oder ein Diagramm üblicherweise gespeichert werden, und zwar unabhängig davon, wie ihre Abtastungen gepackt oder komprimiert sind, denn die Abtastungen ändern sich nie
var
Lib: TPDFlib;
Converted: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.LoadFromFile('brochure.pdf', '');
Converted := Lib.RecolorDocument(1); // 1 grey, 2 RGB, 3 CMYK
Log(Format('%d colours converted', [Converted]));
Lib.SaveToFile('brochure-grey.pdf');
finally
Lib.Free;
end;
end;
Warum bleibt ein JPEG unangetastet?
Weil das Umwandeln seiner Farben bedeutete, ihn neu zu kodieren, und Neukodieren ein anderer Vorgang mit anderen Folgen ist. Ein JPEG- oder Fax-Bild behält seine eigenen Bytes: Dekodieren, Umwandeln und Rekomprimieren würde die Bilddaten selbst verändern, eine zweite Generation verlustbehafteter Artefakte einführen und die Dateigröße in einer Weise ändern, die der Aufrufer nicht verlangt hat
Soft-Masken und Schablonen-Masken bleiben aus einem anderen Grund unangetastet. Beide werden als Abdeckung gelesen statt als Farbe, und eine davon umzuwandeln hätte zur Folge, dass die Seite die Maske als Bild zeigt — eine Transparenz-Maske, gerendert als graue Grafik über dem Inhalt, den sie eigentlich formen sollte. Sie zu belassen ist keine Einschränkung, die man umgehen muss; es ist das korrekte Ergebnis
Farben, die über einen ICCBased-, Separation-, Indexed- oder Pattern-Raum gesetzt wurden, bleiben ebenfalls auf Operatorebene, wie sie stehen. Sie ohne das Lesen ihres Profils umzuwandeln, würde ändern, wie die Seite aussieht, statt dies zu bewahren, und eine Umfärbung, deren ganzes Versprechen die Bewahrung ist, kann nicht anfangen, Profile zu erraten
Verläufe werden gemeinsam mit ihren Stops umgewandelt
Ein Verlauf ist ein Farbraum plus einer Funktion, die Farben in ihm erzeugt, und das eine ohne das andere umzuwandeln ergibt Unsinn — ein umgewandelter Verlauf, dessen Stops zurückgelassen wurden, liest sich als ein Kanal, der fälschlich für eine Graustufe gehalten wird, was auf einer Seite wie ein Band gänzlich falscher Farbe aussieht. Der Farbraum des Verlaufs und die Stops dahinter wandern gemeinsam
Verläufe werden überall gefunden, wo sie sich befinden: als eigenes Objekt gegeben, innerhalb des Pattern geschrieben, das sie malt, oder in den Shading-Ressourcen einer Seite sitzend. Diese Abdeckung ist wichtig, weil Design-Werkzeuge sie unterschiedlich verteilen, und ein Konverter, der nur eine Platzierung behandelte, würde ein Dokument halb umgewandelt zurücklassen, ohne ein klares Muster in den Ausfällen
Zwei Arten werden bewusst so belassen, wie sie sind. Ein Verlauf, der aus einer Sampled- oder PostScript-Funktion aufgebaut ist, behält seine eigene Definition, und dasselbe gilt für die Mesh-Typen, die ihre Farben in einem Stream statt in einer Funktion tragen. Beide umzuschreiben ist ein anderer Vorgang als das Umwandeln einer Farbe, und es stillschweigend innerhalb eines Umfärbungsdurchlaufs zu tun wäre eine Überraschung
// Convert a single page - useful when only the cover needs to change
Lib.SelectPage(1);
Lib.RecolorPage(3); // this page to CMYK
Lib.SaveToFile('cover-cmyk.pdf');
Wo Umfärben vor einer Druck-Einreichung hingehört
Als Normalisierungs-Schritt einsetzen, nicht als Farbmanagement. Umfärben wandelt Werte zwischen Geräte-Räumen um; es wendet kein ICC-Profil an, berücksichtigt keinen Rendering Intent und simuliert keine Druckbedingung. Für einen Auftrag, der einen verbindlichen Proof treffen muss, ist der profilgetriebene Workflow die Antwort, und Umfärben ist höchstens der Schritt, der zuvor alles in einen Raum bringt
Seinen Platz verdient es bei dem gewöhnlichen Produktionsproblem: einer Einreichung, die graustufen sein muss und mit einem RGB-Logo ankommt, einem internen Dokument, das nicht in Farbe drucken darf, einem Schwung Dateien, die in einem einzigen Raum vorliegen müssen, bevor ein Preflight-Schritt sie annimmt. Mit einer Prüfung kombinieren — die Hinweise zu PDF/A- und PDF/UA-Preflight und zur Compliance- und Signatur-Workbench behandeln, wie man das Urteil als Teil desselben Auftrags laufen lässt
Wenn das Dokument zusätzlich eine Untersuchung seiner Vektor-Grafik statt einer Umwandlung braucht, behandelt die Erläuterung zu Vektor-Grafik, Shadern und Verläufen, wie diese Objekte überhaupt erst aufgebaut sind — nützlicher Kontext, um zu verstehen, was ein Umfärbungsdurchlauf erreichen kann und was nicht
PDFlibPas ist eine native Pascal-PDF-Bibliothek für Delphi, C++Builder und Lazarus ohne externe Laufzeit, sodass ein Farbraum-Normalisierungs-Schritt innerhalb des eigenen Dienstes läuft statt einen externen Konverter aufzurufen — siehe die PDFlibPas-Produktseite für die vollständige Dokument-Verarbeitungs-API