PHP - 可以采用 base64 编码的 pdf 数据字符串并进行压缩吗?
PHP - Possible to take a base64 encoded pdf data string and compress it?
所以我有一个 XML 文件,它有一个 base64 编码的 pdf 文件数据字符串,它只有一张取自 iPad.
的图像
此 pdf 文件可能过大,尺寸为 57"x38" 时高达 14MB。
这些图像是通过 DocuSign session、 从 iPad 获取的,因此在它们到达我的[之前,我目前无法控制它们的大小或格式=67=] 监听脚本.
但是,我的脚本无法处理这么大的文件,因为我的 CRM API 文件大小最大为 10MB,我需要一种方法来减小文件大小,然后才能通过我的 CRM API.
现在,如果它只是一个 jpg,那没关系,因为在 PHP 中有很多方法可以减小文件大小,但它是一个 PDF。我发现了很多 PHP 用于制作 PDF 的扩展,但是我还没有找到任何用于阅读 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);
我可以使用正确的 header 测试日期,我可以看到新的 jpeg 很好,所以我假设数据格式正确。
我错过了什么?
好的,我明白了。
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 变量正在获取垃圾值。现在一切正常。
所以我有一个 XML 文件,它有一个 base64 编码的 pdf 文件数据字符串,它只有一张取自 iPad.
的图像此 pdf 文件可能过大,尺寸为 57"x38" 时高达 14MB。
这些图像是通过 DocuSign session、 从 iPad 获取的,因此在它们到达我的[之前,我目前无法控制它们的大小或格式=67=] 监听脚本.
但是,我的脚本无法处理这么大的文件,因为我的 CRM API 文件大小最大为 10MB,我需要一种方法来减小文件大小,然后才能通过我的 CRM API.
现在,如果它只是一个 jpg,那没关系,因为在 PHP 中有很多方法可以减小文件大小,但它是一个 PDF。我发现了很多 PHP 用于制作 PDF 的扩展,但是我还没有找到任何用于阅读 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);
我可以使用正确的 header 测试日期,我可以看到新的 jpeg 很好,所以我假设数据格式正确。
我错过了什么?
好的,我明白了。
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 变量正在获取垃圾值。现在一切正常。