用PHP从PDF中提取图像

用PHP从PDF中提取图像,php,image,pdf,Php,Image,Pdf,问题是,客户端希望上传一个带有图像的pdf文件,作为一种一次性批量处理多个图像的方式 我已经环顾四周,发现现成的PHP无法阅读PDF 我的选择是什么 我已经知道主机没有安装imageMagick或任何pdf库,并且exec功能被禁用。我想这基本上让我没有工作了 有人知道有没有一个在线服务可以通过某种api来实现这一点吗 感谢advAFAIK,这里没有PHP模块来做这件事。有一个命令行工具(的一部分)。以下是其工作原理,以供参考: pdfimages -j source.pdf image 它将

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

我已经环顾四周,发现现成的PHP无法阅读PDF

我的选择是什么

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

有人知道有没有一个在线服务可以通过某种api来实现这一点吗


感谢adv

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

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

可能的选项

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

  • 请求为您打开exec(您的托管提供商可以将您可以执行的内容限制为单个命令)
  • 改变设计——ZIP上传怎么样
  • 使用
    pdfimages
    的源代码作为模型,推出您自己的产品
  • pdfimages
    在您控制的远程主机上运行它,完成繁重的工作
  • 关于#3,滚动你自己的,我不认为滚动你自己的,解决一个非常狭隘的需求定义会太难。我似乎记得PDF中的图像边界定义得很好:只需将文件读入边界,剪切到边界的末尾,base64_解码,然后写入文件——重复。然而,这可能太多了

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

    • 找到一个便宜的托管环境(如AmazonEC2),让您
      exec
      curl
    • 安装
      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>
    
    GEThttp://www.cheaphost.com/pdfimages.php?extract=http://www.limitedhost.com/path/to/uploaded.pdf
    内容类型:text/html
    
    • http://www.cheaphost.com/pdfimages.php?retrieve=ab9895v/image-000.jpg
    • http://www.cheaphost.com/pdfimages.php?retrieve=ab9895v/image-001.jpg
    因此,您的单个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等下的同一文件夹中

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


    我希望这有帮助

    我提到了api,它是否在主题中/在主题中有所了解?我担心您将很难实现这一点,甚至在您提到的当前约束条件下,这也是可能的。也许你可以说服客户将图片上传到zip文件或类似文件中?至少会让你的工作更轻松!这从来都不是讨论的话题,但我现在可以提出来了。我将探讨Bishop给我的关于切割边界的建议。我不太清楚它应该如何使用,它不是PHP模块吗?它不是PHP模块:它是一个命令行程序,因此需要exec。(我用我最初的答案仔细阅读了这一部分:已经修改过了。)如果没有exec,我想你需要模仿pdfimages在PHP中的功能——即,自己翻滚。你在开玩笑吧,自己翻滚?我认为这并不简单。如果你没有exec,而且AFAIK没有一个PHP模块来做这件事,你也不能改变设计。。。除了手工,我没有别的办法。我编辑了我的原始答案,注意到PDF中的图像边界非常清晰,因此找到它们并切割它们应该不会太困难。我必须研究一下,但是创建自己的api听起来也很有趣,但我从来没有这样做过。我得考虑一下。你会用什么格式寄回去?