Extração de imagens carregadas
A extração de imagens carregadas permite às aplicações enumerar image XObjects depois de LoadFromFile ou LoadFromStream abrir um PDF existente, inspecionar os respetivos metadados e descodificar imagens suportadas em instâncias TBitmap
APIs principais
GetLoadedImageCountdevolve o número de objetos de imagem enumeráveis no documento carregadoGetLoadedImageInfopreencheTHPDFLoadedImageInfocom número de objeto, índice de página, tamanho, profundidade de bits, espaço de cor, lista de filtros e metadados de descodificabilidade, sem descodificar píxeisExtractLoadedImagedescodifica a imagem selecionada num novoTBitmap; quem chama é o proprietário do bitmap devolvidoGetLoadedImageCountPerPagelimita a enumeração a uma página carregada
Origens suportadas
- Os filtros de dados incluem
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85Decode,RunLengthDecodee cadeias multi-filtro que terminam num filtro de imagem - Os filtros de imagem incluem
DCTDecode,JPXDecode,JBIG2DecodeeCCITTFaxDecode - Os caminhos raster incluem DeviceRGB, DeviceGray, Indexed, DeviceCMYK e imagens em tons de cinzentos ou indexadas de poucos bits
Parâmetros de descodificação e segurança
DecodeParmse a respetiva chave abreviadaDPsão resolvidos tanto quando o valor é um dicionário como quando é o último dicionário de um array de parâmetros de filtrosPredictor,Colors,BitsPerComponenteColumnssão aplicados depois da descompressão Flate ou LZW- LZW
EarlyChange=0eEarlyChange=1são ambos honrados - O 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 em cada linha completa
- As dimensões do raster e as contagens esperadas de bytes são verificadas quanto a transbordo antes da alocação ou descodificação
- Dados comprimidos malformados são reportados como falha de descodificação e nunca são tratados como píxeis 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;