4

I am encountering an issue while merging two PDFs generated out of IText.

Code snippet of PDF Creation:

Document configuration is as below:

iText_xls_2_pdf = new Document(PageSize.A4.rotate(),10,0,30,0);

Using this configuration 2 PDFs are created.

After creation of these PDFs, they need to be merged as single pdf.

Below code is used to merge the PDFs:

Document document = new Document(PageSize.A4.rotate(),10,0,30,0);
try {
    List<InputStream> pdfs = streamOfPDFFiles;
    List<PdfReader> readers = new ArrayList<PdfReader>();
    int totalPages = 0;
    Iterator<InputStream> iteratorPDFs = pdfs.iterator();
    // Create Readers for the pdfs.
    while (iteratorPDFs.hasNext()) {
        InputStream pdf = iteratorPDFs.next();
        PdfReader pdfReader = new PdfReader(pdf);
        readers.add(pdfReader);
        totalPages += pdfReader.getNumberOfPages();
    }
    // Create a writer for the outputstream
    PdfWriter writer = PdfWriter.getInstance(document, 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<PdfReader> iteratorPDFReader = readers.iterator();
    // Loop through the PDF files and add to the output.
    while (iteratorPDFReader.hasNext()) {
        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;
    }
    outputStream.flush();
    document.close();
    outputStream.close();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (document.isOpen())
        document.close();
    try {
        if (outputStream != null)
            outputStream.close();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

This creates the merged PDF. but Because I have used .rotate in Document configuration, Merged pdf comes in landscape format. How could I avoid this.

Bruno Lowagie
  • 75,994
  • 9
  • 109
  • 165
roshancs10
  • 43
  • 1
  • 6
  • 2
    You are doing it all wrong because you either didn't read the documentation, or, if you did, you followed the advice of the wrong people. Do not use `PdfWriter` to merge documents! Use either `PdfCopy` or `PdfSmartCopy`! – Bruno Lowagie Sep 25 '15 at 11:18

1 Answers1

2

Please take a look at table 6.1 in chapter 6 of my book, you'll find out that using PdfWriter to merge documents is not done. If you want to merge documents, you need to use PdfCopy.

For an example, see for instance these questions:

(As you can see, this question has been answered many times before...)

An example:

PdfReader reader1 = new PdfReader(file1);
PdfReader reader2 = new PdfReader(file2);
Document document = new Document();
FileOutputStream fos = new FileOutputStream();
PdfCopy copy = new PdfCopy(document, fs);
document.open();
PdfImportedPage page;
PdfCopy.PageStamp stamp;
Phrase phrase;
BaseFont bf = BaseFont.createFont();
Font font = new Font(bf, 9);
int n = reader1.getNumberOfPages();
for (int i = 1; i <= reader1.getNumberOfPages(); i++) {
    page = copy.getImportedPage(reader1, i);
    stamp = copy.createPageStamp(page);
    phrase = new Phrase("page " + i, font);
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, 520, 5, 0);
    stamp.alterContents();
    copy.addPage(page);
}
for (int i = 1; i <= reader2.getNumberOfPages(); i++) {
    page = copy.getImportedPage(reader2, i);
    stamp = copy.createPageStamp(page);
    phrase = new Phrase("page " + (n + i), font);
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, 520, 5, 0);
    stamp.alterContents();
    copy.addPage(page);
}
document.close();
reader1.close();
reader2.close();
Community
  • 1
  • 1
Bruno Lowagie
  • 75,994
  • 9
  • 109
  • 165