001/* 002 * $Id: PdfIndirectObject.java 4784 2011-03-15 08:33:00Z blowagie $ 003 * 004 * This file is part of the iText (R) project. 005 * Copyright (c) 1998-2011 1T3XT BVBA 006 * Authors: Bruno Lowagie, Paulo Soares, et al. 007 * 008 * This program is free software; you can redistribute it and/or modify 009 * it under the terms of the GNU Affero General Public License version 3 010 * as published by the Free Software Foundation with the addition of the 011 * following permission added to Section 15 as permitted in Section 7(a): 012 * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY 1T3XT, 013 * 1T3XT DISCLAIMS THE WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. 014 * 015 * This program is distributed in the hope that it will be useful, but 016 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 017 * or FITNESS FOR A PARTICULAR PURPOSE. 018 * See the GNU Affero General Public License for more details. 019 * You should have received a copy of the GNU Affero General Public License 020 * along with this program; if not, see http://www.gnu.org/licenses or write to 021 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 022 * Boston, MA, 02110-1301 USA, or download the license from the following URL: 023 * http://itextpdf.com/terms-of-use/ 024 * 025 * The interactive user interfaces in modified source and object code versions 026 * of this program must display Appropriate Legal Notices, as required under 027 * Section 5 of the GNU Affero General Public License. 028 * 029 * In accordance with Section 7(b) of the GNU Affero General Public License, 030 * a covered work must retain the producer line in every PDF that is created 031 * or manipulated using iText. 032 * 033 * You can be released from the requirements of the license by purchasing 034 * a commercial license. Buying such a license is mandatory as soon as you 035 * develop commercial activities involving the iText software without 036 * disclosing the source code of your own applications. 037 * These activities include: offering paid services to customers as an ASP, 038 * serving PDFs on the fly in a web application, shipping iText with a closed 039 * source product. 040 * 041 * For more information, please contact iText Software Corp. at this 042 * address: sales@itextpdf.com 043 */ 044package com.itextpdf.text.pdf; 045 046import java.io.IOException; 047import java.io.OutputStream; 048 049import com.itextpdf.text.DocWriter; 050 051/** 052 * <CODE>PdfIndirectObject</CODE> is the Pdf indirect object. 053 * <P> 054 * An <I>indirect object</I> is an object that has been labeled so that it can be referenced by 055 * other objects. Any type of <CODE>PdfObject</CODE> may be labeled as an indirect object.<BR> 056 * An indirect object consists of an object identifier, a direct object, and the <B>endobj</B> 057 * keyword. The <I>object identifier</I> consists of an integer <I>object number</I>, an integer 058 * <I>generation number</I>, and the <B>obj</B> keyword.<BR> 059 * This object is described in the 'Portable Document Format Reference Manual version 1.7' 060 * section 3.2.9 (page 63-65). 061 * 062 * @see PdfObject 063 * @see PdfIndirectReference 064 */ 065 066public class PdfIndirectObject { 067 068 // membervariables 069 070/** The object number */ 071 protected int number; 072 073/** the generation number */ 074 protected int generation = 0; 075 076 static final byte STARTOBJ[] = DocWriter.getISOBytes(" obj\n"); 077 static final byte ENDOBJ[] = DocWriter.getISOBytes("\nendobj\n"); 078 static final int SIZEOBJ = STARTOBJ.length + ENDOBJ.length; 079 PdfObject object; 080 PdfWriter writer; 081 082 // constructors 083 084/** 085 * Constructs a <CODE>PdfIndirectObject</CODE>. 086 * 087 * @param number the object number 088 * @param object the direct object 089 */ 090 091 PdfIndirectObject(int number, PdfObject object, PdfWriter writer) { 092 this(number, 0, object, writer); 093 } 094 095 PdfIndirectObject(PdfIndirectReference ref, PdfObject object, PdfWriter writer) { 096 this(ref.getNumber(),ref.getGeneration(),object,writer); 097 } 098/** 099 * Constructs a <CODE>PdfIndirectObject</CODE>. 100 * 101 * @param number the object number 102 * @param generation the generation number 103 * @param object the direct object 104 */ 105 106 PdfIndirectObject(int number, int generation, PdfObject object, PdfWriter writer) { 107 this.writer = writer; 108 this.number = number; 109 this.generation = generation; 110 this.object = object; 111 PdfEncryption crypto = null; 112 if (writer != null) 113 crypto = writer.getEncryption(); 114 if (crypto != null) { 115 crypto.setHashKey(number, generation); 116 } 117 } 118 119 // methods 120 121/** 122 * Return the length of this <CODE>PdfIndirectObject</CODE>. 123 * 124 * @return the length of the PDF-representation of this indirect object. 125 */ 126 127// public int length() { 128// if (isStream) 129// return bytes.size() + SIZEOBJ + stream.getStreamLength(writer); 130// else 131// return bytes.size(); 132// } 133 134 135/** 136 * Returns a <CODE>PdfIndirectReference</CODE> to this <CODE>PdfIndirectObject</CODE>. 137 * 138 * @return a <CODE>PdfIndirectReference</CODE> 139 */ 140 141 public PdfIndirectReference getIndirectReference() { 142 return new PdfIndirectReference(object.type(), number, generation); 143 } 144 145/** 146 * Writes efficiently to a stream 147 * 148 * @param os the stream to write to 149 * @throws IOException on write error 150 */ 151 void writeTo(OutputStream os) throws IOException 152 { 153 os.write(DocWriter.getISOBytes(String.valueOf(number))); 154 os.write(' '); 155 os.write(DocWriter.getISOBytes(String.valueOf(generation))); 156 os.write(STARTOBJ); 157 object.toPdf(writer, os); 158 os.write(ENDOBJ); 159 } 160}