我有同样的问题。这份文件只是一个首页和一张巨大的桌子。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>
标签合并为一个标签也减少了呈现时间。