RecolorDocument pasa un PDF entero a un único espacio de color, y RecolorPage hace lo mismo con una sola página. Ambos admiten 1 para escala de grises, 2 para RGB y 3 para CMYK, y devuelven cuántos colores se han convertido. La geometría, el texto y las imágenes se quedan exactamente donde estaban; solo cambia el color
Esta es la operación que conviene ejecutar antes de enviar trabajo a una imprenta que espera un único espacio, o cuando un documento en color debe convertirse a escala de grises sin regenerarse. La alternativa —reconstruir el documento a partir de sus datos de origen en el espacio destino— solo está disponible cuando todavía se dispone de esos datos, cosa que para cualquier documento recibido de fuera no ocurre
Qué se convierte, y en qué orden
Primero los operadores de color: los rellenos y trazos que una página establece al dibujar. Un color que ya está en el espacio destino se deja intacto, así que una página cuyos colores no necesitan cambio conserva sus bytes originales en lugar de reescribirse a valores idénticos. Esa propiedad importa más de lo que parece en un documento grande, porque los objetos no tocados permanecen intactos en el archivo
Después vienen las imágenes, y son la parte que antes faltaba. Un documento pasado a escala de grises con solo sus operadores convertidos seguía mostrando imágenes en color sobre páginas grises, lo que es peor que cualquiera de los dos extremos. Una imagen se convierte cuando porta ocho bits por componente, un espacio de color de dispositivo y o bien ninguna compresión o bien Flate simple
Las imágenes indexadas se convierten a través de su tabla de color: la paleta se convierte y cada muestra conserva el índice que ya tenía. Eso cubre las imágenes en paleta en las que suele guardarse una captura de pantalla o un gráfico, y las convierte sin importar cómo estén empaquetadas o comprimidas sus muestras, porque las muestras nunca cambian
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;
¿Por qué un JPEG se deja intacto?
Porque convertir sus colores supondría recodificarlo, y la recodificación es una operación distinta con consecuencias distintas. Una imagen JPEG o de fax conserva sus propios bytes: decodificar, convertir y recomprimir cambiaría los propios datos de la imagen, introduciría una segunda generación de artefactos con pérdida y alteraría el tamaño del archivo de formas que el llamador no pidió
Las máscaras suaves y las máscaras de plantilla se dejan intactas por un motivo distinto. Ambas se leen como cobertura y no como color, y convertir una dejaría la página mostrando la máscara como si fuera una imagen —una máscara de transparencia renderizada como ilustración en escala de grises sobre el contenido que se suponía que debía modelar—. Dejarlas no es una limitación que haya que sortear; es el resultado correcto
Los colores establecidos mediante un espacio ICCBased, Separation, Indexed o Pattern también se dejan tal cual a nivel de operador. Convertirlos sin leer su perfil cambiaría el aspecto de la página en lugar de preservarlo, y un paso de recoloreado cuya promesa es la preservación no puede empezar a adivinar perfiles
Los degradados se convierten junto con las paradas que los sostienen
Un degradado es un espacio de color más una función que produce colores en él, y convertir uno sin la otra produce sinsentido —un degradado convertido cuyas paradas se han quedado atrás se lee como un canal confundido con un nivel de gris, lo que en la página se ve como una banda del color equivocado por completo—. El espacio de color del degradado y las paradas que lo sostienen se trasladan juntos
Los degradados se encuentran vivan donde vivan: como objeto propio, escritos dentro del patrón que los pinta, o ubicados en los recursos de sombreado de una página. Esa cobertura importa porque las herramientas de diseño los distribuyen de forma distinta, y un conversor que solo manejara una colocación dejaría un documento medio convertido sin un patrón evidente en los fallos
Dos tipos se dejan deliberadamente tal cual. Un degradado construido a partir de una función muestreada o PostScript conserva su propia definición, y lo mismo ocurre con los tipos de malla, que portan sus colores en un flujo en lugar de en una función. Reescribir unos u otros es una operación distinta de convertir un color, y hacerlo en silencio dentro de un paso de recoloreado sería 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');
Dónde encaja el recoloreado antes de un envío a imprenta
Úsalo como paso de normalización, no como gestión de color. El recoloreado convierte valores entre espacios de dispositivo; no aplica un perfil ICC, no respeta una intención de renderizado ni simula una condición de imprenta. Para un trabajo que debe atenerse a una prueba contractual, el flujo orientado por perfiles es la respuesta, y el recoloreado es a lo sumo el paso que deja todo en un mismo espacio primero
Donde gana su sitio es en el problema de producción ordinario: un envío que debe estar en escala de grises y llega con un logotipo RGB, un documento interno que no debe imprimirse en color, un lote de archivos que debe estar en un único espacio antes de que un paso de preflight los acepte. Combínalo con una comprobación: las notas sobre el preflight PDF/A y PDF/UA y sobre el banco de trabajo de conformidad y firma cubren cómo ejecutar el veredicto como parte del mismo trabajo
Si el documento también necesita que se examinen sus ilustraciones vectoriales en lugar de convertirlas, el recorrido por las ilustraciones vectoriales, los sombreadores y los degradados cubre cómo se construyen esos objetos en primer lugar, lo cual es contexto útil para entender qué puede y qué no puede alcanzar un paso de recoloreado
PDFlibPas es una librería PDF nativa en Pascal para Delphi, C++Builder y Lazarus sin ningún runtime externo, así que un paso de normalización de color se ejecuta dentro de tu propio servicio en lugar de invocar un conversor externo; consulta la página del producto PDFlibPas para la API completa de procesamiento de documentos