001: /**
002: * Copyright (c) 2003-2006, 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.cos;
031:
032: import org.pdfbox.exceptions.COSVisitorException;
033:
034: import java.io.IOException;
035:
036: /**
037: * This class represents a PDF object.
038: *
039: * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
040: * @version $Revision: 1.37 $
041: */
042: public class COSObject extends COSBase {
043: private COSBase baseObject;
044: private COSInteger objectNumber;
045: private COSInteger generationNumber;
046:
047: /**
048: * Constructor.
049: *
050: * @param object The object that this encapsulates.
051: *
052: * @throws IOException If there is an error with the object passed in.
053: */
054: public COSObject(COSBase object) throws IOException {
055: setObject(object);
056: }
057:
058: /**
059: * This will get the dictionary object in this object that has the name key and
060: * if it is a pdfobjref then it will dereference that and return it.
061: *
062: * @param key The key to the value that we are searching for.
063: *
064: * @return The pdf object that matches the key.
065: */
066: public COSBase getDictionaryObject(COSName key) {
067: COSBase retval = null;
068: if (baseObject instanceof COSDictionary) {
069: retval = ((COSDictionary) baseObject)
070: .getDictionaryObject(key);
071: }
072: return retval;
073: }
074:
075: /**
076: * This will get the dictionary object in this object that has the name key.
077: *
078: * @param key The key to the value that we are searching for.
079: *
080: * @return The pdf object that matches the key.
081: */
082: public COSBase getItem(COSName key) {
083: COSBase retval = null;
084: if (baseObject instanceof COSDictionary) {
085: retval = ((COSDictionary) baseObject).getItem(key);
086: }
087: return retval;
088: }
089:
090: /**
091: * This will get the object that this object encapsulates.
092: *
093: * @return The encapsulated object.
094: */
095: public COSBase getObject() {
096: return baseObject;
097: }
098:
099: /**
100: * This will set the object that this object encapsulates.
101: *
102: * @param object The new object to encapsulate.
103: *
104: * @throws IOException If there is an error setting the updated object.
105: */
106: public void setObject(COSBase object) throws IOException {
107: baseObject = object;
108: /*if( baseObject == null )
109: {
110: baseObject = object;
111: }
112: else
113: {
114: //This is for when an object appears twice in the
115: //pdf file we really want to replace it such that
116: //object references still work correctly.
117: //see owcp-as-received.pdf for an example
118: if( baseObject instanceof COSDictionary )
119: {
120: COSDictionary dic = (COSDictionary)baseObject;
121: COSDictionary dicObject = (COSDictionary)object;
122: dic.clear();
123: dic.addAll( dicObject );
124: }
125: else if( baseObject instanceof COSArray )
126: {
127: COSArray array = (COSArray)baseObject;
128: COSArray arrObject = (COSArray)object;
129: array.clear();
130: for( int i=0; i<arrObject.size(); i++ )
131: {
132: array.add( arrObject.get( i ) );
133: }
134: }
135: else if( baseObject instanceof COSStream )
136: {
137: COSStream oldStream = (COSStream)baseObject;
138: System.out.println( "object:" + object.getClass().getName() );
139: COSStream newStream = (COSStream)object;
140: oldStream.replaceWithStream( newStream );
141: }
142: else if( baseObject instanceof COSInteger )
143: {
144: COSInteger oldInt = (COSInteger)baseObject;
145: COSInteger newInt = (COSInteger)object;
146: oldInt.setValue( newInt.longValue() );
147: }
148: else if( baseObject == null )
149: {
150: baseObject = object;
151: }
152: else
153: {
154: throw new IOException( "Unknown object substitution type:" + baseObject );
155: }
156: }*/
157:
158: }
159:
160: /**
161: * {@inheritDoc}
162: */
163: public String toString() {
164: return "COSObject{"
165: + (objectNumber == null ? "unknown" : ""
166: + objectNumber.intValue())
167: + ", "
168: + (generationNumber == null ? "unknown" : ""
169: + generationNumber.intValue()) + "}";
170: }
171:
172: /** Getter for property objectNumber.
173: * @return Value of property objectNumber.
174: */
175: public COSInteger getObjectNumber() {
176: return objectNumber;
177: }
178:
179: /** Setter for property objectNumber.
180: * @param objectNum New value of property objectNumber.
181: */
182: public void setObjectNumber(COSInteger objectNum) {
183: objectNumber = objectNum;
184: }
185:
186: /** Getter for property generationNumber.
187: * @return Value of property generationNumber.
188: */
189: public COSInteger getGenerationNumber() {
190: return generationNumber;
191: }
192:
193: /** Setter for property generationNumber.
194: * @param generationNumberValue New value of property generationNumber.
195: */
196: public void setGenerationNumber(COSInteger generationNumberValue) {
197: generationNumber = generationNumberValue;
198: }
199:
200: /**
201: * visitor pattern double dispatch method.
202: *
203: * @param visitor The object to notify when visiting this object.
204: * @return any object, depending on the visitor implementation, or null
205: * @throws COSVisitorException If an error occurs while visiting this object.
206: */
207: public Object accept(ICOSVisitor visitor)
208: throws COSVisitorException {
209: return getObject() != null ? getObject().accept(visitor)
210: : COSNull.NULL.accept(visitor);
211: }
212: }
|