2011-09-29 36 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 –