001: /**
002: * Copyright (c) 2005, 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.graphics.xobject;
031:
032: import java.io.IOException;
033: import java.util.List;
034:
035: import org.pdfbox.cos.COSBase;
036: import org.pdfbox.cos.COSName;
037: import org.pdfbox.cos.COSStream;
038:
039: import org.pdfbox.pdmodel.PDDocument;
040: import org.pdfbox.pdmodel.common.COSObjectable;
041: import org.pdfbox.pdmodel.common.PDMetadata;
042: import org.pdfbox.pdmodel.common.PDStream;
043:
044: /**
045: * The base class for all XObjects in the PDF document.
046: *
047: * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
048: * @author mathiak
049: * @author Marcel Kammer
050: * @version $Revision: 1.13 $
051: */
052: public abstract class PDXObject implements COSObjectable {
053: private PDStream xobject;
054:
055: /**
056: * Standard constuctor.
057: *
058: * @param xobj The XObject dictionary.
059: */
060: public PDXObject(COSStream xobj) {
061: xobject = new PDStream(xobj);
062: }
063:
064: /**
065: * Standard constuctor.
066: *
067: * @param xobj The XObject dictionary.
068: */
069: public PDXObject(PDStream xobj) {
070: xobject = xobj;
071: }
072:
073: /**
074: * Standard constuctor.
075: *
076: * @param doc The doc to store the object contents.
077: */
078: public PDXObject(PDDocument doc) {
079: xobject = new PDStream(doc);
080: xobject.getStream().setName(COSName.TYPE, "XObject");
081: }
082:
083: /**
084: * Returns the stream.
085: *
086: * {@inheritDoc}
087: */
088: public COSBase getCOSObject() {
089: return xobject.getCOSObject();
090: }
091:
092: /**
093: * Returns the stream.
094: * @return The stream for this object.
095: */
096: public COSStream getCOSStream() {
097: return xobject.getStream();
098: }
099:
100: /**
101: * Returns the stream.
102: * @return The stream for this object.
103: */
104: public PDStream getPDStream() {
105: return xobject;
106: }
107:
108: /**
109: * Create the correct xobject from the cos base.
110: *
111: * @param xobject The cos level xobject to create.
112: *
113: * @return a pdmodel xobject
114: * @throws IOException If there is an error creating the xobject.
115: */
116: public static PDXObject createXObject(COSBase xobject)
117: throws IOException {
118: PDXObject retval = null;
119: if (xobject == null) {
120: retval = null;
121: } else if (xobject instanceof COSStream) {
122: COSStream xstream = (COSStream) xobject;
123: String subtype = xstream.getNameAsString("Subtype");
124: if (subtype.equals(PDXObjectImage.SUB_TYPE)) {
125: PDStream image = new PDStream(xstream);
126: // See if filters are DCT or JPX otherwise treat as Bitmap-like
127: // There might be a problem with several filters, but that's ToDo until
128: // I find an example
129: List filters = image.getFilters();
130: if (filters != null
131: && filters.contains(COSName.DCT_DECODE
132: .getName())) {
133: return new PDJpeg(image);
134: } else if (filters != null
135: && filters.contains(COSName.CCITTFAX_DECODE
136: .getName())) {
137: return new PDCcitt(image);
138: } else if (filters != null
139: && filters.contains(COSName.JPX_DECODE
140: .getName())) {
141: //throw new IOException( "JPXDecode has not been implemented for images" );
142: //JPX Decode is not really supported right now, but if we are just doing
143: //text extraction then we don't want to throw an exception, so for now
144: //just return a PDPixelMap, which will break later on if it is
145: //actually used, but for text extraction it is not used.
146: return new PDPixelMap(image);
147:
148: } else {
149: retval = new PDPixelMap(image);
150: }
151: } else if (subtype.equals(PDXObjectForm.SUB_TYPE)) {
152: retval = new PDXObjectForm(xstream);
153: } else {
154: throw new IOException("Unknown xobject subtype '"
155: + subtype + "'");
156: }
157: } else {
158: throw new IOException("Unknown xobject type:"
159: + xobject.getClass().getName());
160: }
161:
162: return retval;
163: }
164:
165: /**
166: * Get the metadata that is part of the document catalog. This will
167: * return null if there is no meta data for this object.
168: *
169: * @return The metadata for this object.
170: */
171: public PDMetadata getMetadata() {
172: PDMetadata retval = null;
173: COSStream mdStream = (COSStream) xobject.getStream()
174: .getDictionaryObject("Metadata");
175: if (mdStream != null) {
176: retval = new PDMetadata(mdStream);
177: }
178: return retval;
179: }
180:
181: /**
182: * Set the metadata for this object. This can be null.
183: *
184: * @param meta The meta data for this object.
185: */
186: public void setMetadata(PDMetadata meta) {
187: xobject.getStream().setItem("Metadata", meta);
188: }
189: }
|