2011-09-29 6 views
8

Sto usando Pisa per convertire l'HTML in PDF (in un progetto Django). È molto lento quando si gestiscono tabelle che si estendono su più pagine:Il convertitore pdf di Pisa è molto lento con i grandi tavoli

una tabella di 200 righe richiede fino a 150 secondi per essere convertita, mentre ci vogliono 15 secondi se la divido in tabelle più piccole.

Ci sono suggerimenti o best practice per la creazione di tabelle HTML da gestire da Pisa?

+0

potrebbe non essere d'aiuto ma hai guardato wkhtmltopdf? – Matt

+0

Forse dovrei dare un'occhiata se nessuna altra soluzione è possibile: ho scelto Pisa per la sua integrazione con Django ... – Don

+2

FWIW Realizzo alcuni documenti basati su tabelle ma solo su una pagina di contenuti che carica quasi istantaneamente, ma i rapporti che faccio che hanno quasi 1300 righe e si estendono su 50 pagine richiedono quasi 30 secondi. Quale forcella stai usando? Potrei provare [ChrisGlass/Xhtml2pdf] (https://github.com/chrisglass/xhtml2pdf/tree/xhtml2pdf-refactor) per vedere se è migliorato rispetto alla versione originale non mantenuta (https://github.com/) holtwick/xhtml2pdf) –

risposta

7

Ho avuto lo stesso problema. Il documento era solo una prima pagina e un enorme tavolo. Il tempo di rendering PDF aumentava esponenzialmente con la dimensione della mia tabella di contenuti.

Ho fatto una lista di cose da controllare, che potrebbe essere il problema

ho fatto semplice sincronizzazione sulla mia funzione di rendering PDF (dal momento che potrebbe essere il rendering HTML, di passarlo a StringIO, o la creazione di risposta HTTP), e ha notato che la chiamata a pisa.pisaDocument ha impiegato 60 secondi per tornare. Ho fatto una lista di cose che potrebbero essere il problema, e ho lavorato su ognuna di esse. La checklist includeva immagini, CSS, complessità di markup e frame.

Le immagini hanno interessato a malapena il tempo di rendering (ne avevo solo una per pagina, quindi YMMV). Neanche Frames.

La complessità del markup era il problema principale del mio modello. Apparentemente pisa renderà molte colonne in una tabella molto, molto lentamente

La tabella impiegava troppo tempo per il rendering, ma ho notato che se dividevo la tabella in tabelle più piccole, il tempo di rendering non aumentava più esponenzialmente, e il tempo necessario per rendere tutto è stato tagliato a metà. Ho usato il codice qui sotto nel mio modello Django:

{% if forloop.counter|divisibleby:20 %}</table><table>{% endif %} 

edit: Questa correzione non funziona bene con la ripetizione intestazioni di tabella, quindi se si sta facendo repeat="1" dovete sapere esattamente quante righe per adattarsi in ogni pagina.

Inoltre, ho avuto questo mostro di un selettore a mio 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{ 
     ... 
    } 

Cambiando al * {...} il rendering accelerato un po '. Questo è stato contro-intuitivo dal momento che i browser non renderanno la tua pagina altrettanto veloce quando si utilizza il selettore * rispetto a quando si utilizza il mostro di cui sopra.

Inoltre, per qualche motivo, la fusione di due tag in-page <style> in un tag ha diminuito anche il tempo di rendering.

+0

Ho anche finito con il dividere i miei tavoli, ma ci sono casi in cui non posso dire in anticipo quante righe si adattano a una singola pagina – Don

+1

Per il mio caso, non importa. Devo solo pregare che nessuno mi dica di ripetere le intestazioni della tabella, perché questa correzione non funziona con repeat = "1" –

+0

Rompere il tavolo mi ha dato una velocità ~ 3x aumento. Penso che la lentezza potrebbe essere dovuta a un problema all'interno di Reportlab - https://groups.google.com/forum/#!topic/xhtml2pdf/vUoq1IRauvg –