使用PHP从PDF中提取图像


extract images from PDF with PHP

问题是,客户端希望上传一个带有图像的pdf文件,作为一种同时批量处理多个图像的方式。

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

我的备选方案是什么?

我已经知道主机没有安装imageMagick或任何pdf库,并且exec功能被禁用。我想,这基本上让我没有什么可做的了?

有人知道是否有一个在线服务可以做到这一点吗?

感谢adv

AFAIK,没有PHP模块来做这件事。有一个命令行工具,pdfimages(xpdf的一部分)。作为参考,以下是其工作原理:

pdfimages -j source.pdf image

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

可能的选项

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

  1. 请求为您打开exec(您的托管提供商可以将您可以执行的内容限制为一个命令)
  2. 改变设计——ZIP上传怎么样
  3. 使用pdfimages的源代码作为模型
  4. pdfimages通过在您控制的远程主机上运行来完成繁重的工作

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

如果自己滚动太复杂,那么选项#4有点像Joel Spolsky描述的处理复杂Excel对象的方法(请参阅粗体标题"让Office为您做繁重的工作"下的编号列表)。

  • 找到一个便宜的托管环境(如亚马逊EC2),让你execcurl
  • 安装pdfimages
  • 编写一个PHP脚本,获取PDF的URL,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包裹,并采取其他预防措施。

您可以使用pdfimages并通过以下方式安装它:

apt install poppler-utils

然后用这种方式获得所有的图像作为PNG文件:

pdfimages -j mypdf.pdf image -png

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

有很多可用的选项,包括一些更改输出格式的选项,更多信息请点击此处。

我希望这能有所帮助!