CakePHP 3 Плагин CakePDF: Создание большого PDF-файла путем циклического просмотра содержимого? - PullRequest
0 голосов
/ 04 сентября 2018

Таким образом, мои проблемы связаны с попытками генерировать большие PDF-файлы, но из-за ограничения по времени / времени выполнения в PHP, объем данных слишком велик, чтобы просто расширить эти ограничения, поэтому решение не может быть и речи.

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

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

В настоящее время я использую плагин CakePDF (v.3.5) для CakePHP 3 (v.3.5.13), но изо всех сил пытаюсь найти решение, которое позволяет рендерить некоторые данные и затем добавлять дополнительные данные к тому же PDF. Кто-нибудь справился с этим раньше или это выходит за рамки плагина? Будет ли другое решение создать несколько файлов PDF, а затем объединить их после создания всех отдельных файлов PDF?

Это скорее теоретический вопрос, сработает ли это, и если кто-то справился с этим раньше. У меня не так много кода, чтобы показать, но если потребуется больше деталей, напишите мне, и я постараюсь получить что-то для вас или пример кода!

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

У меня нет непосредственного опыта работы с этой версией CakePdf, но в CakePHP 2.x я использую движок wkhtmltopdf, который использует вывод .html для создания PDF.

Если ваша оболочка генерирует такой .html порциями, ее легко добавить. Конечно, wkhtmltopdf может создать некоторую нагрузку на компьютер для создания PDF, но, поскольку это двоичный файл, это происходит вне ограничений памяти / времени PHP.

0 голосов
/ 07 сентября 2018

Я думал, что опубликую то, что я в конечном итоге сделаю для кого-нибудь в будущем.

Я использовал CakePDF для создания меньших PDF-файлов, которые я хранил в каталоге tmp. Все они находятся под ограничением времени выполнения PHP и ограничений памяти, поскольку я не верю, что их изменение обеспечивает хорошее решение. На этом этапе я также сохранил имена всех PDF-файлов, сгенерированных для использования на следующем шаге. Код для этого выглядел примерно так:

while (!is_last_pdf) {
    // Generate pdf in here with a portion of the data
    $CakePdf = new CakePdf();
    $CakePdf->template('page', 'default');
    $CakePdf->viewVars(compact('data', 'other_stuff'));

    // Save file name to array
    $tmp_file_list[] = $file_name;

    // Update the is_last_pdf variable 
    is_last_pdf = check_for_more_data();
}

Из этого я использовал GhostScript из командной консоли для объединения всех файлов PDF, код для этого выглядел примерно так:

$output_path = 'output.pdf';
$file_list = '';

// Create a string of all the files to merge
foreach ($tmp_file_list as $file) {
    $file_list .= $file . ' ';
}

// Execute GhostScript to merge all the files into the `output.pdf` file
exec('gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=' . $output_path . ' ' . $file_list);

Весь код был в файле Shell, отвечающем за создание PDF.

Надеюсь, это кому-нибудь поможет:)

0 голосов
/ 05 сентября 2018

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

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

...