Die meisten iText7-Beispiele beziehen sich auf die Verwendung von PdfFontFactory.createFont()
, um Handles für PdfFont-Instanzen für Textoperationen zu erhalten. Mit Mäßigung ist das in Ordnung ... aber PdfFont ist ein ziemlich schweres Objekt (PdfEncoding), das erst verschwindet, wenn das PdfDocument geschlossen ist. Also folgende unschuldig Block ist gonna verschlingen Speicher:iText7-Strategie zur Begrenzung der Speicherbelegung von PdfFont
for (int i = 0; i < someLargeNumber; i++) {
list.add(
new ListItem("never gonna give")
.setFont(PdfFontFactory.createFont("Helvetica-Oblique"))
)
}
trivialer Lösungsversuch Statik mit schlug fehl, da es PdfFont Instanzen erscheint, können nicht über mehr als eine PDFDocument verwendet werden. Und weil mein tatsächlicher Fall komplexer ist als das obige Beispiel, möchte ich nicht eine Menge PdfFont-Referenzen über einen ziemlich tiefen Stapel weitergeben müssen.
- in der iText7 API, gibt es keine Möglichkeit für die PDFDocument bestehende PdfFont des iterieren (gibt es?)
- ist die Regel für PdfFont Nutzung einfach, dass a) es so oft verwendet werden kann, wie Sie wollen b) innerhalb einer einzigen PDFDocument Instanz
(dh eine mögliche Lösung hier einfach Cache PdfFont Instanzen eines PDFDocument + PdfFontProgram Schlüssel?)
der oben vorgeschlagene cacheKey ist eine schlechte Idee. Es sieht so aus, als ob FontProgram-Instanzen in einer statischen Map zwischengespeichert werden, was bedeutet, dass ein weakRef-Cache-Schlüssel immer verwendet wird (und dadurch auch das PdfDocument im Speicher hält). Ein besserer Ansatz scheint eine Map of Maps zu sein - WeakHashMap> –