2010年02月08日
首先,目的是为了从PDF中无损地把里面打包的图片提取出来,{zh0}是”原样”取出。
在网上查到了PDF格式的特点,发现原样提取是有可能的,而且有手工提取的方法。不过若按这方法提取就太麻烦了,而且我手上没有那种处理超过10MB还不卡的编辑器(方法后附)。
用”[东方幻彩纪.PDF]“做试验。这是国人小神打包他自己的画作集–这不是重点。我的机子上的PDF要么没图可提,要么太大(80MB以上),这个刚好是10.5MB(11,066,888字节,下面会提到),而且是纯图片无文本的,这表示如果软件是原样提取,所得图片应该稍小于10.5MB。
以下3个提取器都比较有名。
1.PDFExtractTIFF 2.0
VeryPDF.com出品。主程序文件名是pdf2tif.exe,pdf2tif也是这个软件的别名。同时还附带了encryptpdf.dll(PDF Password Remover),似乎是移除PDF保护密码用的。我手上的是Maxkingmax(嬴政天下论坛)汉化xx版。
首先,这个软件提取出来是无损的tiff图片,而且可以保存为多页tiff(相当于psd那样有多个图层,可以用[ 色彩风暴]查看每一层并另存为,也有[ 工具]提取每个图层)。
–但,提取出来的太大,居然有近500MB–几乎半G!
2.Some PDF Image Extract 1.5
又名PDF2Img,SomePDF.com出品。我用来测试的:汉化者是南方的雨,绿色单文件已xx,配置保存到Settings.ini。
–但,弹出不支持此品种PDF的提示。呃,等有别的品种PDF再试……(已试,下附)
3.PDF Image Extraction Wizard 3.0
简称PdfWiz,公司[RL Vision]。我从网上下载的是名为[PDF_IEW_30-snear]的注册版安装包,不过经我测试可以绿化,7-zip解压即可。汉化者是[Snear]。
是向导式的界面,一步一步来。让我惊喜的是中间有一步,提示遇到jpg可以原样提取,而遇到无损的可以保存为bmp、png、tiff等等无损格式。
于是提取之,检查一下提取所得图片的总大小:10.5MB(11,011,913字节,请与上面的数据对比)。
原样提取,所言不虚。
于是我又一次逐像素对比图片,发现清晰度与那个半G的一样:一个像素不差!……很显然原本打包的就是jpg,有损jpg再转无损的tiff那一定是悲剧。
附)PDF2Img:用另一个PDF提取,发觉没有原样提取的选择。输出的jpg压缩率要自己定(已经压缩的jpg再压缩岂非损失更大),即使调到”{bfb}”,实际还是99%有损。输出png倒是无损,不过和”原样提取”差距太大了。
另外发现,PdfWiz无损提取的png,比PDF2Img的体积要小,而图像质量一样(再一次逐像素对比…)。而pdf2tif,无论如何不管选什么选项都只会比这两者都大,而且一般会大一倍……
不用说,推荐PdfWiz。有更好的吗?
2010年2月10日追加:当PDF内嵌的为32位alpha透明png(?)时,似乎没有一个可以原样提取的,全部变成24位。
几个与PDF相关的软件
1.反其道而行之,把图片打包成PDF的软件,除了WPS这个免费office外,还有个专用软件FreePic2Pdf([ 马健]作品),据介绍这个软件可以同时保证图片质量(非虚拟打印,而是嵌入)与生成最小体积(”废话”最少)。
2.原本我没有下载软件合集包的兴趣,习惯分别下载,不过当我看到”小强PDF工具包 1.5″的介绍……
集PDF阅读、页面管理、编辑、创建、密码xx、word转换六位一体
集成的PDF软件如下:
1、Foxit Reader 3.0 Build 1817官方中文注册版
2、Foxit PDF Page Organizer 2.9.3中文注册版
3、Foxit PDF Editor 2.1.0中文注册版
4、TinyPDF 1.0xx版 (注:这是PDF虚拟打印机,drag0n制作的单文件不绿色版–虚拟打印机必须要安装的。)
5、Advanced PDF Password Recovery 3.00中文xx版 (如非中文,请从Options→Language选项里调一下)
6、e-PDF To Word Converter 2.5绿色版 (这个转换的word文档效果不错)
哎……居然都xx好了?于是决定下载这个……这个包似乎是用WinRAR做的自解压,直接解压即可。话说福昕(Foxit)这家公司很强。
3.PDF Password Remover:也是VeryPDF.com出的,用来xxPDF文件保护的工具,不过不免费,有试用次限(好像是100次?)。
4.CAJViewer。这是2007.8.11.的介绍:
”这是学生朋友们用得比较多的阅读器,因为它不光能查看PDF文件,还能打开一些期刊文件和数字文献资料(准备毕业论文的朋友们尤其需要这个软件)。”
主页:http://www.cnki.net/software/xzydq.htm
5.其它的,据2007.7.20.善用佳软(xbeta)在cs72.com的留言:请搜”全面接触pdf”–年代久远不知道参考价值如何(…不要问我怎么看到这留言的)。
【转】从PDF中提取图片
昨天在论坛上看到这个帖子
http://www.phpchina.com/bbs/viewthread.php?tid=443 30&extra=page=1&sid=VU3rbM
自己弄明白了就发到这里,也是和大家分享学习的一个过程
PDF中存储的内容是以对象的形式存储的这个可以用editplus打开PDF进行查看,既然是以对象的形式存储,就会有一定的存储格式,提取图片的关键就是查看图片存取的格式
以下是这个PDF图片存取格式
8 0 obj //对象名称
<</Type /XObject //数据类型object
/Subtype /Image //数据内容是图片
/Width 111
/Height 139
/ColorSpace /DeviceRGB
/BitsPerComponent 8
/Filter /DCTDecode
/Length 4750>>
stream
*****
endstream
所以提取的关键就是对上面的**内容进行匹配
这个匹配很简单大家相信都会
用正则表达式
1.$img1 = preg_replace(’/(.*)(?<=\/Subtype \/Image)(.*?)(?=stream)(stream)(.*?)(endstream)(.* )/is’,'$4′,$str);
这是基本的匹配,但是匹配成功之后发现不能显示?怎么回事?我估计是\n搞的鬼,于是将匹配结果用C32Asm打开,发现果然是有0A这个捣蛋鬼,于是改进如下
1.在上面那句之后加$img1 = substr($img1,1,-1);
或者直接用以下这句替换:
$img1 = preg_replace(’/(.*)(?<=\/Subtype \/Image)(.*?)(?=stream)(stream’.”\n”.’)(.*?)(endst ream’.”\n”.’)(.*)/is’,'$4′,$str);
这个时候数据得到了,如果想保存,这个直接fwrite了
如果想直接在页面上显示,需要注意发送的头部
header(’Content-Type: image/jpg’);然后在echo $img1;
这样做的结果只能提取某一张图片,如果想提取任意一张图片,则需要修改正则表达式,将其中加上对象名称,可以构造函数如下
function pdf($pdf,$jpg,$obname){
// $pdf pdf文件名称
// $jpg 要生成jpg文件名称
// $obname 图片对象名称如上的8 0 obj
$fp = fopen($pdf,’rb’);
$str = fread($fp,filesize($pdf));
$img = preg_replace(’/(.*)(’.$obname.’(.*?))(?<=\/Subtype \/Image)(.*?)(?=stream)(stream’.”\n”.’)(.*?)(endst ream)(.*)/is’,'$6′,$str);
fclose($fp);
$fp = fopen($jpg,’wb’);
fwrite($fp,$img);
fclose($fp);
header(’Content-Type: image/jpg’);
echo $img;
}
pdf(’1.pdf’,'1.jpg’,'8 0 obj’); 最近在美化几个火狐扩展。……似乎还有几处出错。