Пиза pdf конвертер очень медленный с большими таблицами - PullRequest
8 голосов
/ 29 сентября 2011

Я использую Pisa для преобразования HTML в PDF (в проекте Django).Это очень медленно при обработке таблиц, которые охватывают несколько страниц:

для таблицы из 200 строк требуется до 150 секунд для преобразования, а для разделения таблицы на более мелкие таблицы - 15 секунд.

Существуют ли советы или рекомендации по созданию таблиц HTML, которые будут обрабатываться Pisa?

1 Ответ

7 голосов
/ 14 декабря 2012

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

Я составил список вещей, чтобы проверить, в чем может быть проблема

Я сделал простую синхронизацию с моей функцией рендеринга PDF (поскольку это мог быть рендеринг HTML, передача его в StringIO или создание ответа HTTP), и заметил, что вызов pisa.pisaDocument вернул 60 секунд. Я сделал контрольный список вещей, которые могут быть проблемой, и работал над ними каждый. Контрольный список включал изображения, CSS, сложность разметки и фреймы.

Изображения практически не влияли на время рендеринга (у меня было только одно на страницу, поэтому YMMV). Ни один не сделал Рамки.

Сложность разметки была главной проблемой моего шаблона. Очевидно, что Пиза будет очень, очень медленно отображать несколько столбцов в таблице

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

    {% if forloop.counter|divisibleby:20 %}</table><table>{% endif %}

edit: Это исправление не работает с повторяющимися заголовками таблицы, поэтому, если вы делаете repeat="1", вы должны точно знать, сколько строк поместится на каждой странице.

Кроме того, у меня был этот монстр селектора в моем CSS:

    html, body, div, span, applet, object, iframe,
    h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    a, abbr, acronym, address, big, cite, code,
    del, dfn, em, img, ins, kbd, q, s, samp,
    small, strike, strong, sub, sup, tt, var,
    b, u, i, center,
    dl, dt, dd, ol, ul, li,
    fieldset, form, label, legend,
    table, caption, tbody, tfoot, thead, tr, th, td,
    article, aside, canvas, details, embed,
    figure, figcaption, footer, header, hgroup,
    menu, nav, output, ruby, section, summary,
    time, mark, audio, video{
        ...
    }

Изменив его на * {...}, рендеринг немного ускорился. Это было нелогично, так как браузеры не будут отображать вашу страницу быстрее, когда вы используете селектор *, чем когда вы используете вышеупомянутого монстра.

Кроме того, по какой-то причине объединение двух встроенных тегов <style> в один тег также уменьшило время рендеринга.

...