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 }