merge many pdf files into one pdf files in web application java

Viewed 5605

I have many pdf files and I have to merge all pdf into one big pdf file and render it into browser.I am using itext. Using this, I am able to merge pdf files into one file into disk but I cannot merge into browser and there is only last pdf in browser..following is my code.. please help me on this.

Thanks in advance.

            Document document = new Document();
            List<PdfReader> readers = 
                    new ArrayList<PdfReader>();
            int totalPages = 0;

            ServletOutputStream servletOutPutStream = response.getOutputStream();;
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();;

            InputStream is=null;
            List<InputStream> inputPdfList = new ArrayList<InputStream>();
            System.err.println(imageMap.size());

            for(byte[] imageList:imageMap)
            {
                System.out.println(imageList.toString()+"   "+imageList.length);


                 byteArrayOutputStream.write(imageList);

                 byteArrayOutputStream.writeTo(response.getOutputStream());

                 is = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); 
                 inputPdfList.add(is);

            }
            response.setContentType("application/pdf");
            response.setContentLength(byteArrayOutputStream.size());

            System.out.println(inputPdfList.size()+""+inputPdfList.toString());
            //Create pdf Iterator object using inputPdfList.
            Iterator<InputStream> pdfIterator = 
                    inputPdfList.iterator();

            // Create reader list for the input pdf files.
            while (pdfIterator.hasNext()) {
                    InputStream pdf = pdfIterator.next();
                    PdfReader pdfReader = new PdfReader(pdf);
                    readers.add(pdfReader);
                    totalPages = totalPages + pdfReader.getNumberOfPages();
            }

            // Create writer for the outputStream
            PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());

            //Open document.
            document.open();

            //Contain the pdf data.
            PdfContentByte pageContentByte = writer.getDirectContent();

            PdfImportedPage pdfImportedPage;
            int currentPdfReaderPage = 1;
            Iterator<PdfReader> iteratorPDFReader = readers.iterator();

            // Iterate and process the reader list.
            while (iteratorPDFReader.hasNext()) {
                    PdfReader pdfReader = iteratorPDFReader.next();
                    //Create page and add content.
                    while (currentPdfReaderPage <= pdfReader.getNumberOfPages()) {
                          document.newPage();
                          pdfImportedPage = writer.getImportedPage(
                                  pdfReader,currentPdfReaderPage);
                          pageContentByte.addTemplate(pdfImportedPage, 0, 0);
                          currentPdfReaderPage++;
                    }
                    currentPdfReaderPage = 1;
            }

            //Close document and outputStream.
            servletOutPutStream.flush();
            outputStream.flush();
            document.close();
            outputStream.close();

            servletOutPutStream.close();
            System.out.println("Pdf files merged successfully.");
2 Answers

//Suppose we want to merge one pdf with another main pdf

          InputStream is1 = null;



          if (file1 != null) {

                 FileInputStream fis1 = new FileInputStream(file1);

                 byte[] file1Data = new byte[(int) file1.length()];

                 fis1.read(file1Data);

                 is1 = new java.io.ByteArrayInputStream(file1Data);

          }



          //

          InputStream mainContent = <ur main content>



          org.apache.pdfbox.pdmodel.PDDocument mergedPDF = new org.apache.pdfbox.pdmodel.PDDocument();

          org.apache.pdfbox.pdmodel.PDDocument mainDoc = org.apache.pdfbox.pdmodel.PDDocument.load(mainContent);

          org.apache.pdfbox.multipdf.PDFMergerUtility merger = new org.apache.pdfbox.multipdf.PDFMergerUtility();



          merger.appendDocument(mergedPDF, mainDoc);



          PDDocument doc1 = null;



          if (is1 != null) {

                 doc1 = PDDocument.load(is1);

                 merger.appendDocument(mergedPDF, doc1);

                //1st file appended to main pdf");

          }

         



          ByteArrayOutputStream baos = new ByteArrayOutputStream();

          mergedPDF.save(baos);

//Now either u save it here or convert into InputStream if u want

          ByteArrayInputStream mergedInputStream = new ByteArrayInputStream(baos.toByteArray());
Related