Ich habe den folgenden Code
%Vor%Wenn ich in Zeile 3 nur ein paar Sachen zeichne, dann funktioniert alles gut. Aber wenn ich viel zeichne, dann bekomme ich:
%Vor%Der obige Code funktioniert in 95% der Fälle, Probleme treten nur auf, wenn die Seite wirklich voll ist.
Wenn in Zeile 2 & amp; 4. Ich benutze
%Vor%dann funktioniert es gut. Aber das Ziel ist eine Vorlage pdf zu verwenden.
Eine gehackte Lösung ist:
Laden Sie die Vorlage jedes Mal, bevor Sie sie verwenden. Stellen Sie sicher, dass das Vorlagendokument nicht GCd ist. Dann wird es funktionieren.
Wenn jemand eine offizielle Lösung hat, lass es mich wissen.
Das Hauptproblem ist, dass Sie PDDocument
aus der Datei laden,
Extrahiere ein PDPage
Objekt daraus,
Behalten Sie die PDDocument
-Instanz jedoch nicht mehr bei, wenn Sie die Seite verwenden.
Damit erlauben Sie der Garbage-Collection, die PDDocument
-Instanz, die den Teppich zieht, unter der PDPage
-Instanz zu beanspruchen:
Ein PDPage
Objekt speichert nicht alle Informationen über den gesamten Seiteninhalt, sondern nur einige Objektbezeichner, die während eines document.importPage
Aufrufs aufgelöst werden müssen; Wenn die Quelle PDDocument
zwischenzeitlich abgeschlossen wurde (weil sie nicht referenziert wurde und daher möglicherweise von der Garbage Collection verarbeitet wird), können sie nicht mehr aufgelöst werden.
Die Symptome davon können abweichen, in meinen Tests habe ich keine Ausnahme, sondern eine SEVERE Log-Ausgabe
%Vor%und entweder wurde keine Seite importiert oder der importierten Seite fehlten einige Ressourcen, z. eingebettete Schriftarten.
(Übrigens würde ich bevorzugen , um hier eine Ausnahme zu erhalten, weil der Code davon ausgeht, dass erfolgreich die Seite importiert hat)
Halten Sie an der PDDocument
-Instanz fest, solange Sie sie verwenden:
Der letzte Aufruf von sourceDocument.close
befreit Ressourcen zu einem Zeitpunkt Ihrer Wahl und nicht zu einem Zeitpunkt, der durch die Garbage Collection geregelt wird.
Ein Problem beim gleichzeitigen Importieren der gleichen Vorlage PDPage
ist, dass derselbe Inhaltsdatenstrom in der Ergebnisdatei zweimal vorhanden ist und wahrscheinlich auch seine Ressourcen. Abhängig von der Art der betreffenden Seite kann dies eine Menge Overhead bedeuten. Sie können diesen Overhead umgehen, indem Sie die Vorlagenseite einmal als Formular-X-Objekt importieren und einen Verweis auf dieses X-Objekt auf beliebig vielen Seiten im Zieldokument einfügen.
Diese Antwort zu Wie man eine PDPage in eine andere PDPage mit pdfbox einfügt erklärt, wie man eine Template-Seite als Formular-Xobject importiert und auf eine Zielseite im aktuellen PDFBox 2.0.0 Development SNAPSHOT legt. Etwas Analoges sollte auch für die aktuellen Release-Versionen 1.8.X möglich sein.
Tags und Links pdfbox