Ekstrakcja obrazów z załadowanego dokumentu
Ekstrakcja obrazów z załadowanego dokumentu pozwala aplikacji wyliczać image XObjects po otwarciu istniejącego PDF przez LoadFromFile albo LoadFromStream, oglądać ich metadane i dekodować obsługiwane obrazy do instancji TBitmap
Główne API
GetLoadedImageCountzwraca liczbę wyliczalnych obiektów obrazów w załadowanym dokumencieGetLoadedImageInfowypełniaTHPDFLoadedImageInfonumerem obiektu, indeksem strony, rozmiarem, głębią bitową, przestrzenią kolorów, listą filtrów i metadanymi dekodowalności, bez dekodowania pikseliExtractLoadedImagedekoduje wybrany obraz do nowegoTBitmap; własność bitmapy przechodzi na wywołującegoGetLoadedImageCountPerPagezawęża wyliczanie do jednej załadowanej strony
Obsługiwane źródła
- Filtry danych obejmują
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85Decode,RunLengthDecodeoraz łańcuchy wielofiltrowe kończące się filtrem obrazu - Filtry obrazów obejmują
DCTDecode,JPXDecode,JBIG2DecodeiCCITTFaxDecode - Ścieżki rastrowe obejmują DeviceRGB, DeviceGray, Indexed, DeviceCMYK oraz obrazy w skali szarości albo indeksowane o małej głębi bitowej
Parametry i bezpieczeństwo dekodowania
DecodeParmsi jego skrócony kluczDPsą rozwiązywane zarówno gdy wartość to słownik, jak i gdy to ostatni słownik w tablicy parametrów filtrówPredictor,Colors,BitsPerComponentiColumnssą stosowane po dekompresji Flate albo LZW- LZW
EarlyChange=0iEarlyChange=1są oba honorowane - TIFF Predictor 2 obsługuje próbki packed 1, 2 i 4-bitowe oraz komponenty 8- i 16-bitowe
- Predictory PNG wymagają poprawnego tagu filtru dla każdego pełnego wiersza
- Wymiary rastra i oczekiwane liczby bajtów są sprawdzane pod kątem przepełnienia przed alokacją albo dekodowaniem
- Zniekształcone dane skompresowane są raportowane jako błąd dekodowania i nigdy nie są traktowane jako piksele nieskompresowane
Przykład
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;