使用PHP从PDF中提取图像

时间:2013-12-05 14:40:22

标签: php image pdf

事情是,客户希望上传带图像的pdf,作为一次批处理多个图像的方式。

我已经环顾四周,开箱即用的PHP无法阅读PDF文件。

我的替代方案是什么?

我已经知道主机没有安装imageMagick或任何pdf库,并且exec功能已被禁用。这基本上让我没有任何工作,我猜?

有没有人知道是否有可以执行此操作的在线服务,并且有各种各样的API?

感谢adv

2 个答案:

答案 0 :(得分:9)

AFAIK,没有PHP模块可以做到。有一个命令行工具pdfimagesxpdf的一部分)。作为参考,这是如何工作的:

pdfimages -j source.pdf image

将从source.pdf中提取所有图像为image-000.jpg,image-001.jpg等。注意输出格式始终为Jpeg。

可能的选项

作为命令行工具,您需要exec(或systempassthru,任何执行PHP内置函数的命令。由于您的环境没有,我看到四个选项:

  1. 请求为您打开exec(您的托管服务提供商可以限制您执行单个命令的操作)
  2. 更改设计 - ZIP上传怎么样?
  3. 使用pdfimages的源代码作为模型
  4. 滚动您自己
  5. pdfimages通过在您控制的远程主机上运行
  6. 来完成繁重的工作

    关于#3,滚动你自己,我不认为滚动你自己,解决一个非常狭窄的要求定义,会太困难。我似乎记得PDF中的图像边界定义得很好:只需将文件读入边界,切割到边界的末尾,base64_decode,然后写入文件 - 重复。但是,这可能太多了......

    如果滚动你自己太复杂了,那么选项#4有点像Joel Spolsky describes for working with complicated Excel objects(参见大胆标题下的编号列表“让办公室为你做繁重的工作”)。

    • 找一个便宜的托管环境(例如亚马逊EC2)让你execcurl
    • 安装pdfimages
    • 编写一个PHP脚本,将URL带到PDF,curl打开PDF,将其写入磁盘,将其传递给pdfimages,然后将URL返回到生成的图像。

    示例交换可能如下所示:

    GET http://www.cheaphost.com/pdfimages.php?extract=http://www.limitedhost.com/path/to/uploaded.pdf
    
    Content-type: text/html
    
    
    <html>
    <body>
    <ul>
    <li>http://www.cheaphost.com/pdfimages.php?retrieve=ab9895v/image-000.jpg</li>
    <li>http://www.cheaphost.com/pdfimages.php?retrieve=ab9895v/image-001.jpg</li>
    </ul>
    </body>
    </html>
    

    因此,您的单个pdfimages.php脚本(在具有exec功能的主机上运行)可以提取图像,并允许您访问提取的图像。提取时,它会读取您告诉它的PDF,在其上运行pdfimages,并返回一个要调用的URL列表以检索提取的图像。检索时,它只会让您回到直线图像。

    您需要处理清理,或许要做的事情是在检索后删除图像。您还需要处理安全性 - 不知道这些图像中的内容,但内容可能需要包含在SSL中并采取其他预防措施。

答案 1 :(得分:0)

您可以使用pdfimages并以这种方式安装它:

apt install poppler-utils

然后以这种方式使用它以PNG文件格式获取所有图像:

pdfimages -j mypdf.pdf image -png

图像将放置在image-000.png,image-001.png等下的同一文件夹中。

有很多可用的选项,包括一些用于更改输出格式的信息,更多信息here

我希望这会有所帮助!