Problem in merging large collection of PDF in single pdf at a time-itext
807589Oct 22 2008 — edited Oct 22 2008hi
i am using itext library for PDF generation.My problem is ,when i merge the large number of PDFs which is already
generated, in a single PDF ,i got 'Out of Memery' exceptions,but when i doing this with limited number of PDFs
they are concated as a single PDF .so what shall i do to overcome Out of memory exceptions.because,our client wants to print the mass PDF ,which may have more than 1000 PDFs on a single merged PDF .if any possible,when i merge the single PDF with already merged PDF one by one at a time when it will be generated,how can i handle I/O streams to open one PDF at a time and merge with already generated PDF on the same time,and how can i append the generating PDF directly on already generated PDF using streams
This is my java code:
package javaexamples;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.lowagie.text.Document;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
public class ConcatPDFs {
public static void main(String[] args) {
try {
List pdfs = new ArrayList();
Document document = new Document();
OutputStream output = new FileOutputStream("E:\\templates\\out\\Merged PDF\\merge.pdf",true);
PdfWriter writer = PdfWriter.getInstance(document, output);
pdfs.add(new FileInputStream("E:\\templates\\out\\07J439HF_FINAL_EVALU.pdf"));
pdfs.add(new FileInputStream("E:\\templates\\out\\07J440HF_FINAL_EVALU.pdf"))*;*//it may be increased over thousand paths.
ConcatPDFs.concatPDFs(document,writer,pdfs, true);
output.flush();
document.close();
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void concatPDFs(Document document,PdfWriter writer,List streamOfPDFFiles, boolean paginate) {
try {
List pdfs = streamOfPDFFiles;
List readers = new ArrayList();
int totalPages = 0;
java.util.Iterator iteratorPDFs = pdfs.iterator();
// Create Readers for the pdfs.
while (iteratorPDFs.hasNext()) {
InputStream pdf = (FileInputStream)iteratorPDFs.next();
PdfReader pdfReader = new PdfReader(pdf);
readers.add(pdfReader);
totalPages += pdfReader.getNumberOfPages();
}
// Create a writer for the outputstream
document.open();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
// data
PdfImportedPage page;
int currentPageNumber = 0;
int pageOfCurrentReaderPDF = 0;
Iterator iteratorPDFReader = readers.iterator();
// Loop through the PDF files and add to the output.
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = (PdfReader)iteratorPDFReader.next();
// Create a new page in the target for each source page.
while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
document.newPage();
pageOfCurrentReaderPDF++;
currentPageNumber++;
page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);
cb.addTemplate(page, 0, 0);
// Code for pagination.
if (paginate) {
cb.beginText();
cb.setFontAndSize(bf, 9);
cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "" + currentPageNumber + " of " + totalPages, 520, 5, 0);
cb.endText();
}
}
pageOfCurrentReaderPDF = 0;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("SUCCESS");
/*try {
if (outputStream != null);
//outputStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}*/
}
}
}
thanks in advance
regards
Oasisdeserts