2011-09-29 34 views
8

我使用比萨将HTML转换为PDF(在Django项目中)。 处理跨越多个页面的表格时速度很慢:比萨pdf转换器很慢,大表

一个200行的表格最多需要150秒才能转换,而如果将其分割为更小的表格,则需要15秒。

是否有构建HTML表格的技巧或最佳实践由比萨处理?

+0

它可能不会帮助,但你有没有看过wkhtmltopdf? – Matt

+0

也许我会看看它,如果没有其他解决方案是可能的:我选择了比萨,因为它与Django集成... – Don

+2

FWIW我制作了一些基于表格的文档,但只包含一页内容,即时的,但我所做的接近1300行,跨度为50页的报告几乎需要30秒。你正在使用哪种分岔?我可以尝试[ChrisGlass/Xhtml2pdf](https://github.com/chrisglass/xhtml2pdf/tree/xhtml2pdf-refactor)查看它是否改进了非维护的[原始版本](https://github.com/ holtwick/xhtml2pdf) –

回答

7

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

我做的事情的清单来看看这可能是问题的

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

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

标记复杂性是我的模板的主要问题。显然比萨会在一张桌子上非常非常缓慢地渲染几列

该表需要花费太多时间进行渲染,但我注意到如果将表格拆分成更小的表格,渲染时间不会再呈指数级增长,把所有东西都花在了一半。我用下面的代码在我的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>标签合并为一个标签也会减少渲染时间。

+0

我也最终分裂了我的表格,但有些情况下,我无法事先告诉有多少行适合单个页面 – Don

+1

对我而言,这并不重要,我只需要祈祷没有人告诉我重复表格标题,因为这个修正不适用于repeat =“1” –

+0

分解表格给了我一个3倍速度我认为缓慢可能是由于Reportlab内的一个问题 - https://groups.google.com/forum/#!topic/xhtml2pdf/vUoq1IRauvg –