我正在使用Pisa将HTML转换为PDF(在Django项目中)。 处理跨越多个页面的表时,它非常慢:
一个200行的表需要150秒才能转换,而如果我把它拆分成更小的表需要15秒。
是否有建议由比萨处理的HTML表格的提示或最佳做法?
答案 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>
标记合并到一个标记中也会缩短渲染时间。