【问题标题】:extract images from PDF with PHP使用 PHP 从 PDF 中提取图像
【发布时间】:2013-12-22 13:30:04
【问题描述】:

问题是客户想要上传带有图像的 pdf,作为一次批量处理多个图像的一种方式。

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

我有什么选择?

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

有谁知道是否有在线服务可以做到这一点,并带有各种 api?

感谢广告

【问题讨论】:

  • 我提到了api,它知道in/on topic吗?
  • 恐怕你会很难让它工作,你提到的当前限制甚至有可能。也许您可以说服客户以 zip 文件或类似的方式上传图像?至少会让它更容易使用!
  • 这从来都不是讨论的话题,但我现在可以提一下了。我将探讨 Bishop 给我的关于削减边界的建议。

标签: php image pdf


【解决方案1】:

AFAIK,没有 PHP 模块可以做到这一点。有一个命令行工具,pdfimages(xpdf 的一部分)。作为参考,下面是它的工作原理:

pdfimages -j source.pdf image

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

可能的选择

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

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

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

如果自己滚动太复杂,那么选项 #4 有点像 Joel Spolsky describes for working with complicated Excel objects(请参阅粗体标题“让 Office 为您完成繁重的工作”下的编号列表)。

  • 找到一个便宜的托管环境(例如 Amazon EC2),让您拥有exec 和curl
  • 安装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模块吗?
  • 它不是一个 PHP 模块:它是一个命令行程序,所以你需要 exec。 (我用我的原始答案阅读了那部分:从那以后进行了修改。)如果没有 exec,我认为您将需要模拟 pdfimages 在 PHP 中所做的事情——即,自己动手。
  • 你在开玩笑吧,自己动手吧?我认为这并不简单。
  • 如果您没有 exec,并且 AFAIK 没有 PHP 模块可以执行此操作,并且您无法更改设计...我认为除了手动之外别无他法。我编辑了我的原始答案,注意 PDF 中的图像边界非常清晰,因此找到它们并剪切它们应该不会太难。
  • 我将不得不对此进行研究,但创建自己的 api 听起来也很有趣,但我从未这样做过。我得考虑一下。你会用什么格式寄回去?
【解决方案2】:

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

apt install poppler-utils

然后用这种方式把所有的图片都获取为PNG文件:

pdfimages -j mypdf.pdf image -png

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

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

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 2012-02-01
    • 2015-07-01
    • 2011-08-22
    • 2019-10-15
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多