001: /**
002: * Copyright (c) 2003-2004, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox.pdmodel.interactive.annotation;
031:
032: import org.pdfbox.cos.COSBase;
033: import org.pdfbox.cos.COSDictionary;
034: import org.pdfbox.cos.COSName;
035: import org.pdfbox.cos.COSStream;
036:
037: import org.pdfbox.pdmodel.common.COSObjectable;
038: import org.pdfbox.pdmodel.common.COSDictionaryMap;
039:
040: import java.util.HashMap;
041: import java.util.Iterator;
042: import java.util.Map;
043:
044: /**
045: * This class represents a PDF /AP entry the appearance dictionary.
046: *
047: * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
048: * @version $Revision: 1.4 $
049: */
050: public class PDAppearanceDictionary implements COSObjectable {
051: private COSDictionary dictionary;
052:
053: /**
054: * Constructor.
055: */
056: public PDAppearanceDictionary() {
057: dictionary = new COSDictionary();
058: //the N entry is required.
059: dictionary
060: .setItem(COSName.getPDFName("N"), new COSDictionary());
061: }
062:
063: /**
064: * Constructor.
065: *
066: * @param dict The annotations dictionary.
067: */
068: public PDAppearanceDictionary(COSDictionary dict) {
069: dictionary = dict;
070: }
071:
072: /**
073: * returns the dictionary.
074: * @return the dictionary
075: */
076: public COSDictionary getDictionary() {
077: return dictionary;
078: }
079:
080: /**
081: * returns the dictionary.
082: * @return the dictionary
083: */
084: public COSBase getCOSObject() {
085: return dictionary;
086: }
087:
088: /**
089: * This will return a list of appearances. In the case where there is
090: * only one appearance the map will contain one entry whose key is the string
091: * "default".
092: *
093: * @return A list of key(java.lang.String) value(PDAppearanceStream) pairs
094: */
095: public Map getNormalAppearance() {
096: COSBase ap = dictionary.getDictionaryObject(COSName
097: .getPDFName("N"));
098: if (ap instanceof COSStream) {
099: COSStream aux = (COSStream) ap;
100: ap = new COSDictionary();
101: ((COSDictionary) ap).setItem(COSName.getPDFName("default"),
102: aux);
103: }
104: COSDictionary map = (COSDictionary) ap;
105: Map actuals = new HashMap();
106: Map retval = new COSDictionaryMap(actuals, map);
107: Iterator asNames = map.keyList().iterator();
108: while (asNames.hasNext()) {
109: COSName asName = (COSName) asNames.next();
110: COSStream as = (COSStream) map.getDictionaryObject(asName);
111: actuals.put(asName.getName(), new PDAppearanceStream(as));
112: }
113:
114: return retval;
115: }
116:
117: /**
118: * This will set a list of appearances. If you would like to set the single
119: * appearance then you should use the key "default", and when the PDF is written
120: * back to the filesystem then there will only be one stream.
121: *
122: * @param appearanceMap The updated map with the appearance.
123: */
124: public void setNormalAppearance(Map appearanceMap) {
125: dictionary.setItem(COSName.getPDFName("N"), COSDictionaryMap
126: .convert(appearanceMap));
127: }
128:
129: /**
130: * This will set the normal appearance when there is only one appearance
131: * to be shown.
132: *
133: * @param ap The appearance stream to show.
134: */
135: public void setNormalAppearance(PDAppearanceStream ap) {
136: dictionary.setItem(COSName.getPDFName("N"), ap.getStream());
137: }
138:
139: /**
140: * This will return a list of appearances. In the case where there is
141: * only one appearance the map will contain one entry whose key is the string
142: * "default". If there is no rollover appearance then the normal appearance
143: * will be returned. Which means that this method will never return null.
144: *
145: * @return A list of key(java.lang.String) value(PDAppearanceStream) pairs
146: */
147: public Map getRolloverAppearance() {
148: Map retval = null;
149: COSBase ap = dictionary.getDictionaryObject(COSName
150: .getPDFName("R"));
151: if (ap == null) {
152: retval = getNormalAppearance();
153: } else {
154: if (ap instanceof COSStream) {
155: ap = new COSDictionary();
156: ((COSDictionary) ap).setItem(COSName
157: .getPDFName("default"), ap);
158: }
159: COSDictionary map = (COSDictionary) ap;
160: Map actuals = new HashMap();
161: retval = new COSDictionaryMap(actuals, map);
162: Iterator asNames = map.keyList().iterator();
163: while (asNames.hasNext()) {
164: COSName asName = (COSName) asNames.next();
165: COSStream as = (COSStream) map
166: .getDictionaryObject(asName);
167: actuals.put(asName.getName(),
168: new PDAppearanceStream(as));
169: }
170: }
171:
172: return retval;
173: }
174:
175: /**
176: * This will set a list of appearances. If you would like to set the single
177: * appearance then you should use the key "default", and when the PDF is written
178: * back to the filesystem then there will only be one stream.
179: *
180: * @param appearanceMap The updated map with the appearance.
181: */
182: public void setRolloverAppearance(Map appearanceMap) {
183: dictionary.setItem(COSName.getPDFName("R"), COSDictionaryMap
184: .convert(appearanceMap));
185: }
186:
187: /**
188: * This will return a list of appearances. In the case where there is
189: * only one appearance the map will contain one entry whose key is the string
190: * "default". If there is no rollover appearance then the normal appearance
191: * will be returned. Which means that this method will never return null.
192: *
193: * @return A list of key(java.lang.String) value(PDAppearanceStream) pairs
194: */
195: public Map getDownAppearance() {
196: Map retval = null;
197: COSBase ap = dictionary.getDictionaryObject(COSName
198: .getPDFName("D"));
199: if (ap == null) {
200: retval = getNormalAppearance();
201: } else {
202: if (ap instanceof COSStream) {
203: ap = new COSDictionary();
204: ((COSDictionary) ap).setItem(COSName
205: .getPDFName("default"), ap);
206: }
207: COSDictionary map = (COSDictionary) ap;
208: Map actuals = new HashMap();
209: retval = new COSDictionaryMap(actuals, map);
210: Iterator asNames = map.keyList().iterator();
211: while (asNames.hasNext()) {
212: COSName asName = (COSName) asNames.next();
213: COSStream as = (COSStream) map
214: .getDictionaryObject(asName);
215: actuals.put(asName.getName(),
216: new PDAppearanceStream(as));
217: }
218: }
219:
220: return retval;
221: }
222:
223: /**
224: * This will set a list of appearances. If you would like to set the single
225: * appearance then you should use the key "default", and when the PDF is written
226: * back to the filesystem then there will only be one stream.
227: *
228: * @param appearanceMap The updated map with the appearance.
229: */
230: public void setDownAppearance(Map appearanceMap) {
231: dictionary.setItem(COSName.getPDFName("D"), COSDictionaryMap
232: .convert(appearanceMap));
233: }
234: }
|