1 49 package com.lowagie.text.pdf; 50 51 import java.util.HashMap ; 52 import java.util.Iterator ; 53 54 class PageResources { 55 56 protected PdfDictionary fontDictionary = new PdfDictionary(); 57 protected PdfDictionary xObjectDictionary = new PdfDictionary(); 58 protected PdfDictionary colorDictionary = new PdfDictionary(); 59 protected PdfDictionary patternDictionary = new PdfDictionary(); 60 protected PdfDictionary shadingDictionary = new PdfDictionary(); 61 protected PdfDictionary extGStateDictionary = new PdfDictionary(); 62 protected PdfDictionary propertyDictionary = new PdfDictionary(); 63 protected HashMap forbiddenNames; 64 protected PdfDictionary originalResources; 65 protected int namePtr[] = {0}; 66 protected HashMap usedNames; 67 68 PageResources() { 69 } 70 71 void setOriginalResources(PdfDictionary resources, int newNamePtr[]) { 72 if (newNamePtr != null) 73 namePtr = newNamePtr; 74 forbiddenNames = new HashMap (); 75 usedNames = new HashMap (); 76 if (resources == null) 77 return; 78 originalResources = new PdfDictionary(); 79 originalResources.merge(resources); 80 for (Iterator i = resources.getKeys().iterator(); i.hasNext();) { 81 PdfName key = (PdfName)i.next(); 82 PdfObject sub = PdfReader.getPdfObject(resources.get(key)); 83 if (sub != null && sub.isDictionary()) { 84 PdfDictionary dic = (PdfDictionary)sub; 85 for (Iterator j = dic.getKeys().iterator(); j.hasNext();) { 86 forbiddenNames.put(j.next(), null); 87 } 88 PdfDictionary dic2 = new PdfDictionary(); 89 dic2.merge(dic); 90 originalResources.put(key, dic2); 91 } 92 } 93 } 94 95 PdfName translateName(PdfName name) { 96 PdfName translated = name; 97 if (forbiddenNames != null) { 98 translated = (PdfName)usedNames.get(name); 99 if (translated == null) { 100 while (true) { 101 translated = new PdfName("Xi" + (namePtr[0]++)); 102 if (!forbiddenNames.containsKey(translated)) 103 break; 104 } 105 usedNames.put(name, translated); 106 } 107 } 108 return translated; 109 } 110 111 PdfName addFont(PdfName name, PdfIndirectReference reference) { 112 name = translateName(name); 113 fontDictionary.put(name, reference); 114 return name; 115 } 116 117 PdfName addXObject(PdfName name, PdfIndirectReference reference) { 118 name = translateName(name); 119 xObjectDictionary.put(name, reference); 120 return name; 121 } 122 123 PdfName addColor(PdfName name, PdfIndirectReference reference) { 124 name = translateName(name); 125 colorDictionary.put(name, reference); 126 return name; 127 } 128 129 void addDefaultColor(PdfName name, PdfObject obj) { 130 if (obj == null || obj.isNull()) 131 colorDictionary.remove(name); 132 else 133 colorDictionary.put(name, obj); 134 } 135 136 void addDefaultColor(PdfDictionary dic) { 137 colorDictionary.merge(dic); 138 } 139 140 void addDefaultColorDiff(PdfDictionary dic) { 141 colorDictionary.mergeDifferent(dic); 142 } 143 144 PdfName addShading(PdfName name, PdfIndirectReference reference) { 145 name = translateName(name); 146 shadingDictionary.put(name, reference); 147 return name; 148 } 149 150 PdfName addPattern(PdfName name, PdfIndirectReference reference) { 151 name = translateName(name); 152 patternDictionary.put(name, reference); 153 return name; 154 } 155 156 PdfName addExtGState(PdfName name, PdfIndirectReference reference) { 157 name = translateName(name); 158 extGStateDictionary.put(name, reference); 159 return name; 160 } 161 162 PdfName addProperty(PdfName name, PdfIndirectReference reference) { 163 name = translateName(name); 164 propertyDictionary.put(name, reference); 165 return name; 166 } 167 168 PdfDictionary getResources() { 169 PdfResources resources = new PdfResources(); 170 if (originalResources != null) 171 resources.putAll(originalResources); 172 resources.put(PdfName.PROCSET, new PdfLiteral("[/PDF /Text /ImageB /ImageC /ImageI]")); 173 resources.add(PdfName.FONT, fontDictionary); 174 resources.add(PdfName.XOBJECT, xObjectDictionary); 175 resources.add(PdfName.COLORSPACE, colorDictionary); 176 resources.add(PdfName.PATTERN, patternDictionary); 177 resources.add(PdfName.SHADING, shadingDictionary); 178 resources.add(PdfName.EXTGSTATE, extGStateDictionary); 179 resources.add(PdfName.PROPERTIES, propertyDictionary); 180 return resources; 181 } 182 183 boolean hasResources() { 184 return (fontDictionary.size() > 0 185 || xObjectDictionary.size() > 0 186 || colorDictionary.size() > 0 187 || patternDictionary.size() > 0 188 || shadingDictionary.size() > 0 189 || extGStateDictionary.size() > 0 190 || propertyDictionary.size() > 0); 191 } 192 } | Popular Tags |