Создание PDF-файлов с изображениями слишком медленное

Большим узким местом, которое у меня есть на данный момент, является генерация PDF каждый раз, когда кто-то размещает заказ. Для единичного заказа это не имеет большого значения, но когда их много в короткие сроки, этот процесс идет очень медленно.

Для PDF требуется текстовая информация, QR-код, штрих-код, логотип и 1 или более (до 20+) изображений шириной 1/4.

Текущий процесс с DOMPDF:

  1. Изображение QR-кода, созданное с помощью PHP и сохраненное как png
  2. Изображение штрих-кода создано и сохранено в формате png
  3. DomPDF генерирует PDF

Новая мысль:

  1. HTML2PDF создает PDF и использует теги qr и штрих-кода для создания штрих-кодов.

Теоретически это позаботится об изображениях QR и штрих-кода, но все же остальные изображения делают его слишком медленным.

Делая это таким образом, без каких-либо изображений, кроме (QR и штрих-кода), PDF-файл может генерироваться примерно за 500 мс, но как только я начинаю добавлять изображения, это занимает до 2, 3, 4, 5+ секунд каждое.


При выполнении тестов и обработке ~ 10 000 заказов (за несколько минут) он все еще обрабатывал PDF-файлы примерно через 12 часов, пока я просто не закрыл его в отчаянии.

PDF-файл генерируется в отдельном процессе очереди, поэтому человеку не нужно ждать при заказе, но, тем не менее, ему не может потребоваться 5+ часов, чтобы получить PDF-файл с подтверждением во время большого трафика.


Вопросы/TLDR:

Как ускорить процесс создания PDF-файлов с динамическим qr-кодом, динамическим штрих-кодом, динамическим текстом и 1–20 статическими изображениями (изображения одинаковы во всех PDF-файлах)?

Есть ли другие потенциальные вещи, о которых я не подумал? Может быть, сделать шаблон PDF и каким-то образом использовать PHP, чтобы просто заполнить динамические места?


