0

从PDF中提取图片

Posted in PHP at 八月 23rd, 2008 / No Comments »

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”.’)(.*?)(endstream’.”\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”.’)(.*?)(endstream)(.*)/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’);

Published in PHP
Tags:

No Responses to “从PDF中提取图片”

Leave a Reply

请输入算式结果(看不清请点击图片)
(必须)