【发布时间】:2016-04-20 07:59:20
【问题描述】:
所以我有一个 XML 文件,其中包含一个用于 pdf 文件的 base64 编码数据字符串,该文件只有一张从 iPad 上拍摄的图像。
此 pdf 文件可能过大,高达 14MB,尺寸为 57"x38"。
这些图像是通过 DocuSign 会话从 iPad 获取的,因此,在它们到达我的 php 侦听器脚本之前,我目前无法控制它们的大小或格式。
但是,我的脚本无法处理如此大的文件,因为我的 CRM 的 API 文件大小最大为 10MB,我需要一种减小文件大小的方法,然后才能通过我的 CRM 的 API 上传它。
现在,如果它只是一个 jpg,那没关系,因为在 PHP 中有很多方法可以减小文件大小,但它是 PDF。我发现了很多用于制作 PDF 的 PHP 扩展,但我还没有找到任何用于阅读 PDF 并从中提取图像的扩展。
那么有没有办法通过PHP从PDF中提取图像,或者压缩pdf文件?
更新
我没有考虑将 pdf 转换为 jpg 的可能性,这显然使用 imagick 更容易。让我的服务器管理员安装它,我会看看我是否可以让它与我的脚本一起工作。
更新 2
所以我能够让 imagick 工作并且在本地我能够将 pdf 文件转换为 jpg,并显着减小文件大小。
但是,在我的应用程序中使用它时遇到了问题。我从我的 CRM 的 API 中收到以下错误:
解析 XML-RPC 请求失败:1 字节 UTF-8 序列的字节 1 无效。
所以流程如下:
- XML 文件具有 pdf 文件的 base64 编码数据流。
- 我解码此数据
- 然后我使用 imagick 进行转换并减小文件大小
- 我进行 base64 编码并准备上传
代码
$imageBlob = base64_decode((string)$pdf->PDFBytes);
$imagick.$x = new Imagick();
$imagick.$x->readImageBlob($imageBlob);
$imagick.$x->setImageFormat('jpeg');
$imagick.$x->setImageCompressionQuality(60);
$imagick.$x->adaptiveResizeImage(1024,768,true);
$imageBlob = $imagick.$x->getImageBlob();
$PDFdata[] = base64_encode($imageBlob);
我可以使用正确的标题来测试日期,我可以看到新的 jpeg 很好,所以我假设数据格式正确。
我错过了什么?
【问题讨论】:
-
您向 CRM 发送什么? jpg、pdf、base64 字符串?
-
@bdn02 - 我一直在发送 base64 编码的字符串。它可以是 pdf、jpg、gif 或任何其他文件,只要小于 10MB。
-
优化是一种选择吗? - 即重新采样图像,降低分辨率和文件大小,对质量有一定影响。
-
@dwarring - 是的,这就是我希望做的。但我的问题是如何从 pdf 中获取图像?不幸的是,我无法更改获取文件的方式,因为它来自 DocuSign 并且始终是 pdf。
-
@David 如果你可以使用 shell,并且有任何可用的 ghostscript、xpdf 或 image-magick,这个线程可能很有用 - stackoverflow.com/questions/10450120/…
标签: php xml pdf compression docusignapi