【问题标题】:PHP - Possible to take a base64 encoded pdf data string and compress it?PHP - 可以采用 base64 编码的 pdf 数据字符串并压缩它吗?
【发布时间】: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 无效。

所以流程如下:

  1. XML 文件具有 pdf 文件的 base64 编码数据流。
  2. 我解码此数据
  3. 然后我使用 imagick 进行转换并减小文件大小
  4. 我进行 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


【解决方案1】:

好的,我想通了。

Imagick 是要走的路,我对它的使用很好。我只是搞砸了文件名,因为我没有使用正确的动态变量名。代码应该是这样的:

代码

$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);
$PDFfile[] = $FormCustomField . $x . '.jpg';

所以我得到的错误是因为文件名无效,因为前面代码中的 $x 变量正在获取垃圾值。现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多