PDF Library for Delphi tar imot AVIF-, HEIF- og JPEG XL-bilder som inndata gjennom AddModernImageFromFile og dens strøm- og strengvarianter, og bevarer alfa, den innebygde ICC-profilen og 16-bit kanaler på vei inn i PDF-bildeobjektet. Formatdeteksjon skjer på en avgrenset lesing av magiske tall, og dekoding kjøres gjennom en utskiftbar backend, så ingenting eksternt kalles for en fil som faktisk ikke er ett av de formatene
Disse formatene kom inn i dokumentarbeidsflyter gjennom telefoner. iOS har produsert HEIC som standard i årevis, Android-enheter produserer AVIF, og en feltteknikker som fotograferer en skadet del, sender et bilde en PDF-rapportgenerator bygget i 2015 ikke kan åpne i det hele tatt. Den generiske reservebanen, å dekode gjennom et plattform-bitmap, gir pålitelig 8-bit farge og mister alfa og fargeprofilen underveis
Hva bevarer den moderne bildebanen som en bitmap-konvertering mister?
Tre ting, og hver har en arbeidsflyt som avhenger av den. Alfa overlever, noe som betyr noe for logoer og produktutklipp komponert over sideinnhold. ICC-profilen overlever, noe som betyr noe for alt som skal trykkes eller fargematches. Og 16-bit kanaler overlever, noe som betyr noe for medisinske og vitenskapelige bilder der 8-bit kvantisering ødelegger nettopp de gradasjonene bildet ble fanget for
Å føre et bilde gjennom et plattform-bitmap mister alle tre i ett steg, og det skjer stille: den resulterende PDF-en ser omtrent riktig ut, og ingen legger merke til det før en trykkeri spør hvorfor den bedriftsrøde fargen er feil. Alternativverdi 8 på de moderne bildekallene er flagget som holder alfa, ICC og 16-bit kanaler sammen, og det er standarden for de kallene
Legge til ett på en side
Kallet returnerer en bilde-ID, som deretter velges og tegnes, eller tegnes og frigjøres i ett steg:
uses
PDFlibrary, PDFlibModernImage;
var
Lib: TPDFlib;
ImageID: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.NewDocument;
Lib.SetPageSize('A4');
Lib.NewPage;
// Options = 8 beholder alfa, ICC og 16-bit kanaler
ImageID := Lib.AddModernImageFromFile('site-photo.heic', 8);
if ImageID > 0 then
Lib.DrawImageAndRelease(ImageID, 40, 40, 515, 340)
else
Lib.DrawText(40, 40, 'image could not be decoded');
Lib.SaveToFile('inspection-report.pdf');
finally
Lib.Free;
end;
end;
Deteksjon går forut for dekoding og er bevisst smal. Biblioteket leser en avgrenset header, gjenkjenner ISO-basismediefilformat-merkene som identifiserer AVIF og HEIF, og gjenkjenner både rå- og beholdersignaturene til JPEG XL, og gjenoppretter deretter den kallende partens strømposisjon. Et ukjent eller forkledd inndata når aldri den eksterne kodeken, noe som hindrer en omdøpt kjørbar fil fra å bli overlevert til en dekoder som om den var et bilde
Hvor skjer dekodingen egentlig?
Moderne bildeformater er store, komplekse kodeker, og å legge én inni et PDF-bibliotek ville vært et rart designvalg. Standard-backenden laster dynamisk inn en distribuerbar MagickWand-modul in-process og ser etter den i en dokumentert rekkefølge: en eksplisitt fil eller katalog du setter, miljøvariabler, den kjørbare katalogen, og systemets søkesti
Applikasjoner som allerede leverer en dekoder, eller som ikke må laste inn noen ekstern modul i det hele tatt, registrerer sitt eget tilbakekall i stedet. Kontrakten er liten: les inndatastrømmen, skriv en PNG til utdatastrømmen, respekter den forespurte orienteringen:
function MyDecoder(InStream, OutPNG: TStream;
ImageFormat: TPDFlibModernImageFormat;
ApplyOrientation: Boolean): Boolean;
begin
// Dekod InStream med din egen kodek og skriv PNG-byte til OutPNG
Result := DecodeWithBundledCodec(InStream, OutPNG,
ImageFormat, ApplyOrientation);
end;
begin
RegisterModernImageDecoderBackend(MyDecoder);
// ... legg til bilder ...
ClearModernImageDecoderBackend; // tilbake til standard-backenden
end;
Distribusjon får én bekvemmelighet og én bevisst tilbakeholdenhet. Hvis kodek-katalogen inneholder en modules\coders-underkatalog, fyller biblioteket inn kodek-miljøvariablene et slikt oppsett trenger, men bare når vertsapplikasjonen ikke allerede har satt dem. En applikasjon med sin egen kjøretidsdistribusjonsstrategi beholder den
Hvorfor PNG i midten?
Å bygge bro gjennom en PNG i minnet snarere enn en rå pikselbuffer ser ut som et ekstra steg og er faktisk det billigste korrekte. PNG uttrykker alt som må overleve, alfa, fargetype, bitdybde og en innebygd ICC-profil, og biblioteket har allerede en moden, godt testet bane fra PNG inn i et PDF-bildeobjekt med riktige filtre og fargerom. Å gjenbruke den betyr at moderne formater arver år med korrekthetsarbeid i stedet for å få en parallell implementasjon
Broen er helt i minnet, så ingen midlertidige filer opprettes, og ingen opprydding trengs ved en krasj. Én detalj trengte eksplisitt håndtering: enkelte konverteringer dropper ICC-profilen ved formatbytte. Backenden fanger derfor kildeprofilen før formatbyttet, komprimerer den med Flate, bygger en gyldig iCCP-blokk med en omregnet CRC, og fjerner enhver sRGB-blokk som ville komme i konflikt med den. I testing beholdt en dekodet AVIF 16-bit RGBA med 16-bit alfa, og profilen hentet ut fra den resulterende PDF-en matchet kildeprofilen byte for byte ved 60 960 byte
Praktiske merknader før du aktiverer det i produksjon
Sjekk tilgjengelighet ved oppstart snarere enn ved det første fotografiet. ModernImageCodecAvailable rapporterer om en backend kan brukes, og SetModernImageCodecLibrary peker på en eksplisitt fil eller katalog når distribusjonen din plasserer kodeken et ikke-standard sted:
Lib.SetModernImageCodecLibrary('C:\MyApp\codecs');
if Lib.ModernImageCodecAvailable = 0 then
Log('modern image input unavailable - HEIC and AVIF will be refused');
Følg med på filstørrelsen til resultatet. Et 16-bit RGBA-bilde med en innebygd profil er et stort PDF-bildeobjekt, og en rapport med førti av dem blir stor. Når dokumentet er ment for skjermvisning snarere enn trykk, er nedsampling før innebygging det riktige valget, og de generelle størrelsesspakene er dekket i optimalisering av PDF-filstørrelse
Til slutt, avgjør fargepolicy bevisst. Å beholde kildeprofilen er korrekt for arkivering og trykkarbeid; å konvertere til et dokumentomfattende fargerom er korrekt når et blandet sett med fotografier må se konsistent ut, og konverteringsruten er beskrevet i omfarging av et dokument til et annet fargerom. Hvis du trenger å bekrefte hva som faktisk havnet i filen, rapporterer inspeksjonsbanen i uthenting av tekst, bilder og fonter hvilke bildeobjekter et dokument bærer
Moderne bildeinndata, fargestyring og bildeoptimalisering er del av det samme biblioteket for Delphi, C++Builder og Free Pascal; den komplette funksjonslisten finnes på PDF Library for Delphi-siden