2011-09-29 26 views
8

Estoy usando Pisa para convertir HTML a PDF (en un proyecto de Django). Es muy lento cuando se manejan tablas que abarcan varias páginas:Convertidor de Pisa pdf es muy lento con tablas grandes

una tabla de 200 filas requiere hasta 150 segundos para convertirse, mientras que se tardan 15 segundos si la divido en tablas más pequeñas.

¿Hay consejo o mejores prácticas para la construcción de tablas HTML para ser manejado por Pisa?

+0

podría no ser de ayuda, pero ¿ha mirado wkhtmltopdf? – Matt

+0

tal vez voy a echar un vistazo en él si no hay otra solución posible: he elegido Pisa debido a su integración con Django ... – Don

+2

Fwiw que hacer algunos documentos que están basados ​​mesa pero sólo alrededor de una página de contenidos que se cargan casi al instante, pero los informes que hago que tienen cerca de 1300 filas y abarcan 50 páginas toman casi 30 segundos. ¿Qué tenedor estás usando? Puedo tratar [ChrisGlass/Xhtml2pdf] (https://github.com/chrisglass/xhtml2pdf/tree/xhtml2pdf-refactor) para ver si ha mejorado el [VO] no permanente (https://github.com/ holtwick/xhtml2pdf) –

Respuesta

7

Tuve el mismo problema. El documento era solo una página principal y una gran mesa. El tiempo de procesamiento de PDF aumentaba exponencialmente con el tamaño de mi tabla de contenido.

Hice una lista de cosas que echa un vistazo a lo que podría ser el problema

lo hice tiempo simple en mi función de representación en PDF (ya que podría ser la representación HTML, pasándolo a StringIO, o la creación de la respuesta HTTP), y notó que la llamada a pisa.pisaDocument tomó 60 segundos para regresar. Hice una lista de verificación de las cosas que podrían ser el problema y trabajé en cada una de ellas. La lista de verificación incluía Imágenes, CSS, Complejidad de marcado y Marcos.

Imágenes apenas se ven afectados el tiempo de presentación (que sólo tenía una por página, por lo que tu caso es distinto). Tampoco lo hizo Marcos.

marcado complejidad era el principal problema de mi plantilla. Al parecer pisa hará que varias columnas en una tabla muy, muy lentamente

La mesa estaba tomando demasiado tiempo para hacer, pero me di cuenta de que si dividir la tabla en tablas más pequeñas, el tiempo de presentación no aumentó exponencialmente más, y el tiempo que tomó para renderizar todo se redujo a la mitad. He utilizado el código de abajo en mi plantilla de Django:

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

edición: Esta corrección no funciona bien con la repetición de los encabezados de tabla por lo que si usted está haciendo repeat="1" usted tiene que saber exactamente cuántas filas para encajar en cada página.

Además, he tenido este monstruo de un selector en mi 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{ 
     ... 
    } 

cambiándola a * {...} la prestación aceleró un poco. Esto fue contra-intuitivo ya que los navegadores no mostrarán tu página tan rápido cuando usas el selector * que cuando estás usando el monstruo anterior.

También, por alguna razón, la fusión de las dos de páginas <style> etiquetas en una sola etiqueta disminuyeron el tiempo de renderizado, también.

+0

También terminé dividiendo mis tablas, pero hay casos en los que no puedo decir con anticipación cuántas filas se ajustan a una sola página – Don

+1

Para mi caso, no importa. Solo tengo que rezar para que nadie me diga que repita los encabezados de tabla, porque esta corrección no funciona con repeat = "1" –

+0

Romper la tabla me dio una velocidad ~ 3x aumento. Creo que la lentitud puede deberse a un problema en Reportlab - https://groups.google.com/forum/#!topic/xhtml2pdf/vUoq1IRauvg –