Можно ли взять строку данных PDF в кодировке base64 и сжать ее?

Итак, у меня есть файл 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.

Итак, процесс выглядит следующим образом:

  1. XML-файл содержит поток данных в кодировке base64 файла pdf.
  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 нормально, поэтому я предполагаю, что данные правильно отформатированы.

Чего мне не хватает?

0

Решение

Хорошо, я понял это.

Имагик был подходящим способом, и я использовал его хорошо. Я просто обманул имя файла, потому что не использовал правильное имя динамической переменной. Код должен был выглядеть так:

$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 в предыдущем коде получала нежелательные значения. Теперь все работает отлично.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]