Извлечение изображений из загруженного документа
Извлечение загруженных изображений позволяет приложению перечислять image XObject после того, как LoadFromFile или LoadFromStream откроет существующий PDF, посмотреть их метаданные и декодировать поддерживаемые изображения в TBitmap экземпляры
Основные API
GetLoadedImageCountвозвращает число перечислимых объектов изображений в загруженном документеGetLoadedImageInfoзаполняетTHPDFLoadedImageInfoданными: номер объекта, индекс страницы, размер, глубина цвета, цветовое пространство, список фильтров и метаданные декодируемости — без декодирования пикселейExtractLoadedImageдекодирует выбранное изображение в новыйTBitmap; возвращённый bitmap принадлежит вызывающемуGetLoadedImageCountPerPageограничивает перечисление одной загруженной страницей
Поддерживаемые источники
- Фильтры данных включают
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85Decode,RunLengthDecodeи цепочки фильтров, заканчивающиеся image-фильтром - Image-фильтры включают
DCTDecode,JPXDecode,JBIG2Decode, иCCITTFaxDecode - Растровые варианты включают DeviceRGB, DeviceGray, Indexed, DeviceCMYK, а также полутоновые и индексированные изображения малой битовой глубины
Параметры декодирования и безопасность
DecodeParmsи его сокращённыйDPразрешаются независимо от того, является ли значение словарём или последним словарём в массиве параметров фильтраPredictor,Colors,BitsPerComponent, иColumnsприменяются после распаковки Flate или LZW- LZW
EarlyChange=0иEarlyChange=1оба поддерживаются - TIFF Predictor 2 поддерживает упакованные сэмплы 1, 2 и 4 бита, а также компоненты 8 и 16 бит
- PNG-предикторы требуют корректный тег фильтра для каждой полной строки
- Размеры растра и ожидаемые объёмы байтов проверяются на переполнение до выделения памяти или декодирования
- Повреждённые сжатые данные сообщаются как сбой декодирования и никогда не трактуются как несжатые пиксели
Пример
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;