Technischer Artikel

Ein PDF in Delphi in einen einheitlichen Farbraum umwandeln

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