You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ss...@apache.org on 2021/02/26 13:23:22 UTC
svn commit: r1886951 -
/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java
Author: ssteiner
Date: Fri Feb 26 13:23:21 2021
New Revision: 1886951
URL: http://svn.apache.org/viewvc?rev=1886951&view=rev
Log:
FOP-3002: Optimise memory usage for data uri
Modified:
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java
Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java?rev=1886951&r1=1886950&r2=1886951&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java Fri Feb 26 13:23:21 2021
@@ -23,6 +23,7 @@ package org.apache.fop.pdf;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;
@@ -36,6 +37,8 @@ import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.xmlgraphics.image.loader.util.SoftMapCache;
+
import org.apache.fop.pdf.StandardStructureAttributes.Table.Scope;
import org.apache.fop.pdf.xref.CrossReferenceStream;
import org.apache.fop.pdf.xref.CrossReferenceTable;
@@ -131,6 +134,7 @@ public class PDFDocument {
/* TODO: Should be modified (works only for image subtype) */
private Map<String, PDFXObject> xObjectsMap = new HashMap<String, PDFXObject>();
+ private SoftMapCache xObjectsMapFast = new SoftMapCache(false);
private Map<String, PDFFont> fontMap = new HashMap<String, PDFFont>();
@@ -800,7 +804,7 @@ public class PDFDocument {
*/
@Deprecated
public PDFImageXObject getImage(String key) {
- return (PDFImageXObject)this.xObjectsMap.get(key);
+ return (PDFImageXObject)getXObject(key);
}
/**
@@ -810,7 +814,34 @@ public class PDFDocument {
* @return the PDFXObject for the key if found
*/
public PDFXObject getXObject(String key) {
- return this.xObjectsMap.get(key);
+ Object xObj = xObjectsMapFast.get(key);
+ if (xObj != null) {
+ return (PDFXObject) xObj;
+ }
+ return xObjectsMap.get(toHashCode(key));
+ }
+
+ private void putXObject(String key, PDFXObject pdfxObject) {
+ xObjectsMapFast.clear();
+ xObjectsMapFast.put(key, pdfxObject);
+ xObjectsMap.put(toHashCode(key), pdfxObject);
+ }
+
+ private String toHashCode(String key) {
+ if (key.length() < 1024) {
+ return key;
+ }
+ try {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ byte[] thedigest = md.digest(key.getBytes("UTF-8"));
+ StringBuilder hex = new StringBuilder();
+ for (byte b : thedigest) {
+ hex.append(String.format("%02x", b));
+ }
+ return hex.toString();
+ } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
}
/**
@@ -859,7 +890,7 @@ public class PDFDocument {
public PDFImageXObject addImage(PDFResourceContext res, PDFImage img) {
// check if already created
String key = img.getKey();
- PDFImageXObject xObject = (PDFImageXObject)this.xObjectsMap.get(key);
+ PDFImageXObject xObject = (PDFImageXObject)getXObject(key);
if (xObject != null) {
if (res != null) {
res.addXObject(xObject);
@@ -876,7 +907,7 @@ public class PDFDocument {
if (res != null) {
res.addXObject(xObject);
}
- this.xObjectsMap.put(key, xObject);
+ putXObject(key, xObject);
return xObject;
}
@@ -899,7 +930,7 @@ public class PDFDocument {
String key) {
// check if already created
- PDFFormXObject xObject = (PDFFormXObject)xObjectsMap.get(key);
+ PDFFormXObject xObject = (PDFFormXObject)getXObject(key);
if (xObject != null) {
if (res != null) {
res.addXObject(xObject);
@@ -916,7 +947,7 @@ public class PDFDocument {
if (res != null) {
res.addXObject(xObject);
}
- this.xObjectsMap.put(key, xObject);
+ putXObject(key, xObject);
return xObject;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org