PDF Library for Delphi crée les deux types de masque doux PDF depuis Delphi. SetImageSoftMaskEx attache une image de masque à une image cible et peut écrire l'entrée /Matte dont a besoin une illustration prémultipliée. NewSoftMaskGraphicsState construit un masque alpha ou de luminosité à partir d'un contenu capturé et retourne un état graphique que vous appliquez au dessin suivant. Et quand un consommateur ne peut gérer aucune transparence, FlattenTransparency rend le résultat visuel et remplace chaque page par celui-ci
Les masques doux sont la façon dont le PDF exprime un fondu en dégradé, une vignette, une photo fondue dans un arrière-plan, et tout autre effet où l'opacité varie selon la position. La transparence constante est un simple nombre dans l'état graphique ; un masque doux est une fonction entière de la position, et tant que vous ne pouvez pas en créer un, toute une catégorie de conception ne peut pas être reproduite
Les deux types de masque, et ce que chacun lit
Un masque alpha tire ses valeurs du canal alpha du contenu masquant. Un masque de luminosité les tire de la luminosité du contenu masquant, si bien qu'une zone blanche est totalement opaque et une zone noire totalement transparente. La luminosité est celle que choisissent les concepteurs, car peindre un dégradé en niveaux de gris est une façon naturelle de décrire un fondu
Les masques doux de formulaire sont construits à partir d'un contenu capturé, et plusieurs détails sont fixes plutôt qu'optionnels. Le contenu capturé devient un groupe de transparence isolé en DeviceRGB, si bien que le masque s'évalue dans un espace colorimétrique connu. La couleur de fond doit donc avoir trois composantes, correspondant à ce groupe. La fonction de transfert accepte /Identity ou un objet fonction valide, ce qui permet de remodeler la courbe du masque sans repeindre l'illustration
uses
PDFlibrary;
var
Lib: TPDFlib;
MaskCapture, MaskGS, PhotoID: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.LoadFromFile('brochure.pdf', '');
// La page 4 porte un dégradé en niveaux de gris peint pour servir de masque
MaskCapture := Lib.CapturePage(4);
MaskGS := Lib.NewSoftMaskGraphicsState(MaskCapture,
PDF_SOFT_MASK_LUMINOSITY, '0 0 0', '/Identity');
Lib.SelectPage(1);
Lib.SetGraphicsState(MaskGS);
PhotoID := Lib.AddImageFromFile('hero.jpg', 0);
Lib.SelectImage(PhotoID);
Lib.DrawImage(40, 700, 515, 260); // s'estompe sous le masque
// Les réglages ExtGState persistent : terminer la portée explicitement
Lib.SetGraphicsState(Lib.NewSoftMaskGraphicsState(0,
PDF_SOFT_MASK_NONE, '', ''));
Lib.SaveToFile('brochure-masked.pdf');
finally
Lib.Free;
end;
end;
Cette dernière étape n'est pas de la décoration. Les paramètres d'état graphique persistent jusqu'à ce qu'ils soient changés, et appliquer ensuite un état graphique ordinaire n'efface pas un masque doux actif. Sans un /SMask /None explicite, tout ce qui est dessiné après l'illustration masquée hérite du masque, ce qui compte parmi les bugs les plus déroutants à diagnostiquer visuellement
Masques d'image et l'entrée Matte
Pour le masquage au niveau de l'image, l'image de masque est d'abord normalisée en DeviceGray, si bien qu'un masque fourni dans n'importe quel espace colorimétrique se comporte de façon prévisible. L'entrée optionnelle /Matte, de une à quatre composantes selon l'espace colorimétrique de l'image, indique à un consommateur que les données de l'image sont prémultipliées par cette couleur, ce qui évite le halo sombre qui apparaît quand une illustration prémultipliée est composée comme si elle était en alpha droit
Deux garde-fous comptent ici. PDF/A-1 et PDF/X-1 interdisent la transparence, et l'appel refuse avant de modifier tout objet plutôt que de produire un fichier qui échoue à la validation plus tard. Et un masque doux réussi nécessite PDF 1.4, que la bibliothèque définit automatiquement — la transparence n'existait pas avant cette version, et un en-tête 1.3 sur un fichier contenant des masques doux serait simplement faux
Les états répétés sont réutilisés : le même formulaire capturé, type de masque, fond et signature de fonction de transfert produisent le même objet d'état graphique plutôt qu'un nouveau par appel. Sur un document qui masque cent images de façon identique, ce sont quatre-vingt-dix-neuf objets qui ne sont jamais écrits
Pourquoi aplatir, et que fait réellement l'aplatissement
La transparence reste la source la plus courante du « c'est correct à l'écran et faux sur la presse ». Les anciens RIP, certains systèmes de dépôt réglementaire et le PDF/X-1a exigent tous un fichier sans aucune transparence vivante
L'aplatissement ici est délibérément littéral : chaque page de la plage demandée est rendue à un DPI choisi sur un fond opaque, et le contenu et les ressources de la page sont remplacés par cette seule image. Comme le moteur de rendu produit le résultat composé final, cela couvre tout à la fois — groupes de transparence, modes de fusion, masques doux, motifs et formulaires imbriqués — sans aucune logique d'approximation par construction à faire faux. La mémoire de rastérisation au pic reste bornée à une seule page
// Aplatit les pages 1 à 8 à 300 DPI sur fond blanc, puis enregistre en PDF 1.3
Lib.FlattenTransparency('1-8', 300, $FFFFFF, 0);
Lib.SaveToFile('press-ready.pdf');
Le compromis est tout aussi littéral : la sortie est une image, si bien que le texte n'est plus sélectionnable ni consultable et les contours vectoriels sont rééchantillonnés au DPI choisi. L'aplatissement est une étape de livraison, pas une étape d'édition. Conservez l'original transparent et aplatissez une copie
Pages pivotées, unités utilisateur et boîtes de page
Une page pivotée nécessite un soin qu'une implémentation naïve saute. Après le rendu, la largeur et la hauteur visuelles sont réécrites dans la MediaBox, l'unité utilisateur est repliée dans le DPI effectif et la nouvelle taille de page, et l'entrée /Rotate, l'unité utilisateur et les boîtes de page auxiliaires sont supprimées
Sauter cela produit un fichier où l'image aplatie est correcte mais qu'un visualiseur repivote, ou met à l'échelle par une unité utilisateur qui ne s'applique plus. Supprimer les boîtes plutôt que de les recalculer est le bon choix, car une TrimBox décrivant la géométrie d'avant aplatissement est pire que pas de TrimBox du tout
Les annotations et les champs de formulaire sont rendus dans l'image statique par défaut et les objets interactifs retirés, ce que veut un livrable prêt pour l'impression. Si vous conservez les objets interactifs à la place, la passe d'annotation du moteur de rendu est désactivée afin que rien ne soit dessiné deux fois
La vérification de version qui balaie tout
Enregistrer en PDF 1.3 exige qu'aucune transparence ne subsiste nulle part, et la vérification pré-enregistrement examine chaque objet indirect, pas seulement ceux accessibles depuis les pages. C'est plus strict qu'il n'y paraît de prime abord et c'est correct : un masque doux orphelin laissé par une édition antérieure se trouve toujours dans le fichier, et un consommateur qui parcourt les objets plutôt que les pages le trouvera
Pour rendre la rétrogradation atteignable, une passe de marquage et balayage s'exécute par défaut une fois que chaque page cible a été remplacée avec succès, libérant les objets inaccessibles. La conséquence à anticiper est que les identifiants d'image, de page capturée et d'état graphique obtenus avant ce balayage peuvent ne plus être valides ensuite. Réacquérez les identifiants de ressource dont vous avez besoin avant de poursuivre l'édition, ou désactivez le balayage et acceptez que la version ne puisse alors pas être abaissée
Deux compléments achèvent le tableau. Les illustrations vectorielles qui utilisent des dégradés et des shadings plutôt que des masques sont traitées dans graphiques vectoriels, shaders et dégradés, et c'est souvent la meilleure voie quand l'effet peut s'exprimer comme un shading. Et si la raison pour laquelle vous aplatissez est une exigence de couleur plutôt qu'une exigence de transparence, la voie de conversion dans recolorer un document vers un autre espace colorimétrique préserve le texte vivant là où l'aplatissement ne le ferait pas
La création de masques doux, l'aplatissement et le moteur de rendu qui les sous-tend sont livrés dans une seule bibliothèque pour Delphi, C++Builder et Free Pascal ; la liste complète des fonctionnalités se trouve sur la page de PDF Library for Delphi