PDF Library for Delphi prihvaća AVIF, HEIF i JPEG XL slike kao ulaz putem AddModernImageFromFile i njegovih varijanti za tok i niz, čuvajući alfa kanal, ugrađeni ICC profil i 16-bitne kanale na putu u PDF objekt slike. Otkrivanje formata odvija se ograničenim čitanjem magičnog broja, a dekodiranje se izvodi kroz zamjenjivi backend, tako da se ništa vanjsko ne poziva za datoteku koja zapravo nije jedan od tih formata
Ovi formati stigli su u tijekove rada s dokumentima kroz telefone. iOS godinama po zadanome proizvodi HEIC, Android uređaji proizvode AVIF, a terenski tehničar koji fotografira oštećeni dio šalje sliku koju generator PDF izvještaja izgrađen 2015. uopće ne može otvoriti. Generički put fallbacka, dekodiranje kroz platformsku bitmapu, pouzdano daje 8-bitnu boju i usput gubi alfa kanal i profil boje
Što put modernih slika čuva, a što pretvorba u bitmapu gubi?
Tri stvari, a svaka ima tijek rada koji o njoj ovisi. Alfa kanal preživljava, što je važno za logotipe i izrezane proizvode postavljene preko sadržaja stranice. ICC profil preživljava, što je važno za sve što će se tiskati ili usklađivati po boji. A 16-bitni kanali preživljavaju, što je važno za medicinske i znanstvene snimke gdje 8-bitna kvantizacija uništava upravo one gradacije radi kojih je slika snimljena
Provođenje slike kroz platformsku bitmapu gubi sve tri stvari u jednom koraku, i to čini tiho: nastali PDF izgleda otprilike ispravno, i nitko to ne primijeti dok tiskar ne upita zašto je korporativna crvena pogrešna. Vrijednost opcije 8 na pozivima modernih slika zastavica je koja zajedno čuva alfa kanal, ICC i 16-bitne kanale, i ona je zadana za te pozive
Dodavanje jedne slike na stranicu
Poziv vraća identifikator slike, koji se zatim odabire i crta, ili crta i oslobađa u jednom koraku:
uses
PDFlibrary, PDFlibModernImage;
var
Lib: TPDFlib;
ImageID: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.NewDocument;
Lib.SetPageSize('A4');
Lib.NewPage;
// Options = 8 čuva alfa kanal, ICC i 16-bitne kanale
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;
Otkrivanje prethodi dekodiranju i namjerno je usko. Knjižnica čita ograničeno zaglavlje, prepoznaje oznake ISO osnovnog formata medijske datoteke koje identificiraju AVIF i HEIF, te prepoznaje i sirovi i kontejnerski potpis JPEG XL-a, a zatim obnavlja poziteljevu poziciju u toku. Nepoznat ili prerušen ulaz nikada ne dosegne vanjski kodek, čime se sprječava da se preimenovana izvršna datoteka preda dekoderu kao da je slika
Gdje se dekodiranje zapravo odvija?
Moderni formati slika veliki su, složeni kodeci, a ugradnja jednog od njih unutar PDF knjižnice bila bi neobičan dizajnerski izbor. Zadani backend dinamički učitava raspoređivi modul MagickWand unutar procesa i traži ga dokumentiranim redoslijedom: izričitom datotekom ili direktorijem koji postavite, varijablama okruženja, direktorijem izvršne datoteke i sistemskom putanjom pretrage
Aplikacije koje već isporučuju dekoder, ili koje uopće ne smiju učitati vanjski modul, umjesto toga registriraju vlastiti povratni poziv. Ugovor je malen: pročitajte ulazni tok, zapišite PNG u izlazni tok, poštujte zatraženu orijentaciju:
function MyDecoder(InStream, OutPNG: TStream;
ImageFormat: TPDFlibModernImageFormat;
ApplyOrientation: Boolean): Boolean;
begin
// Dekodirajte InStream vlastitim kodekom i zapišite PNG bajtove u OutPNG
Result := DecodeWithBundledCodec(InStream, OutPNG,
ImageFormat, ApplyOrientation);
end;
begin
RegisterModernImageDecoderBackend(MyDecoder);
// ... add images ...
ClearModernImageDecoderBackend; // povratak na zadani backend
end;
Implementacija dobiva jednu pogodnost i jedno namjerno suzdržavanje. Ako direktorij kodeka sadrži poddirektorij modules\coders, knjižnica popunjava varijable okruženja kodeka koje takav raspored zahtijeva, ali samo kada ih aplikacija domaćina već nije postavila. Aplikacija s vlastitom strategijom implementacije u vrijeme izvođenja zadržava svoju
Zašto PNG u sredini?
Premoštavanje kroz PNG u memoriji, umjesto sirovog međuspremnika piksela, izgleda kao dodatni korak, a zapravo je najjeftiniji ispravan pristup. PNG izražava sve što mora preživjeti, alfa kanal, tip boje, dubinu bita i ugrađeni ICC profil, a knjižnica već ima zreo, dobro testiran put iz PNG-a u PDF objekt slike s pravim filtrima i prostorom boja. Ponovna uporaba tog puta znači da moderni formati nasljeđuju godine rada na ispravnosti umjesto da dobiju paralelnu implementaciju
Premoštavanje se odvija u potpunosti u memoriji, pa se ne stvaraju privremene datoteke i nije potrebno čišćenje pri padu programa. Jedna komplikacija zahtijevala je izričitu obradu: neke pretvorbe odbacuju ICC profil pri promjeni formata. Backend stoga bilježi izvorni profil prije promjene formata, komprimira ga Flate metodom, gradi valjan iCCP blok s ponovno izračunatim CRC-om, i uklanja svaki sRGB blok koji bi bio u sukobu s njim. U testiranju, dekodirani AVIF zadržao je 16-bitni RGBA sa 16-bitnim alfa kanalom, a profil izdvojen iz nastalog PDF-a podudarao se s izvornim profilom bajt po bajt na 60.960 bajtova
Praktične napomene prije uključivanja u produkciji
Provjerite dostupnost pri pokretanju, a ne pri prvoj fotografiji. ModernImageCodecAvailable izvještava može li se backend koristiti, a SetModernImageCodecLibrary upućuje na izričitu datoteku ili direktorij kada vaša implementacija stavlja kodek negdje nestandardno:
Lib.SetModernImageCodecLibrary('C:\MyApp\codecs');
if Lib.ModernImageCodecAvailable = 0 then
Log('modern image input unavailable - HEIC and AVIF will be refused');
Pazite na veličinu datoteke rezultata. 16-bitna RGBA slika s ugrađenim profilom velik je PDF objekt slike, a izvještaj s četrdeset takvih bit će velik. Kada je dokument namijenjen prikazu na zaslonu, a ne tisku, smanjenje uzorkovanja prije ugradnje pravi je kompromis, a opće poluge veličine opisane su u optimizaciji veličine PDF datoteke
Naposljetku, namjerno odlučite o politici boja. Zadržavanje izvornog profila ispravno je za arhivski i tiskarski rad; pretvorba u prostor na razini cijelog dokumenta ispravna je kada mješoviti skup fotografija mora izgledati dosljedno, a put pretvorbe opisan je u promjeni boje dokumenta u drugi prostor boja. Ako trebate potvrditi što je zapravo završilo u datoteci, put inspekcije u izdvajanju teksta, slika i fontova izvještava o objektima slika koje dokument nosi
Ulaz modernih slika, upravljanje bojama i optimizacija slika dio su iste knjižnice za Delphi, C++Builder i Free Pascal; cjelokupni popis značajki nalazi se na stranici PDF Library for Delphi