Ich muss eine 100+ Seiten PDF-Dokumente generieren. Der Prozess benötigt eine Menge zu verarbeitender Daten und die gesamte Generierung benötigt mehr Zeit und Speicher, die ich geben kann.So erstellen Sie PDF-Dokumente Seite für Seite in Hintergrundaufgaben auf App Engine
Ich habe ein paar verschiedene Methoden ausprobiert, obwohl mein Weg zu hacken:
verschmelzenden Mit variierendem Ergebnis habe ich es funktioniert, aber es ist langsam und benötigt mehr Speicher als es sollte (manchmal trifft es auf Instance Sof) t Speichergrenze). Zur Zeit erzeuge ich einige Abschnitte in verschiedenen Aufgaben, die jeweils im Blobstore gespeichert werden und diese mit pyPdf zusammenführen, aber es erstickt bei größeren Dokumenten.
Das Dokument, das ich generiere, ist nicht so kompliziert, hauptsächlich Tabellen und Text, keine internen Verweise, kein Inhaltsverzeichnis, nichts, was den Rest des Dokuments wissen sollte. Ich kann mit Platypus für Layout arbeiten und ich brauche kein schickes Dokument Aussehen oder HTML2PDF Konvertierung.
Ziel ist es, das Dokument so schnell zu generieren, wie es der Datenspeicher erlaubt. Parallele Seitengenerierung wäre nett, aber nicht erforderlich.
Ich dachte an die Seite-für-Seite-Generierung mit blobstore files api, wo jede Aufgabe eine einzelne Seite erzeugen würde und die letzte Aufgabe würde blobstore Datei finalisieren damit es lesbar. Aber ich kann anscheinend nicht finden, wie man die Generierung pausiert, partielle PDF-Dateien im Stream speichert und die Generierung mit diesem Stream wieder aufnimmt, um die nächste Seite in einer anderen Aufgabe zu erzeugen.
Also meine Frage ist:
Wie auf GAE erzeugt eine größer als ein paar Seiten PDF-Dokument, die Erzeugung zwischen Aufgabenanfragen Aufspaltung, dann speichern Sie das resultierende Dokument im Blobstore?
Wenn das Generierungssplitting mit reportlab nicht möglich ist, wie kann man dann den Platzbedarf beim Zusammenführen verschiedener PDF-Dokumente minimieren, damit es den durch die GAE-Aufgabenanforderung gesetzten Grenzen entspricht?
UPDATE: Alternativen zur Konvertierung API sehr geschätzt.
2. UPDATE Die Conversion-API wird außer Betrieb genommen, daher ist dies keine Option.
3. UPDATE Kann Pileline oder MapReduce APIs hier helfen?
Haben Sie eine Möglichkeit, die Quelldaten in Seitengrößen zu teilen, ohne die eigentliche Konvertierung durchzuführen? Wenn dies der Fall ist, könnten Sie eine Funktion schreiben, die replortlab verwendet, um einzelne Seiten zu generieren und 'multiprocessing.Pool.map' zu verwenden, um diese parallel über eine Liste von Chunks aller Ihrer Eingaben auszuführen. Als letzten Schritt verwenden Sie pyPdf, um die Seiten zu einem einzigen Dokument zusammenzuführen. –
Ich mache schon etwas ähnliches ohne viel Erfolg, die Verschmelzung dauert zu viel Zeit, um während der Aufgabe (muss weniger als 10 min sein) für einige Dokumente zu beenden. Vielleicht mache ich es falsch, trotzdem möchte ich ein Codebeispiel, wie es richtig gemacht wird. –
Schneller Satz von großen Dokumenten klingt wie ein Auftrag für TeX (möglicherweise mit den LaTeX- oder conTeXt-Makropaketen). Sie müssten das jedoch auf einem separaten Server ausführen. –