Как я могу писать большие PDF-файлы быстро и эффективно, используя mPDF? - PullRequest
2 голосов
/ 13 февраля 2020

Я обновляю приложение, используя старую версию fPDF, до последней версии 8 mPDF.

Мой вопрос заключается в том, как уменьшить обсуждаемую медленность с помощью таблиц HTML в mPDF.

В текущем коде fPDF используется метод Cell , и файл PDF создается менее чем за секунду. Для сравнения: при написании некоторого простого HTML для использования в mPDF аналогичный PDF-файл генерируется примерно за 12-15 секунд.

В моем тестировании используется около 3500 записей, но для некоторых результатов это может легко привести к записи 10 тыс. *. 1009 *

Загрузка

Я загружаю объект mpdf следующим образом;

$mpdf = new \Mpdf\Mpdf(array(
    "tempDir" => "/tmp/pdf",
    "mode" => "utf-8",
    "format" => "Letter-P",
    "margin_left" => "10",
    "margin_top" => "10",
    "margin_right" => "10",
    "margin_bottom" => "10"
));
$mpdf->WriteHTML(file_get_contents("css/pdf.css"), \Mpdf\HTMLParserMode::HEADER_CSS);
$mpdf->simpleTables = true;

Мой css / pdf. css file

.cdrTable {
    width: 25cm;
}

.cdrTable td {
    text-align: center;
}

Writing

Я сохранил HTML как можно более простым, чтобы предотвратить любые проблемы с автоматическим изменением размера.

Сохраните это html в переменной и запишите один раз, используя $ mpdf-> Write HTML ($ html);

<h2>Results for this run</h2>
<p><strong>Sources are:</strong>
   [pbx] From PBX &nbsp;
   [sdc] From DC
</p>

Сохраните таблицу из 50 записей и запишите один раз, используя $ mpdf-> Write HTML ($ html);

<table class='cdrTable'>
   <tr>
      <th>#</th>
      <th>Call Started</th>
      <th>Call From</th>
      <th>Call To</th>
      <th>Duration</th>
      <th>Ext</th>
      <th>Ext Label</th>
      <th>Data Src</th>
   </tr>
   <tr>
      <td>1</td>
      <td>02-07-2020 04:52:39 PM</td>
      <td>Polycom VVX601 [11]</td>
      <td>Conference [86]</td>
      <td>0:13</td>
      <td>101</td>
      <td>My Phone</td>
      <td>pbx</td>
   </tr>
   .. Up to 50 records ..
</table>

Сохраните html в переменной и запишите один раз, используя $ mpdf-> Write HTML ($ html);

<table>
   <tr>
      <td>3555 records matched</td>
      <td>Total: 1965:11</td>
   </tr>
</table>

Наконец

$ mpdf-> Output ("report") .pdf ", \ Mpdf \ Output \ Destination :: DOWNLOAD);

Заключение

Вывод этого в браузер происходит быстро; Peak Mem: 6,82 M, время: 0,055243015289307

Создание PDF не так быстро; Пиковая память: 14,52 М, время: 13,560908079147

Я попытался записать 100, 200, 1000 и весь набор результатов одновременно без большой разницы во времени.

Могу ли я что-нибудь сделать чтобы сделать это быстрее?
Должен ли я использовать что-то кроме HTML таблиц или пропустить вообще с помощью HTML?

...