2017-01-12 3 views
1

was genau tut PdfPage.flush (true)? Beeinflusst SmartMode (oder eine andere Einstellung) das Verhalten? In vielen Fällen möchte ich die Seite so lange wie möglich editierbar lassen. Daher habe ich mir nie Sorgen gemacht, dass das PDF-Dokument im Speicher erstellt wurde, bis document.close(). Bei der Erzeugung sehr großer Dateien (Zehntausende von Seiten) wird der Speicher jedoch eingeschränkt. Ich hoffte naiv, dass PdfPage.flush(true) den Inhaltsstrom auf die Festplatte schreiben und Speicher freigeben würde, aber der Aufruf von scheint nur ein paar Bytes auf die Festplatte zu schreiben.Verhalten von PdfPage.flush()

Ich denke, die allgemeinere Version meiner Frage ist „wie effizient viele Dokumente in einem einzigen, wir sehr großen Dokument zusammenführen? (Itext7)“, aber nicht sehr bewandert sein w/der PDF-Spezifikation selbst ich wurde möchte auch besser verstehen, was eigentlich vor sich geht.

Antwort

0

flush(), zwingt diese Objekte und ihre Kinder, wenn sie auf Layout-Objekten aufgerufen werden, ihre Inhalte auf den Outputstream des Writers zu zeichnen (== schreiben). Der Grund, warum Sie nur ein paar Bytes sehen, wenn sie manuell bündig geschrieben werden() aufgerufen wird, da die Standard-Document Konstrukteurs iText bereits eingestellt aggressiv spülen, indem sie die relevante Konstrukteurs Überlastung:

/** 
* Creates a document from a {@link PdfDocument} with a manually set {@link 
* PageSize}. 
* 
* @param pdfDoc the in-memory representation of the PDF document 
* @param pageSize the page size 
*/ 
public Document(PdfDocument pdfDoc, PageSize pageSize) { 
    this(pdfDoc, pageSize, true); 
} 

/** 
* Creates a document from a {@link PdfDocument} with a manually set {@link 
* PageSize}. 
* 
* @param pdfDoc   the in-memory representation of the PDF document 
* @param pageSize  the page size 
* @param immediateFlush if true, write pages and page-related instructions 
*      to the {@link PdfDocument} as soon as possible. 
*/ 
public Document(PdfDocument pdfDoc, PageSize pageSize, boolean immediateFlush) 

Wie für die Beratung über die allgemeine Frage : Es gibt nicht wirklich eine Art von iText-Funktion oder Konfiguration, die den gesamten Fortschritt magisch schneller und effizienter macht, aber es gibt einige Tricks, die Sie außerhalb von iText machen können:

1) Zuweisen von mehr Ressourcen, offensichtlich und oft nicht durchführbar.

2) Führen Sie eine mehrstufige Stapelverarbeitung durch: Mischen Sie in Schritt X 10 Dateien in 1, fahren Sie mit dem Zusammenführen dieser Dateien in Schritt X + 1 fort. Im Allgemeinen wird die 1 große Datei aufgrund der möglichen Wiederverwendung von Ressourcen wie Schriftarten und Bildern kleiner als die 10 Dateien sein.

3) Führen Sie den Verschmelzungsprozess manchmal die Ressourcen, die sie aufgreift sind anderswo nicht benötigt wird, zum Beispiel in der Nacht, über Mittagessen etc.

Edit: Was, warum PDFPAGE # flush() nur schreibt ein paar Bytes zum Inhaltsstrom, der vom Eingabedokument abhängt, aber höchstwahrscheinlich darauf hinweist, dass eine Seite geleert wird, die entweder hauptsächlich Textinhalt oder viele gemeinsam genutzte Ressourcen enthält. SmartMode sollte die Menge begrenzen, die in den Ausgabestream geschrieben wird, den eine Seite entleert, solange die Seite Ressourcen enthält, die zuvor kopiert wurden.

+0

für die Klarheit, ich sehe nur ein paar Bytes IN TOTAL ausgeschrieben (d. H. SofortigeFlush tut nichts leichter ... die _entire_ Ausgabedatei ist nur ein paar Bytes lang statt Mb). Ich schätze den Versuch der Antwort, aber ich denke nicht, dass es meine Frage 'PdfPage.flush (boolean flushContentStream)' adressiert. Beim Versuch, dem Codepfad bis zu PdfObject.flush() zu folgen, scheint es ein unterschiedliches Verhalten beim Spülen von indirectReferences zu geben (aber ich kann nicht alles in meinem Kopf zusammenfügen). –

+0

@jameygraham * "Aus Gründen der Klarheit, ..." * - Sie sollten die Frage wirklich aktualisieren, da sie derzeit etwas anderes zu sagen scheint. Und wenn es nur ein paar Bytes in der Ergebnis-PDF gibt, würde ich annehmen, dass die Prozedur entweder durch eine Ausnahme gestoppt wird oder Ihr Code etwas falsch macht, wie die PDF-Datei zu greifen, bevor ihr 'PdfDocument' geschlossen wird. – mkl

+0

@jameygraham Ich habe versucht, Ihre erste Frage zu 'PdfPage.flush' zu beantworten. Es gibt jedoch einige komplexe Interaktionen im Kern aufgrund verschiedener Optimierungen, so dass ich einige Dinge übersehen habe. Wenn Sie große Dateien zusammenführen und Ihre Ausgabe nur aus ein paar Bytes besteht, haben Sie möglicherweise ein anderes Problem. Vielleicht, da diese 1000-seitigen Dateien schrecklich ineffiziente Monstrositäten sind, aber ohne Zugang zu sowohl Eingang als auch Ausgang, kann ich Ihnen nicht weiterhelfen. Das heißt, meine allgemeinen Bemerkungen für die zweite, allgemeinere Frage stehen noch. –