Share this page 

Concatenate PDF files (using iText)Tag(s): IO Open Source


This HowTo is based on the iText package. You need a recent version (ex. 2.*)

This a command line utility. You specify the pdf files to be merge into one.

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import com.lowagie.text.Document;
import com.lowagie.text.pdf.PRAcroForm;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.SimpleBookmark;

public class ConcatPDFFiles {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
      try {
         if (args.length < 2) {
           System.out.println
             ("Usage: ConcatPDFFiles file1.pdf [file2.pdf... fileN.pdf] out.pdf");
           System.exit(1);
         }
         int pageOffset = 0;
         ArrayList master = new ArrayList();
         int f = 0;
         String outFile = args[args.length - 1];
         Document document = null;
         PdfCopy writer = null;
         while (f < args.length - 1) {
           PdfReader reader = new PdfReader(args[f]);
           reader.consolidateNamedDestinations();
           int n = reader.getNumberOfPages();
           List bookmarks = SimpleBookmark.getBookmark(reader);
           if (bookmarks != null) {
             if (pageOffset != 0) {
               SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset,
                  null);
             }
             master.addAll(bookmarks);
            }
            pageOffset += n;

            if (f == 0) {
              document = new Document(reader.getPageSizeWithRotation(1));
              writer = new PdfCopy(document,
                  new FileOutputStream(outFile));
              document.open();
            }
            PdfImportedPage page;
            for (int i = 0; i < n;) {
              ++i;
              page = writer.getImportedPage(reader, i);
              writer.addPage(page);
            }
            PRAcroForm form = reader.getAcroForm();
            if (form != null) {
              writer.copyAcroForm(reader);
            }
            f++;
         }
         if (!master.isEmpty()) {
           writer.setOutlines(master);
         }
         document.close();
      } 
      catch (Exception e) {
        e.printStackTrace();
      }
    }
}
ref : iText example

See also this HowTo.