比萨pdf转换器使用大型表格非常慢

时间:2011-09-29 09:04:21

标签: django pdf-generation html-table pisa xhtml2pdf

我正在使用Pisa将HTML转换为PDF(在Django项目中)。 处理跨越多个页面的表时,它非常慢:

一个200行的表需要150秒才能转换,而如果我把它拆分成更小的表需要15秒。

是否有建议由比萨处理的HTML表格的提示或最佳做法?

1 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。该文件只是一个头版和一张巨大的桌子。随着我的内容表的大小,PDF渲染时间呈指数级增长。

我制作了一份清单,列出了哪些可能是问题

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

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

标记复杂性是我模板的主要问题。显然,pisa会非常非常缓慢地在表格中呈现几列

表格花了太多时间来渲染,但我注意到如果我将表格拆分成较小的表格,渲染时间不再呈指数级增长,渲染所有内容的时间减少了一半。我在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>标记合并到一个标记中也会缩短渲染时间。