Loaded Image Extraction
Extrakce načtených obrázků umožňuje aplikacím po otevření existujícího PDF přes LoadFromFile nebo LoadFromStream enumerovat image XObjects, inspektovat jejich metadata a dekódovat podporované obrázky do instancí TBitmap
Hlavní API
GetLoadedImageCountvrací počet enumerovatelných obrazových objektů v načteném dokumentuGetLoadedImageInfonaplníTHPDFLoadedImageInfometadaty čísla objektu, indexu stránky, velikosti, bitové hloubky, barevného prostoru, seznamu filtrů a dekódovatelnosti, bez dekódování pixelůExtractLoadedImagedekóduje vybraný obrázek do novéhoTBitmap; vrácenou bitmapu vlastní volajícíGetLoadedImageCountPerPageomezí enumeraci na jednu načtenou stránku
Podporované zdroje
- Datové filtry zahrnují
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85Decode,RunLengthDecodea řetězce více filtrů končící obrazovým filtrem - Obrazové filtry zahrnují
DCTDecode,JPXDecode,JBIG2DecodeaCCITTFaxDecode - Rastrové cesty zahrnují DeviceRGB, DeviceGray, Indexed, DeviceCMYK a obrázky v grayscale nebo indexed s nízkou bitovou hloubkou
Dekódovací parametry a bezpečnost
DecodeParmsa jeho zkrácený klíčDPse resolveují, ať už je hodnota slovník, nebo poslední slovník v poli parametrů filtruPredictor,Colors,BitsPerComponentaColumnsse aplikují po dekompresi Flate nebo LZW- LZW
EarlyChange=0iEarlyChange=1jsou respektovány - TIFF Predictor 2 podporuje packed vzorky 1, 2 a 4 bity i 8 a 16bitové složky
- PNG prediktory vyžadují platnou značku filtru pro každý kompletní řádek
- Rastrové rozměry a očekávané počty bajtů se před alokací či dekódováním kontrolují na přetečení
- Poškozená komprimovaná data se hlásí jako selhání dekódování a nikdy se neošetřují jako nekomprimované pixely
Příklad
var
Doc: THotPDF;
Info: THPDFLoadedImageInfo;
Bmp: TBitmap;
I: Integer;
begin
Doc := THotPDF.Create(nil);
try
Doc.LoadFromFile('input.pdf');
for I := 0 to Doc.GetLoadedImageCount - 1 do
if Doc.GetLoadedImageInfo(I, Info) and Info.Decodable then
begin
Bmp := Doc.ExtractLoadedImage(I);
try
if Assigned(Bmp) then
Bmp.SaveToFile(Format('image-%d.bmp', [I]));
finally
Bmp.Free;
end;
end;
finally
Doc.Free;
end;
end;