已加载图像提取
已加载图像提取让应用程序在 LoadFromFile 或 LoadFromStream 打开现有 PDF 之后,可以枚举图像 XObject、检查其元数据,并把受支持的图像解码为 TBitmap 实例
主要 API
GetLoadedImageCount返回已加载文档中可枚举图像对象的数量GetLoadedImageInfo填充THPDFLoadedImageInfo,填入对象号、页面索引、尺寸、位深、色彩空间、过滤器列表和可解码性元数据,不解码像素ExtractLoadedImage把选定的图像解码为新的TBitmap;返回的位图由调用方负责释放GetLoadedImageCountPerPage把枚举范围限定在单个已加载页面
支持的来源
- 数据过滤器包括
FlateDecode、LZWDecode、ASCIIHexDecode、ASCII85Decode、RunLengthDecode以及以图像过滤器结尾的多过滤器链 - 图像过滤器包括
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 比特打包的 samples 以及 8 和 16 比特分量
- PNG predictor 要求每个完整行都有有效的过滤标签
- 在分配或解码之前,先检查光栅尺寸和预期字节数是否溢出
- 畸形的压缩数据会报告为解码失败,绝不当作未压缩像素处理
示例
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;