Loaded Image Extraction
A extração de imagens carregadas permite que aplicações enumerem XObjects de imagem depois que LoadFromFile ou LoadFromStream abre um PDF existente, inspecionem os seus metadados e decodifiquem imagens suportadas em instâncias de TBitmap
Main APIs
GetLoadedImageCountretorna o número de objetos de imagem enumeráveis no documento carregadoGetLoadedImageInfopreencheTHPDFLoadedImageInfocom número do objeto, índice de página, tamanho, profundidade de bits, espaço de cor, lista de filtros e metadados de decodificabilidade sem decodificar pixelsExtractLoadedImagedecodifica a imagem selecionada em um novoTBitmap; o chamador é dono do bitmap retornadoGetLoadedImageCountPerPagerestringe a enumeração a uma única página carregada
Fontes suportadas
- Os filtros de dados incluem
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85Decode,RunLengthDecodee cadeias de múltiplos filtros que terminam num filtro de imagem - Os filtros de imagem incluem
DCTDecode,JPXDecode,JBIG2DecodeeCCITTFaxDecode - Os caminhos de raster incluem DeviceRGB, DeviceGray, Indexed, DeviceCMYK e imagens em tons de cinza ou indexadas de baixa profundidade de bits
Parâmetros de decodificação e segurança
DecodeParmse a sua chave abreviadaDPsão resolvidos tanto quando o valor é um dicionário quanto quando é o dicionário final num array de parâmetros de filtroPredictor,Colors,BitsPerComponenteColumnssão aplicados depois da descompressão Flate ou LZW- LZW
EarlyChange=0eEarlyChange=1são ambos respeitados - TIFF Predictor 2 suporta amostras empacotadas de 1, 2 e 4 bits, além de componentes de 8 e 16 bits
- Os predictors PNG exigem uma tag de filtro válida para cada linha completa
- As dimensões do raster e as contagens de bytes esperadas são verificadas quanto a overflow antes da alocação ou da decodificação
- Dados comprimidos malformados são relatados como falha de decodificação e nunca tratados como pixels não comprimidos
Exemplo
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;