person Dave    schedule 16.09.2014    source источник
comment
DOMPDF использует GD? Полагаю, я думаю, что imagick может быть быстрее. Однако обработка огромных pdf-файлов с большим количеством изображений в php выполняется медленно и потребляет много памяти. Мы внедрили решение, которое генерирует латексные файлы, а затем распечатывает их в формате pdf. Вы могли бы попробовать и это. Для обработки изображений вы можете попробовать использовать imagick вместо GD. Вопрос является слишком широким, вам придется попробовать и сравнить различные решения. Сомневаюсь, что можно дать правильный ответ. Возможно, было бы неплохо также профилировать ваш текущий код, чтобы увидеть, где именно он работает медленно.   -  person floriank    schedule 16.09.2014
comment
Любые предложения о том, КАК быть более конкретным, безусловно, приветствуются. Я не ищу ответа типа "вы пропустили точку с запятой", но - я подробно описал процесс и проблему и буду рад любым предложениям, идеям... и т.д. Я в растерянности и израсходовал все остальные ресурсы. Не знаю, куда еще обратиться, кроме как спросить здесь. :( Должен быть какой-то способ быстрее создавать PDF-файлы с изображениями. И Html2PDF, и DomPDF медленны, как улитки, в ту минуту, когда я начинаю добавлять изображения. Я подумал, что, возможно, идея шаблона имеет некоторые достоинства, но - тоже ничего не могу найти там.   -  person Dave    schedule 16.09.2014
comment
Профилируйте свой скрипт и посмотрите, где он медленный, я держу пари на его часть, связанную с манипуляциями с изображениями. Потом попробуй улучшить. Это лучшее, что я мог придумать прямо сейчас. Вы также можете попробовать латексное решение, его не так сложно реализовать. Пример: sharelatex.com/learn/Inserting_Images Однако я создал отчет о восстановлении на 21 странице с много фотодокументации 7 лет назад, и в то время она отлично работала с TCPDF (или чем-то еще), так что это должно быть возможно сделать и сегодня. Но мне не приходилось обрабатывать 10 тысяч отчетов в день.   -  person floriank    schedule 16.09.2014
comment
2 близких голоса - ДЕЙСТВИТЕЛЬНО? Я не понимаю. Это очень правильный вопрос для очень правильной (и, вероятно, достаточно распространенной) проблемы. Это может быть непростым ответом, и это может быть не черно-белый ответ, но боже мой - только потому, что кто-то не может ответить на вопрос за 10 секунд, не означает, что он недействителен или не принадлежит SO. Есть даже тег производительности с более чем 10 000 использований. Если не здесь спрашивали, и не то, что можно найти в гугле, то что там еще? ЭТО кажется ИДЕАЛЬНЫМ местом для такого вопроса.   -  person Dave    schedule 16.09.2014
comment
@burzum - я попробую изучить латекс - я никогда не слышал об этом и не понимаю, что это такое, но я ценю ссылку / информацию. ИМО будет непросто профилировать мой код, так как это не МОЙ код вызывает его медленную работу - это что-то в обеих библиотеках PDF.   -  person Dave    schedule 16.09.2014
comment
Почему это нелегко? Используйте xdebug и kcachegrind.sourceforge.net/html/Home.html графическое представление и сортировка упрощает обнаружение медленных частей. Латекс обычно используется для написания научных публикаций. Он твердый и точный. Думайте об этом как о HTML для текстовых документов. Это не очень сложно. Если вы когда-либо имели дело с документами Word и Open Office в качестве шаблонов для создания PDF-файлов, особенно с помощью php, вы это оцените.   -  person floriank    schedule 16.09.2014
comment
Я не голосовал против, но это тип вопроса, который вызывает мнение. Так что ... из-за мнения .. ИМХО XSL FO был предназначен для таких вещей. Я выполнял установки намного большего размера и быстрее, чем это, с гораздо более сложными документами.   -  person Kevin Brown    schedule 16.09.2014
comment
Закрытие этого вопроса смешно.   -  person Dave    schedule 16.09.2014
comment
Вы пробовали TCPDF? Это работает очень быстро с изображениями. Или я бы предложил вам библиотеку WKHTMLTOPDF. Вы можете ускорить извлечение и обработку данных, используя какой-либо механизм кэширования.   -  person Anand G    schedule 16.09.2014
comment
@AnandGhaywankar - спасибо, посмотрю на это. обо всем позаботятся извлечение/обработка данных - сейчас проблема только в генерации. Спасибо за информацию.   -  person Dave    schedule 16.09.2014
comment
@AnandGhaywankar - Недостатком других библиотек, таких как TCPDF и WK .., является то, что они не создают QR- и штрих-коды, что, похоже, значительно сократит мое время.   -  person Dave    schedule 16.09.2014
comment
TCPDF генерирует штрих-коды и коды qr tcpdf.org/doc/code/classTCPDFBarcode.html, tcpdf.org/doc/code/classQRcode.html   -  person bancer    schedule 16.09.2014
comment
По поводу закрытия вопроса - я чувствую здесь запах политики. Не могу согласиться с тем, что на этот вопрос нельзя ответить в нескольких абзацах.   -  person bancer    schedule 16.09.2014
comment
Вы не говорите, как используются PDF-файлы, но ... если они используются в закрытой среде, OPI - это именно то, для чего была придумана такая проблема. Все, что вам нужно, — это приложение, которое может создавать PDF-файлы с помощью OPI и других необходимых вам функций. Я подумал, что стоит бросить его в кастрюлю, на всякий случай, если это поможет. [OPI — это функция, распространенная при печати, когда прокси-изображение с низким разрешением помещается в PDF-файл, а изображение с высоким разрешением находится на сервере, который доступен для окончательного процесса печати.]   -  person John Jefferies    schedule 17.09.2014
comment
@bancer - 1) здорово, что TCPDF создает штрих-коды и qr-коды! Это, наряду с рекомендацией, что он работает очень быстро с изображениями, означает, что я думаю, что это моя следующая попытка! Спасибо / я согласен с закрытым комментарием, но, похоже, он был повторно открыт (ура!)   -  person Dave    schedule 17.09.2014
comment
Спасибо, @JohnJefferies. Это не так, но это хорошая информация в любом случае.   -  person Dave    schedule 17.09.2014
comment
Я знаю, что это старый вопрос, но я протестировал много вещей с DOMPDF, и я прочитал так много сообщений о медленной обработке изображений, и я обнаружил, что использование png или gif-изображений в Dompdf делает обработку файла очень медленно. Если вам не нужна прозрачность (альфа) для изображений, используйте только изображения в формате jpg, и вы увидите, что генерация PDF будет намного быстрее с dompdf.   -  person otinanai    schedule 21.05.2015


