9

I'm using Pisa to convert HTML to PDF (in a Django project). It is very slow when handling tables that span over multiple pages:

a 200-rows table takes up to 150 seconds to be converted, while it takes 15 seconds if I split it into smaller tables.

Are there tips or best practices for building HTML tables to be handled by Pisa?

4

1 回答 1

8

我有同样的问题。这份文件只是一个首页和一张巨大的桌子。PDF 渲染时间随着我的内容表的大小呈指数增长。

我列了一个清单来检查可能是什么问题

我对我的 PDF 渲染函数进行了简单的计时(因为它可能是 HTML 渲染、将其传递给 StringIO 或创建 HTTP 响应),并注意到 pisa.pisaDocument 调用确实需要 60 秒才能返回。我做了一个可能是问题的清单,并逐一处理。清单包括图像、CSS、标记复杂性和框架。

图像几乎不影响渲染时间(我每页只有一个,所以 YMMV)。Frames也没有。

标记复杂性是我的模板的主要问题。显然比萨会非常非常缓慢地渲染表格中的几列

渲染表格花费了太多时间,但我注意到如果我将表格拆分为更小的表格,渲染时间不再呈指数增长,渲染所有内容所需的时间减少了一半。我在我的 Django 模板中使用了以下代码:

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

编辑:此修复不适用于重复的表格标题,因此如果您这样做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>标签合并为一个标签也减少了呈现时间。

于 2012-12-14T12:41:32.467 回答