2012-08-29 5 views
7

Ich mache eine Massengenerierung von PDF-Dateien basierend auf Vorlagen und ich lief ziemlich schnell auf große Leistungsprobleme. Mein aktuelles Szenario ist wie folgt:Bulk-Vorlage basierte PDF-Generierung in PHP mit pdftk

  1. erhalten Daten von gefüllt werden db
  2. fdf erstellen basierend auf einzelne Datenreihe und PDF-Formular
  3. Schreib .fdf Datei auf der Festplatte
  4. das pdf mit fdf fusionieren mit pdftk (fill_form mit flatten Befehl)
  5. weiter über Zeilen iterieren, bis alle .pdf 's generiert werden
  6. alle generierten Dateien zusammen in zusammengeführt werden das Ende und die einzelne pdf an den Client gegeben

I passthru verwenden, um die Roh-Ausgabe an den Client (spart Zeit mit dem Schreiben-Datei), aber dies ist nur eine wenig Performance-Verbesserungen zu geben. Die Gesamtbetriebszeit beträgt ungefähr 50 Sekunden für 200 Aufzeichnungen und ich möchte auf irgendeine Weise auf mindestens 10 Sekunden herunterkommen. Das ideale Szenario wäre, all diese PDFs im Speicher zu betreiben und nicht jeden einzelnen in eine separate Datei zu schreiben, aber dann wäre die Ausgabe unmöglich, da ich diese Art von Daten nicht an ein externes Werkzeug wie pdftk weitergeben kann . Eine andere Idee war es, eine große .fdf Datei mit all diesen Zeilen zu generieren, aber es sieht so aus, als wäre das nicht erlaubt.

Fehle mir hier etwas sehr Triviales?

Ich bin dankbar für jeden Hinweis.

PS. Ich weiß, dass ich eine gute Bibliothek wie Pdflib verwenden könnte, aber ich denke jetzt nur über offene lizensierte Bibliotheken nach.

EDIT:

Ich bin bis zu der Syntax, herauszufinden, eine .fdf Datei mit mehreren Seiten erstellen die gleiche pdf als Vorlage verwenden, verbrachte einige Stunden und konnte keine gute Dokumentation.

+0

können Sie einige Profiling-Tool wie xdebug mit webgrind verwenden und sehen, welche Sache tatsächlich dauert (und dann können Sie das lösen), fiel ich in der gleichen Situation ein paar Tage zurück, war ein Open Source Queueing-System, das war in meinem Fall Zeit nehmen. Ich habe dompdf verwendet, was wiederum eine Open-Source-Lösung ist. – amitchhajer

+0

Ich habe das Profiling gemacht und die Hauptsache, die viel Zeit in Anspruch nimmt, ist das separate Schreiben von PDFs. –

+0

Warum sollten Sie nicht einfach 6 oder 7 Pdfk-Konvertierungen parallel ausführen, die Ihre Gesamtzeit auf 10 Sekunden reduzieren sollten? –

Antwort

1

Nachdem mit dem gleichen Problem für eine lange Zeit konfrontiert beeing (wollte meine pdfs erzeugen, basierend auf LaTeX) i schließlich auf eine andere grobe, aber effektive Technik wechseln entschieden:

ich meine pdfs in zwei Schritten erzeugen: erste Ich erzeuge HTML mit einer Vorlage-Engine wie twig oder Smarty. Zweitens benutze ich mpdf, um daraus PDFs zu generieren. Ich probierte viele andere html2pdf Frameworks und endete mit mpdf, es ist sehr ausgereift und wird seit langer Zeit entwickelt (häufige Updates, umfangreiche Funktionalität). der nutzen dieser technik: mit css können sie ihre dokumente gestalten (mpdf komplett features css) - das kommt mit dem css benefit (http://www.csszengarden.com) zusammen und generiert sehr einfach dynamische tabellen.

Mpdf analysiert die HTML-Tabellen und sucht nach dem Element theader, tfooter und fügt es auf jeder Seite ein, wenn Ihre Tabellen größer als eine Seitengröße sind. Außerdem haben Sie die Möglichkeit, Seitenkopf- und Seitenfußelemente mit dynamischen Elementen wie Seite nr usw. zu definieren.

ich weiß, mit diesem Umweg scheint ein Workaround, aber um ehrlich zu sein, kein Latex, pdf was auch immer Motor ist so stark und einfach wie HTML!

0

Versuchen Sie eine andere weniger komplexe Bibliothek wie fpdf (http://www.fpdf.org/)

Ich finde es sehr gut und lite.

Finden Sie immer Bibliotheken, die klein sind und nur tun, was Sie tun müssen.

Je größer die Bibliothek, desto mehr Ressourcen verbraucht sie.

+0

Ja, ich habe diese Bibliotheken gesehen und benutzt (fpdf, tcpdf, dompdf), aber sie tun nicht, was ich brauche. Ich muss ein großes PDF auf Basis einer PDF-Vorlage generieren und mit Daten füllen. Keine dieser Bibliotheken tut dies. Sie sind gut für die Erstellung von eigenen PDF-Dateien, aber nicht für Templating. –

+0

Dann sollten Sie sie in verschiedenen PHP-Aufrufen nacheinander erstellen, um sicherzustellen, dass der Speicher nach jeder Generierung gelöscht wird. Stellen Sie sicher, dass Sie selbst beim Generieren große Variablen löschen. Vielleicht sogar eine Nicht-PHP-Lösung. – transilvlad

0

Das wird nicht helfen, Ihr mehrseitiges Problem, aber ich stelle fest, dass pdftk das Zeichen - bedeutet "Lesen von Standardeingabe" bedeutet.

Sie können die .fdf über die stdin an den Prozess pdftk senden, um sie nicht auf die Festplatte schreiben zu müssen.

Verwandte Themen