使用PHP从PDF中提取图像

12

问题是客户想要上传包含多个图像的PDF作为批处理多个图像的方式。

我已经搜索过,但PHP不能直接读取PDF文件。

我的替代选择是什么?

我已经知道主机没有安装imageMagick或任何PDF库,并且exec函数被禁用了。这基本上让我没有什么可使用的东西,难道不是吗?

有人知道是否有在线服务可以做到这一点,并带有一定的API吗?

谢谢提前。


我提到了API,这个话题你知道吗? - Richard
我怕你会很难让它正常工作,甚至在你提到的当前限制下可能都不可能。也许你可以说服客户将图像上传到zip文件或类似的东西中?这样至少会使处理变得更加容易! - Rick van Bodegraven
这从未成为讨论的议题,但现在我可以提一下。我将探索Bishop给我关于削减边界的建议。 - Richard
2个回答

14
据我所知,目前没有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解码,并写入文件 - 重复即可。但是,这可能太麻烦了...

如果自己制作过于复杂,那么选项 #4 就有点像 Joel Spolsky 描述的处理复杂 Excel 对象的方法(请参见粗体标题下的编号列表“让 Office 为您完成繁重的工作”)。
  • 找到一个便宜的托管环境(例如 Amazon 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和其他预防措施中。

我不太清楚它应该如何使用,它不是一个PHP模块吗? - Richard
它不是一个 PHP 模块:它是一个命令行程序,所以你需要使用 exec。 (我在我的原始答案中忽略了这部分:已经进行了修订。)如果没有 exec,我认为你需要在 PHP 中模拟 pdfimages 的功能 - 也就是自己编写代码。 - bishop
你在开玩笑吧,自己写?我觉得那不简单。 - Richard
1
如果您没有exec,并且据我所知没有PHP模块可以执行它,而且您无法更改设计……那么我认为唯一的方法是手动操作。我编辑了原始答案以指出PDF中图像边界非常清晰,因此找到并裁剪它们不应该太困难。 - bishop
我需要研究一下,但是创建自己的API也听起来很有趣,只是我从未尝试过。我得考虑一下。你会用什么格式将其发送回来? - Richard
看看我的修改。我提出了一种机制,将提取的图像作为<ul> URL列表发送回来。如果您想要更容易解析的内容,也可以使用JSON。 - bishop

4
您可以使用pdfimages并按照以下方式进行安装:
apt install poppler-utils

然后使用以下方式将所有图片保存为PNG文件:

pdfimages -j mypdf.pdf image -png

图片将放置在同一文件夹下,文件名为image-000.png、image-001.png等。

有许多选项可供选择,包括更改输出格式的选项,更多信息在此处

希望这可以帮助您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接