Article technique

Convertir un PDF vers un Espace de Couleur Unique en Delphi

RecolorDocument déplace un PDF entier vers un espace de couleur unique, et RecolorPage fait de même pour une page unique. Les deux prennent 1 pour gris, 2 pour RGB et 3 pour CMYK, et renvoient le nombre de couleurs converties. La géométrie, le texte et les images restent exactement où ils étaient ; seule la couleur change

C'est l'opération que vous voulez avant d'envoyer du travail à une presse qui attend un espace unique, ou quand un document en couleur doit devenir un document en gris sans être régénéré. L alternative — reconstruire le document à partir de ses données source dans l'espace cible — n'est disponible que lorsque vous avez encore les données source, ce qui pour tout ce qui est reçu de l'extérieur n'est pas le cas

Ce qui est converti, et dans quel ordre

Les opérateurs de couleur en premier : les remplissages et les contours qu'une page définit en dessinant. Une couleur déjà dans l'espace cible est laissée tranquille, donc une page dont les couleurs n'ont pas besoin de changement conserve ses octets originaux plutôt que d'être réécrite vers des valeurs identiques. Cette propriété compte plus qu'il n'y paraît sur un grand document, car les objets non touchés restent non touchés dans le fichier

Les images viennent ensuite, et c'est la partie qui manquait autrefois. Un document passé au gris avec seulement ses opérateurs convertis affichait encore des images en couleur sur des pages grises, ce qui est pire que chacun des extrêmes. Une image est convertie lorsqu'elle porte huit bits par composante, un espace de couleur périphérique, et soit aucune compression soit Flate simple

Les images indexées se convertissent via leur table des couleurs : la palette est convertie et chaque échantillon conserve l'index qu'il détenait déjà. Cela couvre les images à palette sous lesquelles une capture d'écran ou un graphique est habituellement enregistré, et cela les convertit quel que soit ce avec quoi leurs échantillons sont empaquetés ou compressés, car les échantillons ne changent jamais

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;

Pourquoi un JPEG est-il laissé tranquille ?

Parce que convertir ses couleurs signifierait le ré-encoder, et le ré-encodage est une opération différente avec des conséquences différentes. Une image JPEG ou fax conserve ses propres octets : décoder, convertir et recomprimer changerait les données d'image elles-mêmes, introduirait une seconde génération d'artefacts avec perte, et changerait la taille du fichier de façons que l'appelant n'a pas demandées

Les masques logiciels et les masques pochoir sont laissés tranquilles pour une raison différente. Les deux sont lus comme couverture plutôt que comme couleur, et en convertir un laisserait la page afficher le masque comme une image — un masque de transparence rendu comme artwork gris par-dessus le contenu qu'il était censé façonner. Les laisser n'est pas une limitation à contourner ; c'est le résultat correct

Les couleurs définies via un espace ICCBased, Separation, Indexed ou Pattern sont également laissées en l'état au niveau des opérateurs. Les convertir sans lire leur profil changerait l'apparence de la page plutôt que de la préserver, et une passe de recoloration dont toute la promesse est la préservation ne peut pas se mettre à deviner les profils

Les dégradés se convertissent avec les arrêts derrière eux

Un dégradé est un espace de couleur plus une fonction qui produit des couleurs dedans, et convertir l'un sans l'autre produit du non-sens — un dégradé converti dont les arrêts ont été laissés derrière se lit comme un canal confondu avec un niveau de gris, ce qui sur une page ressemble à une bande de la mauvaise couleur entièrement. L espace de couleur du dégradé et les arrêts derrière lui se déplacent ensemble

Les dégradés sont trouvés partout où ils vivent : dotés d'un objet propre, écrits à l'intérieur du motif qui les peint, ou assis dans les ressources de dégradé d'une page. Cette couverture compte car les outils de conception les distribuent différemment, et un convertisseur qui ne gérerait qu'un placement laisserait un document à moitié converti sans motif évident dans les échecs

Deux types sont délibérément laissés en l'état. Un dégradé construit depuis une fonction échantillonnée ou PostScript conserve sa propre définition, et de même pour les types maillés, qui portent leurs couleurs dans un flux plutôt que dans une fonction. Réécrire l'un ou l'autre est une opération différente de la conversion d'une couleur, et le faire silencieusement à l'intérieur d'une passe de recoloration serait une surprise

// 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');

Où la recoloration s'intègre avant une soumission à la presse

Utilisez-la comme étape de normalisation, pas comme gestion de la couleur. La recoloration convertit des valeurs entre espaces périphériques ; elle n'applique pas de profil ICC, ne respecte pas d'intention de rendu et ne simule pas de condition de presse. Pour un travail qui doit atteindre une épreuve contractuelle, le flux piloté par profil est la réponse et la recoloration est au plus l'étape qui met tout dans un seul espace d'abord

Là où elle gagne sa place, c'est dans le problème de production ordinaire : une soumission qui doit être grise et arrive avec un logo RGB, un document interne qui ne doit pas être imprimé en couleur, un lot de fichiers qui doit être dans un seul espace avant qu'une étape de préflight ne les accepte. Associez-la à un contrôle — les notes sur le préflight PDF/A et PDF/UA et sur le banc d'essai de conformité et signature couvrent l'exécution du verdict comme partie du même travail

Si le document a aussi besoin que son artwork vectoriel soit examiné plutôt que converti, la visite guidée de graphiques vectoriels, shaders et dégradés couvre comment ces objets sont construits à l'origine, ce qui est un contexte utile pour comprendre ce qu'une passe de recoloration peut et ne peut pas atteindre

PDFlibPas est une bibliothèque PDF native en Pascal pour Delphi, C++Builder et Lazarus sans aucun moteur externe, donc une étape de normalisation des couleurs s'exécute à l'intérieur de votre propre service plutôt que de déléguer à un convertisseur — voir la page produit PDFlibPas pour l'API complète de traitement de document