pdfmergeitextpdfpage

How to merge pdf documents and add pages in between


I have a requirement where i have to merge multiple PDF documents and add pages also with some text. For e.g. I have copied pages from one PDF and now i have to add a page with some text and then i need to copy pages from second PDF and then again i need to add a page with some text...

I have tried merging PDFs but it just merge the PDFs i want to add some text after each PDF document.

I want to use iTextSharp. Below is the code snippet:

// step 1: creation of a document-object Document document = new Document();

        // step 2: we create a writer that listens to the document
        PdfCopy writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create));
        if (writer == null)
        {
            return;
        }

        // step 3: we open the document
        document.Open();

        foreach (string fileName in fileNames)
        {
            // we create a reader for a certain document
            PdfReader reader = new PdfReader(fileName);
            reader.ConsolidateNamedDestinations();

            // step 4: we add content
            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                PdfImportedPage page = writer.GetImportedPage(reader, i);
                writer.AddPage(page);
            }


            //This commented part is not working
            ////Add a new page to the pdf file
            //document.NewPage();

            //Paragraph paragraph = new Paragraph();
            //Font titleFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA
            //                          , 15
            //                          , iTextSharp.text.Font.BOLD
            //                          , BaseColor.BLACK
            //    );
            //Chunk titleChunk = new Chunk("Comments", titleFont);
            //paragraph.Add(titleChunk);
            //writer.Add(paragraph);

            //paragraph = new Paragraph();
            //Font textFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA
            //                         , 12
            //                         , iTextSharp.text.Font.NORMAL
            //                         , BaseColor.BLACK
            //    );
            //Chunk textChunk = new Chunk("Hello", textFont);
            //paragraph.Add(textChunk);
            //writer.Add(paragraph);
            //document.Add(paragraph);

            reader.Close();

        }

        // step 5: we close the document and writer
        writer.Close();
        document.Close();

Thanks in advance.


Solution

  • You can't use document.newPage() in combination with PdfCopy. If you want to insert extra pages with content that is created on the fly, you need to create a new document in memory: Create PDF in memory instead of physical file

    For instance, you could create this method:

    private byte[] CreatePdf(String comments)
    {
        Document doc = new Document(PageSize.LETTER);
        using (MemoryStream output = new MemoryStream())
        {
            PdfWriter wri = PdfWriter.GetInstance(doc, output);
            doc.Open();
            Paragraph header = new Paragraph("Comments");
            doc.Add(header);
            Paragraph paragraph = new Paragraph(comments);
            doc.Add(paragraph);
            doc.Close();
            return output.ToArray();
        }
    }
    

    In your code, you could use that method like this:

    writer.AddDocument(new PdfReader(CreatePdf("Test comment")););
    

    Note that you don't need to loop over the pages. You have:

    for (int i = 1; i <= reader.NumberOfPages; i++)
    {
         PdfImportedPage page = writer.GetImportedPage(reader, i);
         writer.AddPage(page);
    }
    

    You can use:

    writer.AddDocument(reader);