1 /*
2  * $Id: PdfReaderInstance.java,v 1.27 2003/05/02 09:01:27 blowagie Exp $
3  * $Name:  $
4  *
5  * Copyright 2001, 2002 Paulo Soares
6  *
7  *
8  * The Original Code is 'iText, a free JAVA-PDF library'.
9  *
10  * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
11  * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
12  * All Rights Reserved.
13  * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
14  * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
15  *
16  * Contributor(s): all the names of the contributors are added in the source code
17  * where applicable.
18  *
19  *
20  * This library is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU Library General Public
22  * License as published by the Free Software Foundation; either
23  * version 2 of the License, or (at your option) any later version.
24  *
25  * This library is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
28  * Library General Public License for more details.
29  *
30  * You should have received a copy of the GNU Library General Public
31  * License along with this library; if not, write to the
32  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
33  * Boston, MA  02110-1301, USA.
34  *
35  *
36  * This library is free software; you can redistribute it and/or
37  * modify it under the terms of the GNU Library General Public
38  * License as published by the Free Software Foundation; either
39  * version 2 of the License, or (at your option) any later version.
40  *
41  * This library is distributed in the hope that it will be useful,
42  * but WITHOUT ANY WARRANTY; without even the implied warranty of
43  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
44  * Library General Public License for more details.
45  *
46  * You should have received a copy of the GNU Library General Public
47  * License along with this library; if not, write to the
48  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
49  * Boston, MA  02110-1301, USA.
50  *
51  *
52  * If you didn't download this code from the following link, you should check if
53  * you aren't using an obsolete version:
54  * http://www.lowagie.com/iText/
55  */
56 
57 package com.gitlab.pdftk_java.com.lowagie.text.pdf;
58 import java.util.ArrayList;
59 import java.util.HashMap;
60 import java.util.Iterator;
61 import java.io.*;
62 /**
63  * Instance of PdfReader in each output document.
64  *
65  * @author Paulo Soares (psoares@consiste.pt)
66  */
67 class PdfReaderInstance {
68     static final PdfLiteral IDENTITYMATRIX = new PdfLiteral("[1 0 0 1 0 0]");
69     static final PdfNumber ONE = new PdfNumber(1);
70     int myXref[];
71     PdfReader reader;
72     RandomAccessFileOrArray file;
73     HashMap importedPages = new HashMap();
74     PdfWriter writer;
75     HashMap visited = new HashMap();
76     ArrayList nextRound = new ArrayList();
77 
PdfReaderInstance(PdfReader reader, PdfWriter writer)78     PdfReaderInstance(PdfReader reader, PdfWriter writer) throws IOException {
79         this.reader = reader;
80         this.writer = writer;
81         file = reader.getSafeFile();
82         myXref = new int[reader.getXrefSize()];
83     }
84 
getReader()85     PdfReader getReader() {
86         return reader;
87     }
88 
getImportedPage(int pageNumber)89     PdfImportedPage getImportedPage(int pageNumber) {
90         if (pageNumber < 1 || pageNumber > reader.getNumberOfPages())
91             throw new IllegalArgumentException("Invalid page number");
92         Integer i = new Integer(pageNumber);
93         PdfImportedPage pageT = (PdfImportedPage)importedPages.get(i);
94         if (pageT == null) {
95             pageT = new PdfImportedPage(this, writer, pageNumber);
96             importedPages.put(i, pageT);
97         }
98         return pageT;
99     }
100 
getNewObjectNumber(int number, int generation)101     int getNewObjectNumber(int number, int generation) {
102         if (myXref[number] == 0) {
103             myXref[number] = writer.getIndirectReferenceNumber();
104             nextRound.add(new Integer(number));
105         }
106         return myXref[number];
107     }
108 
getReaderFile()109     RandomAccessFileOrArray getReaderFile() {
110         return file;
111     }
112 
getResources(int pageNumber)113     PdfObject getResources(int pageNumber) {
114         PdfObject obj = PdfReader.getPdfObjectRelease(reader.getPageNRelease(pageNumber).get(PdfName.RESOURCES));
115         return obj;
116     }
117 
118 
getFormXObject(int pageNumber)119     PdfStream getFormXObject(int pageNumber) throws IOException {
120         PdfDictionary page = reader.getPageNRelease(pageNumber);
121         PdfObject contents = PdfReader.getPdfObjectRelease(page.get(PdfName.CONTENTS));
122         PdfDictionary dic = new PdfDictionary();
123         byte bout[] = null;
124         if (contents != null) {
125             if (contents.isStream())
126                 dic.putAll((PRStream)contents);
127             else
128                 bout = reader.getPageContent(pageNumber, file);
129         }
130         else
131             bout = new byte[0];
132         dic.put(PdfName.RESOURCES, PdfReader.getPdfObjectRelease(page.get(PdfName.RESOURCES)));
133         dic.put(PdfName.TYPE, PdfName.XOBJECT);
134         dic.put(PdfName.SUBTYPE, PdfName.FORM);
135         PdfImportedPage impPage = (PdfImportedPage)importedPages.get(new Integer(pageNumber));
136         dic.put(PdfName.BBOX, new PdfRectangle(impPage.getBoundingBox()));
137         PdfArray matrix = impPage.getMatrix();
138         if (matrix == null)
139             dic.put(PdfName.MATRIX, IDENTITYMATRIX);
140         else
141             dic.put(PdfName.MATRIX, matrix);
142         dic.put(PdfName.FORMTYPE, ONE);
143         PRStream stream;
144         if (bout == null) {
145             stream = new PRStream((PRStream)contents, dic);
146         }
147         else {
148             stream = new PRStream(reader, bout);
149             stream.putAll(dic);
150         }
151         return stream;
152     }
153 
writeAllVisited()154     void writeAllVisited() throws IOException {
155         while (nextRound.size() > 0) {
156             ArrayList vec = nextRound;
157             nextRound = new ArrayList();
158             for (int k = 0; k < vec.size(); ++k) {
159                 Integer i = (Integer)vec.get(k);
160                 if (!visited.containsKey(i)) {
161                     visited.put(i, null);
162                     int n = i.intValue();
163                     writer.addToBody(reader.getPdfObjectRelease(n), myXref[n]);
164                 }
165             }
166         }
167     }
168 
writeAllPages()169     void writeAllPages() throws IOException {
170         try {
171             file.reOpen();
172             for (Iterator it = importedPages.values().iterator(); it.hasNext();) {
173                 PdfImportedPage ip = (PdfImportedPage)it.next();
174                 writer.addToBody(ip.getFormXObject(), ip.getIndirectReference());
175             }
176             writeAllVisited();
177         }
178         finally {
179             try {
180                 reader.close();
181                 file.close();
182             }
183             catch (Exception e) {
184                 //Empty on purpose
185             }
186         }
187     }
188 }