所以我有一个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更容易。让我的服务器管理员安装它,我将看看我是否可以使用我的脚本。
所以我能够让想象力在当地工作,我能够将pdf文件转换为jpg,并大大减少文件大小。
但是,我遇到了与我的应用程序一起使用它的问题。我从CRM的API中收到以下错误:
无法解析XML-RPC请求:1字节UTF-8序列的字节1无效。
所以过程如下:
$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很好,所以我假设数据格式正确。
我缺少什么?
答案 0 :(得分: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变量获得了垃圾值。现在一切正常。