Extracción de imágenes cargadas
La extracción de imágenes cargadas permite a las aplicaciones enumerar los image XObjects después de que LoadFromFile o LoadFromStream abra un PDF existente, inspeccionar sus metadatos y decodificar las imágenes soportadas en instancias TBitmap
APIs principales
GetLoadedImageCountdevuelve el número de objetos de imagen enumerables del documento cargadoGetLoadedImageInforellenaTHPDFLoadedImageInfocon número de objeto, índice de página, tamaño, profundidad de bits, espacio de color, lista de filtros y metadatos de decodificabilidad sin decodificar píxelesExtractLoadedImagedecodifica la imagen seleccionada en unTBitmapnuevo; quien llama es propietario del bitmap devueltoGetLoadedImageCountPerPageacota la enumeración a una página cargada
Orígenes soportados
- Los filtros de datos incluyen
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85Decode,RunLengthDecodey cadenas de varios filtros que terminan en un filtro de imagen - Los filtros de imagen incluyen
DCTDecode,JPXDecode,JBIG2DecodeyCCITTFaxDecode - Las rutas rasterizadas incluyen DeviceRGB, DeviceGray, Indexed, DeviceCMYK e imágenes de escala de grises o indexadas de baja profundidad
Parámetros de decodificación y seguridad
DecodeParmsy su clave abreviadaDPse resuelven tanto si el valor es un diccionario como si es el diccionario final de un array de parámetros de filtrosPredictor,Colors,BitsPerComponentyColumnsse aplican tras la descompresión Flate o LZW- Se respetan tanto LZW
EarlyChange=0comoEarlyChange=1 - El TIFF Predictor 2 soporta muestras empaquetadas de 1, 2 y 4 bits además de componentes de 8 y 16 bits
- Los predictores PNG exigen una etiqueta de filtro válida para cada fila completa
- Las dimensiones rasterizadas y los conteos de bytes esperados se comprueban frente a desbordes antes de asignar o decodificar
- Los datos comprimidos malformados se informan como fallo de decodificación y nunca se tratan como píxeles sin comprimir
Ejemplo
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;