2012-08-29 10 views
7

Estoy haciendo una generación masiva de archivos PDF basados ​​en plantillas y me encontré con grandes problemas de rendimiento bastante rápido. Mi situación actual es la siguiente:Plantilla a granel basada en generación de PDF en PHP usando pdftk

  1. obtener datos que se rellenan desde db
  2. crear FDF basado en fila de datos única y la forma pdf
  3. escritura .fdf archivo en el disco
  4. fusionar el pdf con FDF utilizando pdftk (comando fill_form con aplanar)
  5. continúe iterando sobre las filas hasta que se generen todos .pdf
  6. todos los archivos generados se fusionan en el final y el único PDF se le da al cliente

utilizo passthru para dar la salida en bruto al cliente (ahorra tiempo al escribir el archivo), pero esto es sólo un poco de mejoras en el rendimiento. El tiempo de operación total es de aproximadamente 50 segundos para 200 registros y me gustaría bajar a por lo menos 10 segundos de alguna manera.

El escenario ideal sería operar todos estos archivos PDF en memoria y no escribir cada uno de ellos en un archivo separado, pero la salida sería imposible ya que no puedo pasar ese tipo de datos a una herramienta externa como pdftk . Otra idea fue generar un gran archivo .fdf con todas esas filas, pero parece que no está permitido.

¿Falta algo muy trivial aquí?

Gracias por cualquier consejo.

PS. Sé que podría usar alguna buena biblioteca como pdflib, pero ahora solo estoy considerando abrir bibliotecas con licencia.

EDIT:

Estoy hasta averiguar la sintaxis para construir un archivo .fdf con varias páginas con el mismo pdf como plantilla, pasaron unas horas y no pudimos encontrar ninguna buena documentación.

+0

puede usar alguna herramienta de creación de perfiles como xdebug con webgrind y ver qué cosa está tomando realmente tiempo (y luego puede resolver eso), caí en la misma situación hace unos días, estaba usando un sistema de colas de código abierto que era tomando tiempo en mi caso. Estaba usando dompdf, que es nuevamente una solución de código abierto. – amitchhajer

+0

Hice el perfilado y lo principal que toma mucho tiempo es escribir pdfs por separado una y otra vez. –

+0

¿Por qué no ejecutar conversiones de 6 o 7 pdftk en paralelo, lo que debería reducir su tiempo total a su límite de 10 segundos? –

Respuesta

1

Después beeing enfrentado con el mismo problema desde hace mucho tiempo (querían para crear mis archivos PDF a base de látex) que finalmente decidió cambiar a otra cruda pero efectiva técnica:

genero mis pdfs en dos pasos: primero Genero html con un motor de plantilla como twig o smarty. segundo uso mpdf para generar pdfs. Probé muchos otros marcos html2pdf y terminé usando mpdf, es muy maduro y está desarrollado desde hace mucho tiempo (actualizaciones frecuentes, funcionalidad completa). el beneficio de usar esta técnica: puede usar css para diseñar sus documentos (mpdf presenta por completo css), que viene junto con el beneficio css (http://www.csszengarden.com) y generar tablas dinámicas muy fácilmente.

Mpdf analiza las tablas html y busca el elemento theader, tfooter y lo coloca en cada página si las tablas son más grandes que un tamaño de página. También tiene la posibilidad de definir elementos de encabezado de página y pie de página con entidades dinámicas como la página nr, etc.

Lo sé, usar este desvío parece ser una solución, pero para ser honesto, no hay látex, pdf ¡Cualquiera que sea el motor es tan fuerte y simple como html!

0

Pruebe una biblioteca de menor complejidad diferente como FPDF (http://www.fpdf.org/)

Me parece bastante bueno y ligero.

Busque siempre bibliotecas que sean pequeñas y solo hagan lo que necesitan que hagan.

Cuanto más grande es la biblioteca, más recursos consume.

+0

Sí, he visto y usado esas bibliotecas (fpdf, tcpdf, dompdf), pero no hacen lo que necesito. Tengo que generar un gran PDF basado en una plantilla en PDF y completarlo con datos. Ninguna de estas bibliotecas hace esto. Son buenos para crear un pdf propio desde cero, pero no para crear plantillas. –

+0

Luego debería considerar generarlos uno por uno en diferentes llamadas PHP para asegurar que la memoria se borre después de cada generación. Asegúrese de que, incluso cuando genere, borre cualquier variable grande. Tal vez incluso una solución que no sea PHP. – transilvlad

0

Esto no ayudará con el problema de varias páginas, pero observo que pdftk acepta el carácter - que significa 'leer desde la entrada estándar'.

Puede enviar el .fdf al proceso pdftk a través de su código fuente, para evitar tener que escribirlos en el disco.