Итак, у меня есть файл XML, в котором есть строка данных в кодировке base64 для файла PDF, в которой есть только изображение, полученное с iPad.
Этот файл PDF может быть слишком большим, до 14 МБ с размерами 57 «x38».
Эти изображения взяты с iPad через сеанс DocuSign, таким образом, у меня нет никакого способа в данный момент контролировать их размер или формат, прежде чем они попадут в мой скрипт слушателя php.
Однако мой скрипт не может работать с такими большими файлами, так как максимальный размер файла API моей CRM составляет 10 МБ, и мне нужен способ уменьшить размер файла, прежде чем я смогу загрузить его через API своей CRM.
Теперь, если бы это был просто jpg, было бы неплохо, так как есть множество способов уменьшить размер файла в PHP, но это PDF. Я нашел множество расширений PHP для создания PDF-файлов, но не нашел ни одного для чтения PDF-файла и извлечения из него изображения.
Так есть ли способ извлечь изображение из PDF через PHP или, возможно, сжать файл PDF?
Я не думал о возможности преобразование PDF в JPG, который, по-видимому, легче сделать с Imagick. Установив его администратором сервера, я посмотрю, смогу ли я заставить его работать со своим скриптом.
Таким образом, я смог заставить работать imagick, и локально я могу конвертировать pdf файлы в jpg и значительно уменьшить размер файла.
Тем не менее, я столкнулся с проблемой при использовании его с моим приложением. Я получаю следующую ошибку от моего CRM API:
Не удалось проанализировать запрос XML-RPC: недопустимый байт 1 из 1-байтовой последовательности UTF-8.
Итак, процесс выглядит следующим образом:
$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 нормально, поэтому я предполагаю, что данные правильно отформатированы.
Чего мне не хватает?
Хорошо, я понял это.
Имагик был подходящим способом, и я использовал его хорошо. Я просто обманул имя файла, потому что не использовал правильное имя динамической переменной. Код должен был выглядеть так:
$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 в предыдущем коде получала нежелательные значения. Теперь все работает отлично.
Других решений пока нет …