Как обрабатывать чрезвычайно большие строки в PHP при создании PDF - PullRequest
2 голосов
/ 26 августа 2010

У меня есть отчет, который может сгенерировать более 30 000 записей, если дать достаточно большой диапазон дат.С точки зрения HTML, такой большой набор результатов не является проблемой, так как я реализую систему разбивки на страницы, которая ограничивает видимые результаты до 100 в данный момент времени.

Моя настоящая проблема возникает, когда пользователь нажимает «Get»PDF "кнопка.Когда это происходит, я, по сути, повторно запускаю часть отчета, в которой печатает данные (результаты самого отчета хранятся в таблице «сохранения», поэтому нет необходимости повторно запускать данные -сбора логики) и сохраните результаты в переменной с именем $html.Помните, что теперь эта переменная содержит 30 000 записей данных, а также HTML-код, необходимый для правильного форматирования в PDF.После создания этой HTML-строки я передаю ее в TCPDF, чтобы попытаться сгенерировать PDF-файл для пользователя.Однако вместо создания PDF-файла он просто выводится без сообщения об ошибке («Генерация PDf ...») исчезает, и система действует так, как будто вы никогда не просили его что-либо делать.

Через тестыЯ обнаружил, что проблема заключается в размере передаваемой переменной $html. Если отчет в 3K записей, он работает нормально.Если это все из-за этого, HTML-версия отчета будет напечатана, но не PDF.

Полезная информация

  • PHP 5.3
  • TCPDFдля создания PDF (также пробовал PS2PDF)
  • Ограничение памяти скрипта: 500 МБ

Как бы вы справились с такой шкалой данных при создании PDF такого размера?

Ответы [ 4 ]

1 голос
/ 26 января 2012

Используете ли вы метод writeHTML?

Я ознакомился с рекомендациями по производительности здесь: http://www.tcpdf.org/performances.php

Там написано: «Разделите большие блоки HTML на более мелкие части».

Я обнаружил, что если мои блоки HTML превышают 20 000 символов, создание PDF займет более 2 минут.

Я просто разделил свой html на блоки и вызвал writeHTML для каждого блока, и он значительно улучшился. Файл, который не будет сгенерирован за 2 минуты, теперь занимает 16 секунд.

1 голос
/ 10 января 2012

Вот как я решил эту проблему: я заметил, что у некоторых строк, которые были у меня в выводе HTML, были некоторые небольшие проблемы с кодированием - я запустил htmlentities для этих конкретных строк, когда я запрашивал База данных для них, и это решило проблему.

Не знаю, было ли это причиной вашей проблемы, но мой опыт был очень похожим - когда я пытался вывести таблицу HTML большого размера, содержащую около 80 000 строк, TCPDF отображал заголовок страницы, но ничего связанного с таблицей. Такое поведение будет одинаковым для разных наборов данных и разных структур таблиц.

После многих попыток я начал добавлять свою собственную нумерацию страниц - каждые 15 строк таблицы я разбивал страницу и добавлял новую таблицу на следующую страницу. Именно тогда я заметил, что время от времени я получаю пустые страницы между большим количеством полных и правильных. Именно тогда я понял, что должна быть проблема с этими конкретными подмножествами данных, и обнаружил проблему с кодировкой. Возможно, у вас было что-то похожее, и TCPDF не давал понять, в чем ваша проблема.

0 голосов
/ 26 августа 2010

TCPDF, кажется, является родной реализацией генерации PDF в PHP. Вы можете добиться лучшей производительности, используя скомпилированную библиотеку, такую ​​как PDFlib , или приложение командной строки, например htmldoc . Последний будет иметь лучшие шансы на создание большого PDF.

Кроме того, вы разбиваете выходной PDF на несколько страниц? То есть TCPDF знает, что нужно взять один HTML-документ и разрезать его на несколько страниц, или вы генерируете несколько HTML-файлов для его объединения в один PDF-документ? Это также может помочь.

0 голосов
/ 26 августа 2010

Я бы разбил PDF на части, как нумерация страниц.

1) Используйте кнопку «Получить PDF» на каждой постраничной HTML-странице и разрешайте загрузку записей только с этой HTML-страницы.

2) Ограничить максимальное количество записей, которые могут быть загружены. Если максимальный предел достигнут, разделите файл PDF и позвольте пользователю загрузить несколько файлов PDF.

...