Массовая генерация pdf на основе шаблонов в PHP с использованием pdftk
Я занимаюсь массовым созданием PDF-файлов на основе шаблонов, и у меня довольно быстро возникли большие проблемы с производительностью. Мой текущий сценарий выглядит следующим образом:
- получить данные для заполнения из базы данных
- создайте fdf на основе одной строки данных и формы pdf
- запись
.fdf
файла на диск - объединить pdf с fdf с помощью pdftk (заполнить форму с помощью команды выравнивания)
- продолжайте перебирать строки, пока не будут сгенерированы все
.pdf
- все сгенерированные файлы являются в конце концов, они объединяются вместе, и один pdf-файл передается клиенту
Я использую passthru
для предоставления необработанного вывода клиенту (экономит время на запись файла), но это всего лишь небольшое улучшение производительности. Общее время работы составляет около 50 секунд для 200 записей, и я хотел бы каким-то образом сократить время хотя бы до 10 секунд.
Идеальным сценарием было бы использовать все эти PDF-файлы в памяти, а не записывать каждый из них в отдельный файл, но тогда вывод будет это невозможно сделать, так как я не могу передавать такие данные во внешний инструмент, такой как pdftk.
Еще одна идея состояла в том, чтобы создать один большой файл .fdf
со всеми этими строками, но, похоже, это запрещено.
Я упускаю здесь что-то очень тривиальное?
Я благодарен за любой совет.
ПС. Я знаю, что мог бы использовать какую-нибудь хорошую библиотеку, такую как pdflib, но сейчас я рассматриваю только открытые лицензированные библиотеки.
РЕДАКТИРОВАТЬ:
Я собираюсь выяснить синтаксис для построения .fdf
файл с несколькими страницами, использующий один и тот же pdf-файл в качестве шаблона, потратил несколько часов и не смог найти никакой хорошей документации.
3 answers
После того, как я долгое время сталкивался с одной и той же проблемой (хотел создать свои PDF-файлы на основе LaTeX), я, наконец, решил переключиться на другой грубый, но эффективный метод:
Я создаю свои PDF-файлы в два этапа: сначала я создаю html с помощью механизма шаблонов, такого как twig или smarty. во-вторых, я использую mpdf для создания PDF-файлов из него. Я пробовал многие другие фреймворки html2pdf и в итоге использовал mpdf, он очень зрелый и разрабатывается с давних пор (частые обновления, богатый функциональность). преимущество использования этой техники: вы можете использовать css для создания своих документов (mpdf полностью поддерживает css), что сопровождается преимуществом css (http://www.csszengarden.com) и очень легко создавать динамические таблицы.
Mpdf анализирует таблицы html и ищет элемент theader, tfooter и помещает его на каждую страницу, если ваши таблицы больше одного размера страницы. Также у вас есть возможность определять элементы верхнего и нижнего колонтитулов страницы с помощью динамических объектов, таких как номер страницы и так далее.
Я знаю, что использование этого обхода кажется обходным путем, но, честно говоря, никакой движок latex, pdf, какой бы он ни был, такой же сильный и простой, как html!
Попробуйте другую, менее сложную библиотеку, такую как fpdf (http://www.fpdf.org/)
Я нахожу его довольно хорошим и легким.
Всегда находите небольшие библиотеки и делайте только то, что вам нужно.
Чем больше библиотека, тем больше ресурсов она потребляет.
Это не поможет вашей многостраничной проблеме, но я замечаю, что pdftk принимает символ -
, означающий "чтение со стандартного ввода".
Возможно, вы сможете отправить .fdf
процессу pdftk через его стандартный вход, чтобы избежать необходимости записывать их на диск.