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;
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;
/* 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>();
*/
@Deprecated
public PDFImageXObject getImage(String key) {
- return (PDFImageXObject)this.xObjectsMap.get(key);
+ return (PDFImageXObject)getXObject(key);
}
/**
* @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);
+ }
}
/**
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);
if (res != null) {
res.addXObject(xObject);
}
- this.xObjectsMap.put(key, xObject);
+ putXObject(key, xObject);
return xObject;
}
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);
if (res != null) {
res.addXObject(xObject);
}
- this.xObjectsMap.put(key, xObject);
+ putXObject(key, xObject);
return xObject;
}