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 }