PDF Library for Delphi maakt beide soorten PDF-soft masks aan vanuit Delphi. SetImageSoftMaskEx koppelt een maskerafbeelding aan een doelafbeelding en kan de /Matte-entry schrijven die pre-multiplied artwork nodig heeft. NewSoftMaskGraphicsState bouwt een alpha- of luminosity-masker op basis van vastgelegde content en geeft een graphics state terug die u toepast op daaropvolgend tekenwerk. En wanneer een consument transparantie helemaal niet kan verwerken, rendert FlattenTransparency het visuele resultaat en vervangt elke pagina daardoor
Soft masks zijn hoe PDF een verloopvervaging, een vignet, een foto die versmelt met een achtergrond, en elk ander effect uitdrukt waarbij de dekking varieert over een regio. Constante transparantie is één enkel getal in de graphics state; een soft mask is een hele functie van positie, en totdat u er één kunt aanmaken, kan een hele categorie ontwerp niet worden gereproduceerd
De twee maskertypen, en wat elk ervan uitleest
Een alphamasker haalt zijn waarden uit het alphakanaal van de maskerende content. Een luminosity-masker haalt ze uit de helderheid van de maskerende content, zodat een wit gebied volledig dekkend is en een zwart gebied volledig transparant. Luminosity is degene waar ontwerpers naar grijpen, want een grijstintenverloop schilderen is een natuurlijke manier om een vervaging te beschrijven
Form-soft-masks worden opgebouwd uit vastgelegde content, en verschillende details liggen vast in plaats van optioneel te zijn. De vastgelegde content wordt een geïsoleerde transparantiegroep in DeviceRGB, zodat het masker wordt geëvalueerd in een bekende kleurruimte. De achtergrondkleur moet daarom drie componenten hebben, passend bij die groep. De transferfunctie accepteert /Identity of een geldig functieobject, waarmee u de maskercurve kunt hervormen zonder de artwork opnieuw te schilderen
uses
PDFlibrary;
var
Lib: TPDFlib;
MaskCapture, MaskGS, PhotoID: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.LoadFromFile('brochure.pdf', '');
// Pagina 4 bevat een grijstintenverloop dat is geschilderd voor gebruik als masker
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); // vervaagt onder het masker
// ExtGState-instellingen blijven bestaan: beëindig de scope expliciet
Lib.SetGraphicsState(Lib.NewSoftMaskGraphicsState(0,
PDF_SOFT_MASK_NONE, '', ''));
Lib.SaveToFile('brochure-masked.pdf');
finally
Lib.Free;
end;
end;
Die laatste stap is geen decoratie. Graphics-state-parameters blijven bestaan totdat ze worden gewijzigd, en daarna een gewone graphics state toepassen wist geen actief soft mask. Zonder een expliciete /SMask /None erft alles wat na de gemaskeerde artwork wordt getekend het masker, wat een van de verwarrendere bugs is om visueel te diagnosticeren
Afbeeldingsmaskers en de Matte-entry
Voor maskering op afbeeldingsniveau wordt de maskerafbeelding eerst genormaliseerd naar DeviceGray, zodat een masker dat in elke kleurruimte wordt geleverd, voorspelbaar gedraagt. De optionele /Matte-entry, één tot vier componenten afhankelijk van de kleurruimte van de afbeelding, vertelt een consument dat de afbeeldingsdata pre-multiplied is tegen die kleur, wat de donkere halo voorkomt die verschijnt wanneer pre-multiplied artwork wordt gecomponeerd alsof het straight alpha was
Hier zijn twee guardrails van belang. PDF/A-1 en PDF/X-1 verbieden transparantie, en de aanroep weigert voordat enig object wordt gewijzigd, in plaats van een bestand te produceren dat later de validatie niet doorstaat. En een geslaagd soft mask vereist PDF 1.4, wat de library automatisch instelt — transparantie bestond niet vóór die versie, en een 1.3-header op een bestand met soft masks is gewoon onwaar
Herhaalde states worden hergebruikt: dezelfde vastgelegde form, hetzelfde maskertype, dezelfde achtergrond en dezelfde transferfunctie-signature leveren hetzelfde graphics-state-object op in plaats van een nieuw per aanroep. Bij een document dat honderd afbeeldingen identiek maskeert, zijn dat negenennegentig objecten die nooit worden geschreven
Waarom afvlakken, en wat afvlakken daadwerkelijk doet
Transparantie is nog steeds de meest voorkomende oorzaak van "het ziet er goed uit op het scherm en fout op de pers". Oudere RIP's, sommige regelgevende indieningssystemen en PDF/X-1a vereisen allemaal een bestand zonder enige levende transparantie
Afvlakken is hier bewust letterlijk: elke pagina in het gevraagde bereik wordt gerenderd op een gekozen DPI tegen een dekkende achtergrond, en de paginacontent en resources worden vervangen door die ene afbeelding. Omdat de renderer het uiteindelijke gecomponeerde resultaat produceert, dekt dit alles ineens — transparantiegroepen, blendmodi, soft masks, patronen en geneste forms — zonder per-constructie-benaderingslogica die fout kan gaan. De piek van het rastergeheugen blijft begrensd tot één pagina
// Vlak pagina's 1-8 af op 300 DPI op wit, en sla dan op als PDF 1.3
Lib.FlattenTransparency('1-8', 300, $FFFFFF, 0);
Lib.SaveToFile('press-ready.pdf');
De prijs is even letterlijk: de output is een afbeelding, dus tekst is niet meer selecteerbaar of doorzoekbaar en vectorranden worden hersampled op de gekozen DPI. Afvlakken is een leveringsstap, geen bewerkingsstap. Bewaar het transparante origineel en vlak een kopie af
Gedraaide pagina's, user units en de pagina-boxes
Een gedraaide pagina vergt zorg die een naïeve implementatie overslaat. Na het renderen worden de visuele breedte en hoogte teruggeschreven naar de MediaBox, wordt de user unit verwerkt in de effectieve DPI en de nieuwe paginagrootte, en worden de /Rotate-entry, de user unit en de hulp-pagina-boxes verwijderd
Dat overslaan levert een bestand op waarbij de afgevlakte afbeelding correct is, maar een viewer haar opnieuw draait, of haar schaalt met een user unit die niet meer van toepassing is. De boxes verwijderen in plaats van herberekenen is de juiste keuze, want een TrimBox die de geometrie van vóór het afvlakken beschrijft, is erger dan helemaal geen TrimBox
Annotaties en formuliervelden worden standaard in de statische afbeelding gerenderd en de interactieve objecten worden verwijderd, wat is wat een drukklaar op te leveren bestand wil. Als u de interactieve objecten in plaats daarvan behoudt, wordt de annotatiepass van de renderer uitgeschakeld, zodat niets dubbel wordt getekend
De versiecontrole die alles scant
Opslaan als PDF 1.3 vereist dat nergens nog transparantie overblijft, en de controle vóór het opslaan onderzoekt elk indirect object, niet alleen de objecten die bereikbaar zijn vanaf pagina's. Dat is strenger dan het op het eerste gezicht lijkt, en het is correct: een verweesde soft mask die door een eerdere bewerking is achtergelaten, staat nog steeds in het bestand, en een consument die objecten doorloopt in plaats van pagina's, zal die vinden
Om die downgrade haalbaar te maken, draait standaard een mark-and-sweep-pass zodra elke doelpagina met succes is vervangen, waarbij de onbereikbare objecten worden vrijgegeven. Het gevolg om rekening mee te houden, is dat identifiers voor afbeeldingen, vastgelegde pagina's en graphics states die vóór die sweep zijn verkregen, daarna mogelijk niet meer geldig zijn. Verwerf de resource-identifiers die u nodig hebt opnieuw voordat u verder bewerkt, of schakel de sweep uit en accepteer dat de versie dan niet kan worden verlaagd
Twee metgezellen maken het plaatje compleet. Vectorartwork die shadings en verlopen gebruikt in plaats van maskers wordt behandeld in vectorgraphics, shaders en verlopen, en dat is vaak de betere route wanneer het effect kan worden uitgedrukt als een shading. En als de reden dat u afvlakt een kleurvereiste is in plaats van een transparantievereiste, behoudt het conversietraject in een document herkleuren naar een andere kleurruimte levende tekst, waar afvlakken dat niet zou doen
Het aanmaken van soft masks, afvlakken en de rendering-engine erachter worden geleverd in één library voor Delphi, C++Builder en Free Pascal; de volledige functielijst staat op de PDF Library for Delphi-pagina