001: /*
002: * $Id: PRStream.java 2446 2006-11-08 17:33:44Z psoares33 $
003: * $Name$
004: *
005: * Copyright 2001, 2002 by Paulo Soares.
006: *
007: * The contents of this file are subject to the Mozilla Public License Version 1.1
008: * (the "License"); you may not use this file except in compliance with the License.
009: * You may obtain a copy of the License at http://www.mozilla.org/MPL/
010: *
011: * Software distributed under the License is distributed on an "AS IS" basis,
012: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
013: * for the specific language governing rights and limitations under the License.
014: *
015: * The Original Code is 'iText, a free JAVA-PDF library'.
016: *
017: * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
018: * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
019: * All Rights Reserved.
020: * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
021: * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
022: *
023: * Contributor(s): all the names of the contributors are added in the source code
024: * where applicable.
025: *
026: * Alternatively, the contents of this file may be used under the terms of the
027: * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
028: * provisions of LGPL are applicable instead of those above. If you wish to
029: * allow use of your version of this file only under the terms of the LGPL
030: * License and not to allow others to use your version of this file under
031: * the MPL, indicate your decision by deleting the provisions above and
032: * replace them with the notice and other provisions required by the LGPL.
033: * If you do not delete the provisions above, a recipient may use your version
034: * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
035: *
036: * This library is free software; you can redistribute it and/or modify it
037: * under the terms of the MPL as stated above or under the terms of the GNU
038: * Library General Public License as published by the Free Software Foundation;
039: * either version 2 of the License, or any later version.
040: *
041: * This library is distributed in the hope that it will be useful, but WITHOUT
042: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
043: * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
044: * details.
045: *
046: * If you didn't download this code from the following link, you should check if
047: * you aren't using an obsolete version:
048: * http://www.lowagie.com/iText/
049: */
050:
051: package com.lowagie.text.pdf;
052:
053: import java.io.ByteArrayOutputStream;
054: import java.io.IOException;
055: import java.io.OutputStream;
056: import java.util.zip.DeflaterOutputStream;
057:
058: import com.lowagie.text.Document;
059: import com.lowagie.text.ExceptionConverter;
060:
061: public class PRStream extends PdfStream {
062:
063: protected PdfReader reader;
064: protected int offset;
065: protected int length;
066:
067: //added by ujihara for decryption
068: protected int objNum = 0;
069: protected int objGen = 0;
070:
071: public PRStream(PRStream stream, PdfDictionary newDic) {
072: reader = stream.reader;
073: offset = stream.offset;
074: length = stream.length;
075: compressed = stream.compressed;
076: streamBytes = stream.streamBytes;
077: bytes = stream.bytes;
078: objNum = stream.objNum;
079: objGen = stream.objGen;
080: if (newDic != null)
081: putAll(newDic);
082: else
083: hashMap.putAll(stream.hashMap);
084: }
085:
086: public PRStream(PRStream stream, PdfDictionary newDic,
087: PdfReader reader) {
088: this (stream, newDic);
089: this .reader = reader;
090: }
091:
092: public PRStream(PdfReader reader, int offset) {
093: this .reader = reader;
094: this .offset = offset;
095: }
096:
097: public PRStream(PdfReader reader, byte conts[]) {
098: this .reader = reader;
099: this .offset = -1;
100: if (Document.compress) {
101: try {
102: ByteArrayOutputStream stream = new ByteArrayOutputStream();
103: DeflaterOutputStream zip = new DeflaterOutputStream(
104: stream);
105: zip.write(conts);
106: zip.close();
107: bytes = stream.toByteArray();
108: } catch (IOException ioe) {
109: throw new ExceptionConverter(ioe);
110: }
111: put(PdfName.FILTER, PdfName.FLATEDECODE);
112: } else
113: bytes = conts;
114: setLength(bytes.length);
115: }
116:
117: /**Sets the data associated with the stream
118: * @param data raw data, decrypted and uncompressed.
119: */
120: public void setData(byte[] data) {
121: remove(PdfName.FILTER);
122: this .offset = -1;
123: if (Document.compress) {
124: try {
125: ByteArrayOutputStream stream = new ByteArrayOutputStream();
126: DeflaterOutputStream zip = new DeflaterOutputStream(
127: stream);
128: zip.write(data);
129: zip.close();
130: bytes = stream.toByteArray();
131: } catch (IOException ioe) {
132: throw new ExceptionConverter(ioe);
133: }
134: put(PdfName.FILTER, PdfName.FLATEDECODE);
135: } else
136: bytes = data;
137: setLength(bytes.length);
138: }
139:
140: public void setLength(int length) {
141: this .length = length;
142: put(PdfName.LENGTH, new PdfNumber(length));
143: }
144:
145: public int getOffset() {
146: return offset;
147: }
148:
149: public int getLength() {
150: return length;
151: }
152:
153: public PdfReader getReader() {
154: return reader;
155: }
156:
157: public byte[] getBytes() {
158: return bytes;
159: }
160:
161: public void setObjNum(int objNum, int objGen) {
162: this .objNum = objNum;
163: this .objGen = objGen;
164: }
165:
166: int getObjNum() {
167: return objNum;
168: }
169:
170: int getObjGen() {
171: return objGen;
172: }
173:
174: public void toPdf(PdfWriter writer, OutputStream os)
175: throws IOException {
176: byte[] b = PdfReader.getStreamBytesRaw(this );
177: PdfEncryption crypto = null;
178: if (writer != null)
179: crypto = writer.getEncryption();
180: PdfObject objLen = get(PdfName.LENGTH);
181: int nn = b.length;
182: if (crypto != null)
183: nn = crypto.calculateStreamSize(nn);
184: put(PdfName.LENGTH, new PdfNumber(nn));
185: super ToPdf(writer, os);
186: put(PdfName.LENGTH, objLen);
187: os.write(STARTSTREAM);
188: if (length > 0) {
189: if (crypto != null)
190: b = crypto.encryptByteArray(b);
191: os.write(b);
192: }
193: os.write(ENDSTREAM);
194: }
195: }
|