java - How to merge documents correctly? -


i have following problem when printing pdf file after merge, pdf documents cut off. happens because documents aren't 8.5 x 11 might 11 x 17.

can make detect page size , use same page size documents? or, if not, possible have fit page?

following code:

package com.sumit.program;  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.itextpdf.text.document; import com.itextpdf.text.pagesize; import com.itextpdf.text.rectangle; import com.itextpdf.text.pdf.basefont; import com.itextpdf.text.pdf.pdfcontentbyte; import com.itextpdf.text.pdf.pdfimportedpage; import com.itextpdf.text.pdf.pdfreader; import com.itextpdf.text.pdf.pdfwriter;  public class mergepdf {      public static void main(string[] args) {         try {             list<inputstream> pdfs = new arraylist<inputstream>();              pdfs.add(new fileinputstream("c:\\documents , settings\\sumit\\desktop\\newecnproject\\document1.pdf"));             pdfs.add(new fileinputstream("c:\\documents , settings\\sumit\\desktop\\newecnproject\\landscape.pdf"));                        outputstream output = new fileoutputstream("c:\\documents , settings\\sumit\\desktop\\newecnproject\\merge1.pdf");             mergepdf.concatpdfs(pdfs, output, true);         } catch (exception e) {             e.printstacktrace();         }     }      public static void concatpdfs(list<inputstream> streamofpdffiles,             outputstream outputstream, boolean paginate) {          document document = new document();         try {             list<inputstream> pdfs = streamofpdffiles;             list<pdfreader> readers = new arraylist<pdfreader>();             int totalpages = 0;             iterator<inputstream> iteratorpdfs = pdfs.iterator();              // create readers pdfs.             int i=1;             while (iteratorpdfs.hasnext()) {                 inputstream pdf = iteratorpdfs.next();                 pdfreader pdfreader = new pdfreader(pdf);                 system.out.println("page size "+pdfreader.getpagesize(1));                 readers.add(pdfreader);                 totalpages += pdfreader.getnumberofpages();                 i++;             }             // create writer outputstream             pdfwriter writer = pdfwriter.getinstance(document, outputstream);             writer.setcompressionlevel(9);             document.open();             basefont bf = basefont.createfont(basefont.helvetica,                     basefont.cp1252, basefont.not_embedded);             pdfcontentbyte cb = writer.getdirectcontent(); // holds pdf data              pdfimportedpage page;             int currentpagenumber = 0;             int pageofcurrentreaderpdf = 0;             iterator<pdfreader> iteratorpdfreader = readers.iterator();              // loop through pdf files , add output.             while (iteratorpdfreader.hasnext()) {                 pdfreader pdfreader = iteratorpdfreader.next();                  // create new page in target each source page.                 system.out.println("no. of pages "+pdfreader.getnumberofpages());                i=0;                 while (pageofcurrentreaderpdf < pdfreader.getnumberofpages()) {                     rectangle r=pdfreader.getpagesize(pdfreader.getpagen(pageofcurrentreaderpdf+1));                     if(r.getwidth()==792.0 && r.getheight()==612.0)                         document.setpagesize(pagesize.a4.rotate());                     else                         document.setpagesize(pagesize.a4);                     document.newpage();                     pageofcurrentreaderpdf++;                     currentpagenumber++;                     i++;                      page = writer.getimportedpage(pdfreader,                             pageofcurrentreaderpdf);                     system.out.println("width "+page.getwidth());                     system.out.println("height "+page.getheight());                     cb.newlinetext();                     cb.addtemplate(page, 0, 0);                      // code pagination.                     if (paginate) {                         cb.begintext();                         cb.setfontandsize(bf, 9);                         cb.showtextaligned(pdfcontentbyte.align_center, ""                                 + currentpagenumber + " of " + totalpages, 520,                                 5, 0);                         cb.endtext();                     }                 }                 pageofcurrentreaderpdf = 0;             }             outputstream.flush();             document.close();             outputstream.close();             system.out.println("merging of pdfs done.......");         } catch (exception e) {             e.printstacktrace();         } {             if (document.isopen())                 document.close();             try {                 if (outputstream != null)                     outputstream.close();             } catch (ioexception ioe) {                 ioe.printstacktrace();             }         }     } } 

enter image description here

using document , pdfwriter class in combination addtemplate() method merge documents bad idea. that's not addtemplate() method meant for. have explicitly or implicitly defined page size document working with. addtemplate() method, add pdfimportedpage instances, and

  • when add new page same page size , rotation, throw away interactivity exists in page, otherwise well,
  • when add new page different page size , rotation, result describe. because of difference in size, imported page , new page not match. parts cut off, margins appear, rotations different, etc.

this explained in chapter 6 of book. should use pdfcopy instead of pdfwriter. see instance fillflattenmerge2 example:

document document = new document(); pdfcopy copy = new pdfsmartcopy(document, new fileoutputstream(dest)); document.open(); pdfreader reader; string line = br.readline(); // loop on readers     // add pdf pdfcopy     reader = new pdfreader(baos.tobytearray());     copy.adddocument(reader);     reader.close(); // end loop document.close(); 

in case, need add page numbers, can in second go, done in stamppagexofy example:

pdfreader reader = new pdfreader(src); int n = reader.getnumberofpages(); pdfstamper stamper = new pdfstamper(reader, new fileoutputstream(dest)); pdfcontentbyte pagecontent; (int = 0; < n; ) {     pagecontent = stamper.getovercontent(++i);     columntext.showtextaligned(pagecontent, element.align_right,             new phrase(string.format("page %s of %s", i, n)), 559, 806, 0); } stamper.close(); reader.close(); 

or can add them while merging, done in mergewithtoc example.

document document = new document(); pdfcopy copy = new pdfcopy(document, new fileoutputstream(filename)); pagestamp stamp; document.open(); int n; int pageno = 0; pdfimportedpage page; chunk chunk; (map.entry<string, pdfreader> entry : filestomerge.entryset()) {     n = entry.getvalue().getnumberofpages();     (int = 0; < n; ) {         pageno++;         page = copy.getimportedpage(entry.getvalue(), ++i);         stamp = copy.createpagestamp(page);         chunk = new chunk(string.format("page %d", pageno));         if (i == 1)             chunk.setlocaldestination("p" + pageno);         columntext.showtextaligned(stamp.getundercontent(),                 element.align_right, new phrase(chunk),                 559, 810, 0);         stamp.altercontents();         copy.addpage(page);     } } document.close(); (pdfreader r : filestomerge.values()) {     r.close(); } reader.close(); 

i advise against using pdfwriter merge documents! it's not impossible if change page size , rotation of page in document class, you're making harder on yourself. moreover: using pdfwriter throws away interactivity (links, annotations,...) exists in pages you're merging. customer may experience bug.


Comments

Popular posts from this blog

html - Styling progress bar with inline style -

java - Oracle Sql developer error: could not install some modules -

How to use autoclose brackets in Jupyter notebook? -