Ответы (3)


Я настоятельно рекомендую вам использовать библиотеку TCPDF. Это довольно быстро и может быть легко интегрировано в CakePHP. Вы можете найти множество примеров того, как включать изображения, штрих-коды и QR-коды в PDF на странице примеров TCPDF.

Для дальнейшего повышения производительности используйте советы с этой страницы:

  • Установите и настройте кешировщик кода операции PHP, такой как XCache;
  • Отредактируйте файл php.ini и увеличьте максимальный объем памяти, который может потреблять скрипт (memory_limit);
  • Отредактируйте файл php.ini и увеличьте максимальное время выполнения каждого скрипта (max_execution_time);
  • Отредактируйте файл config/tcpdf_config.php: вручную установите константы $_SERVER['DOCUMENT_ROOT'], K_PATH_MAIN и K_PATH_URL и удалите часть автоматического расчета;
  • Если вы не используете тайский язык, отредактируйте файл config/tcpdf_config.php и установите для константы K_THAI_TOPCHARS значение false;
  • Если вам не нужны расширенные символы, отредактируйте файл config/tcpdf_config.php и установите шрифты по умолчанию на основные шрифты;
  • Если вам не нужен Юникод UTF-8, установите для параметра $unicode в конструкторе TCPDF значение false, а для параметра $encoding значение «ISO-8859-1» или другую карту символов.
  • По умолчанию TCPDF включает поднабор шрифтов, чтобы уменьшить размер встроенных шрифтов Unicode TTF, этот процесс, который очень медленный и требует много памяти, можно отключить с помощью метода setFontSubsetting(false);
  • По возможности используйте основные шрифты вместо встроенных;
  • Избегайте использования синтаксиса HTML (методы writeHTML и writeHTMLCell), если это не является строго обязательным;
  • Разбивайте большие блоки HTML на более мелкие части;
  • Избегайте использования транзакций, если это не является строго обязательным;
  • Перезапустите веб-сервер после изменений.

Если это не улучшит производительность до приемлемого уровня, вы можете установить приложение CakePHP (или просто скрипт, который запускает генерацию PDF-файлов, если он не использует CakePHP) на втором сервере с более доступными ресурсами и использовать этот сервер только для Генерация PDF.

person bancer    schedule 16.09.2014
comment
Большое спасибо за подробности. Я слышал, что несколько человек упомянули, что это быстро, но нашли ли вы какие-либо данные, подтверждающие это? Попробую TCPDF как можно скорее и отмечу как ответ, если он сработает! :) - person Dave; 17.09.2014

Вы можете попробовать использовать файлы JPEG вместо файлов PNG, если вам не нужна прозрачность.

Например, в TCPDF мне пришлось создать PDF-файл с большим PNG-файлом на заднем плане (18 см x 18 см, 300 точек на дюйм). Мне пришлось ждать 11 секунд, прежде чем файл будет сгенерирован. Я заменил изображение на JPEG того же размера и DPI, и это заняло менее 1 секунды.

person Yorick Hermieu    schedule 04.06.2018
comment
я могу подтвердить это. ранее использование PNG занимало 2+ секунды, после перехода на JPG оно сократилось до 0,1+ мс. не плохо для быстрого решения .. - person RZKY; 14.11.2020

TCPDF также очень медленный с изображениями

person user2573099    schedule 11.02.2017