RecolorDocument sposta un intero PDF in un unico spazio colore, e RecolorPage fa lo stesso per una singola pagina. Entrambi prendono 1 per scala di grigi, 2 per RGB e 3 per CMYK, e restituiscono quanti colori sono stati convertiti. Geometria, testo e immagini restano esattamente dove erano; cambia solo il colore
Questa è l'operazione che vuoi eseguire prima di inviare un lavoro a una stampa che si aspetta un unico spazio, o quando un documento a colori deve diventare in scala di grigi senza essere rigenerato. L'alternativa — ricostruire il documento dai suoi dati sorgente nello spazio target — è disponibile solo quando hai ancora i dati sorgente, il che per qualsiasi cosa ricevuta dall'esterno non accade
Cosa viene convertito, e in quale ordine
Prima gli operatori di colore: i riempimenti e i tratti che una pagina imposta mentre disegna. Un colore già nello spazio target viene lasciato così, quindi una pagina i cui colori non hanno bisogno di modifiche conserva i propri byte originali invece di essere riscritta a valori identici. Quella proprietà conta più di quanto sembri su un documento grande, perché gli oggetti non toccati restano non toccati nel file
Poi vengono le immagini, ed è la parte che prima mancava. Un documento reso in scala di grigi con solo i suoi operatori convertiti mostrava ancora immagini a colori su pagine in grigio, il che è peggiore di entrambi gli estremi. Un'immagine viene convertita quando porta otto bit per componente, uno spazio colore device e nessuna compressione o solo Flate semplice
Le immagini indicizzate vengono convertite attraverso la loro tabella dei colori: la tabella viene convertita e ogni campione conserva l'indice che già aveva. Questo copre le immagini con tabella in cui uno screenshot o un grafico vengono di solito salvati, e le converte qualunque siano i campioni impacchettati o compressi, perché i campioni non cambiano mai
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;
Perché un JPEG viene lasciato così com'è?
Perché convertirne i colori significherebbe ricodificarlo, e la ricodifica è un'operazione diversa con conseguenze diverse. Un'immagine JPEG o fax conserva i propri byte: decodifica, conversione e ricompressione cambierebbero i dati dell'immagine stessa, introdurrebbero una seconda generazione di artefatti lossy e cambierebbero la dimensione del file in modi che il chiamante non ha richiesto
Le soft mask e le stencil mask vengono lasciate stare per un motivo diverso. Entrambe vengono lette come copertura piuttosto che come colore, e convertirne una lascerebbe la pagina mostrare la mask come un'immagine — una mask di trasparenza renderizzata come artwork in scala di grigi sopra il contenuto che avrebbe dovuto modellare. Lasciarle non è un limite da aggirare; è il risultato corretto
I colori impostati attraverso uno spazio ICCBased, Separation, Indexed o Pattern restano anche così al livello degli operatori. Convertirli senza leggere il loro profilo cambierebbe come appare la pagina invece di preservarla, e un passaggio di ricolorizzazione la cui intera promessa è la preservazione non può mettersi a indovinare i profili
I gradienti si convertono con i fermi dietro di loro
Un gradiente è uno spazio colore più una funzione che produce colori in esso, e convertirne uno senza l'altra produce nonsenso — un gradiente convertito i cui fermi sono stati lasciati indietro si legge come un canale scambiato per un livello di grigio, il che su una pagina appare come una banda del colore sbagliato del tutto. Lo spazio colore del gradiente e i fermi dietro di esso si muovono insieme
I gradienti vengono trovati ovunque vivano: come oggetto a sé stante, scritti dentro il pattern che li dipinge, o presenti nelle risorse di shading di una pagina. Questa copertura conta perché gli strumenti di design li distribuiscono in modi diversi, e un convertitore che gestisse solo una collocazione lascerebbe un documento mezzo convertito senza un pattern ovvio nei fallimenti
Due tipi vengono deliberatamente lasciati così come sono. Un gradiente costruito da una funzione campionata o PostScript conserva la propria definizione, e così i tipi mesh, che portano i propri colori in uno stream piuttosto che in una funzione. Riscrivere gli uni o gli altri è un'operazione diversa dalla conversione di un colore, e farlo silenziosamente dentro un passaggio di ricolorizzazione sarebbe una sorpresa
// 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');
Dove si inserisce la ricolorizzazione prima di una spedizione alla stampa
Usala come passo di normalizzazione, non come gestione del colore. La ricolorizzazione converte valori tra spazi device; non applica un profilo ICC, non onora un rendering intent e non simula una condizione di stampa. Per un lavoro che deve soddisfare una stampa contrattuale, il flusso guidato dal profilo è la risposta e la ricolorizzazione è al massimo il passo che porta tutto in un unico spazio per primo
Dove guadagna il suo posto è nel problema di produzione ordinario: una spedizione che deve essere in scala di grigi e arriva con un logo RGB, un documento interno che non deve essere stampato a colori, un batch di file che deve essere in un unico spazio prima che un passo di preflight li accetti. Abbinalo a un controllo — le note su preflight PDF/A e PDF/UA e sulla workbench di conformità e firma coprono l'esecuzione del verdetto come parte dello stesso lavoro
Se il documento ha bisogno anche che la propria grafica vettoriale sia esaminata anziché convertita, la guida sulla grafica vettoriale, shader e gradienti copre come quegli oggetti vengono costruiti in primo luogo, il che è un contesto utile per capire cosa un passaggio di ricolorizzazione può e non può raggiungere
PDFlibPas è una libreria PDF nativa in Pascal per Delphi, C++Builder e Lazarus senza alcun runtime esterno, quindi un passo di normalizzazione del colore gira dentro il tuo servizio invece di affidarsi a un convertitore esterno — vedi la pagina prodotto PDFlibPas per l'API completa di elaborazione dei documenti