2012-08-29 20 views
7

Sto facendo una generazione di massa di file PDF basati su modelli e ho incontrato grandi problemi di prestazioni piuttosto velocemente. mio scenario attuale è la seguente:Generazione di PDF basato su modello di massa in PHP utilizzando pdftk

  1. ottenere i dati da compilare da db
  2. creare DFF sulla base di un'unica riga di dati e la forma pdf
  3. scrittura .fdf file su disco
  4. unire il pdf con fdf utilizzando pdftk (fill_form con il comando Appiattisci)
  5. continuano iterare sopra le righe fino a quando tutte .pdf 's sono generate
  6. tutti i file generati vengono uniti insieme in la fine e l'unico PDF è dato al cliente

Io uso passthru per dare l'uscita prima al cliente (risparmio di tempo del file di scrittura), ma questo è solo un po 'di miglioramenti delle prestazioni. Il tempo di operazione totale è di circa 50 secondi per 200 record e mi piacerebbe scendere a almeno 10 secondi in qualche modo.

Lo scenario ideale sarebbe utilizzare tutti questi PDF in memoria e non scrivere ognuno di essi per separare il file, ma l'output sarebbe impossibile da eseguire poiché non posso passare questo tipo di dati a uno strumento esterno come pdftk . Un'altra idea era quella di generare un grande file .fdf con tutte quelle righe, ma sembra che non sia permesso.

Mi manca qualcosa di molto banale qui?

Sono felice per qualsiasi consiglio.

PS. So che potrei usare qualche buona libreria come pdflib ma sto considerando solo le librerie con licenza aperta ora.

EDIT:

Sono fino a capire la sintassi per creare un file .fdf con più pagine che utilizzano lo stesso formato pdf come modello, ha trascorso qualche ora e non abbiamo trovato nessuna buona documentazione.

+0

puoi usare qualche strumento di profilatura come xdebug con webgrind e vedere cosa sta effettivamente richiedendo del tempo (e poi puoi risolverlo), sono caduto nella stessa situazione pochi giorni fa, stavo usando un sistema di accodamento open source che era prendendo tempo nel mio caso. Stavo usando dompdf che è di nuovo una soluzione open source. – amitchhajer

+0

Ho fatto la profilazione e la cosa principale che richiede molto tempo è la scrittura di pdf separati più e più volte. –

+0

Perché non eseguire solo 6 o 7 conversioni pdftk in parallelo che dovrebbero impiegare il tempo totale fino al limite di 10 secondi. –

risposta

1

Dopo beeing affrontato con lo stesso problema per un lungo periodo (voluto per generare i miei file PDF sulla base di LaTeX) ho finalmente deciso di passare ad un'altra tecnica grezza ma efficace:

ho generare i miei file PDF in due fasi: in primo luogo Generare HTML con un motore di template come twig o smarty. secondo io uso mpdf per generare pdf da esso. Ho provato molti altri framework html2pdf e ho finito con l'utilizzo di mpdf, è molto maturo e viene sviluppato da molto tempo (aggiornamenti frequenti, funzionalità avanzate). il vantaggio di usare questa tecnica: puoi usare css per progettare i tuoi documenti (mpdf ha tutte le funzionalità di css) - che viene fornito con il vantaggio css (http://www.csszengarden.com) e generare tabelle dinamiche molto semplici.

Mpdf analizza le tabelle html e cerca il theader, elemento tfooter e lo inserisce in ogni pagina se le tabelle sono più grandi di una dimensione di pagina. Inoltre hai la possibilità di definire elementi di intestazione di pagina e piè di pagina con entità dinamiche come pagina nr e così via.

so, l'uso di questa deviazione sembra essere una soluzione, ma a dire il vero, nessun lattice, pdf qualunque motore sia forte e semplice come html!

0

provare un diverso biblioteca meno complesso come FPDF (http://www.fpdf.org/)

lo trovo abbastanza bene e lite.

Trova sempre le librerie piccole e fai solo ciò che ti serve.

Più grande è la libreria più risorse consuma.

+0

Sì, ho visto e usato quelle librerie (fpdf, tcpdf, dompdf), ma non fanno quello che mi serve. Devo generare un grande PDF basato su un modello PDF e compilarlo con i dati. Nessuna di queste librerie lo fa. Sono buoni per creare il proprio pdf da zero, ma non per il template. –

+0

Quindi dovresti considerare di generarli uno ad uno in diverse chiamate PHP per garantire che la memoria venga cancellata dopo ogni generazione. Assicurati anche quando generi che cancelli qualsiasi variabile grande. Forse anche una soluzione non PHP. – transilvlad

0

Questo non aiuterà il problema di più pagine, ma noto che pdftk accetta il carattere - per indicare 'lettura da input standard'.

Potrebbe essere possibile inviare il .fdf al processo pdftk tramite il suo stdin, per evitare di doverli scrivere sul disco.