PDF Image Viewer 是一个神奇的软件,它支持PDF内嵌图像的查看和无损导出。支持Flate、LZW、CCITT Fax、JBIG2、Run Length、DCT、JPX、ASCII85、ASCIIHex等编码,支持RGB、Gray、CMYK、CalGray、CalRGB、Lab、ICCBased、Indexed、Separation 和 DeviceN等色彩空间。
大部分人可能都听说过PDF补丁丁软件,如果你用它导出PDF图像,用得多了,就会发现有的图像无法导出,有的图像全黑,有的图像全是斜线,还有的偏色,与PDF查看器渲染出来的图像不一样。我测试过很多免费工具,国外比较常用免费工具的是XPDF里面的pdfimages 和 MuPDF中的mutool,这两个软件比PDF补丁丁要好很多,但是依然存在某些内嵌图像无法识别或者无法导出的问题。如果把全部的内嵌图像当作100的话,PDF补丁丁大约可以正确导出40%的图像(新版补丁丁打算更换MuPDF内核,可以改善导出图像的问题,大家可以拭目以待)。XPDF的pdfimages 和 MuPDF的mutool 可以正确导出80%~90%的图像。最近实测发现 poppler v26的pdfimages工具可能会好一些。
究其原因,主要是这些工具对PDF内嵌图像的色彩空间的解析存在限制,不能正确处理解码后的数据,并根据色彩空间还原图像像素。
为了解决网上免费工具无法正确还原图像的问题,避免命令行的繁琐操作,解决图像的查看和批量导出需求,我用了一个多月的时间开发了这个工具。
本软件根据提取图像的编码和色彩空间不同,使用不同的流程解码。
下载: GitHub
不少人问我怎么证明你这个软件是无损导出,为什么导出的都是png格式。而其它工具导出却是JPG、JPEG2000、TIF之类的图像格式呢?
这里我简单说一下PDF内嵌图像的导出流程:
首先,从PDF资源对象中读出来的原始数据要进行解码,例如Flate、LZW、CCITT Fax、JBIG2、Run Length、DCT、JPX、ASCII85、ASCIIHex。这里需要注意的是,有些工具遇到了DCT Decode过滤器就保存成JPG,遇到了JPX Decode过滤器就保存成JP2,遇到CCITT Fax Decode过滤器就保存成TIF。这个做法是错误的,它只对简单色彩空间格式有效。因为解码操作只是色彩空间还原的前置数据处理,DCT、JPX、CCITT Fax解码得到的数据可能是Indexed、RGB、CMYK、LAB、Separation等需要进一步处理的数据,不一定是最终的图像。
然后,对解码得到的数据要进行如下操作:
1、根据需要进行索引还原,通过调色板转成Gray、RGB、CMYK、LAB、Separation 、CalGray、CalRGB等各种需要处理的数据。
2、根据需要进行Decode映射(常用于反相处理)。
3、根据需要进行色调还原(Separation、DeviceN)、Cal计算等操作,得到初步的图像像素。
4、根据需要对图像像素进行ICC色彩校正,例如RGB、CMYK、LAB等,转成Windows支持的像素格式。
5、校正之后的数据才是真正图像的像素数据,将其保存成png格式文件。
最终保存的图像体积可能会变大,但一定是正确的图像像素,并且是无损保存的。