Click here to Skip to main content
Click here to Skip to main content

Simple .NET PDF Merger

, 17 Nov 2014 GPL3
Rate this:
Please Sign up or sign in to vote.
A simple .NET PDF merger that supports header and footer text.


There are a couple of PDF mergers available on the Internet. But, either they are commercial products or don't support printing of the header and/or footer text, which is particularly interesting, e.g., to print the page number.


The presented PDF merger uses the open source PDF library iTextSharp to process PDF files. The sample solution also includes a tiny Windows Forms application to demonstrate the functionality.

Using the code

For the merge process, the PDF library takes advantage of the PDF page events of the iTextSharp.text.pdf.PdfWriter object. During the initialization of the PdfPageEvent instance (which inherits from iTextSharp.text.pdf.IPdfPageEvent), necessary information for the header/footer text could be passed in to the constructor call:

<s>writer.PageEvent = new PdfPageEvents(/*Any type of information goes here*/);</s>

It is important that the header and the footer text, both, are rendered in the 'public void OnEndPage(PdfWriter writer, Document document)' method. The 'public void OnStartPage(PdfWriter writer, Document document)' is not accurate.

For performance reasons, this library is now leveraging the PdfCopy class from the iTextSharp library instead of the described method above.

Even though the shown sample is very basic, it generally gives a good overview of how the header and the footer can be populated, e.g., with picture(s), text(s)...

The source code

using System;
using System.Collections.Generic;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace HelveticSolutions.PdfLibrary
    public static class PdfMerger
        /// <summary>
        /// Merge pdf files.
        /// </summary>
        /// <param name="sourceFiles">PDF files being merged.</param>
        /// <returns></returns>
        public static byte[] MergeFiles(List<byte[]> sourceFiles)
            Document document = new Document();
            using (MemoryStream ms = new MemoryStream())
                PdfCopy copy = new PdfCopy(document, ms);
                int documentPageCounter = 0;

                // Iterate through all pdf documents
                for (int fileCounter = 0; fileCounter < sourceFiles.Count; fileCounter++)
                    // Create pdf reader
                    PdfReader reader = new PdfReader(sourceFiles[fileCounter]);
                    int numberOfPages = reader.NumberOfPages;

                    // Iterate through all pages
                    for (int currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++)
                        PdfImportedPage importedPage = copy.GetImportedPage(reader, currentPageIndex);
                        PdfCopy.PageStamp pageStamp = copy.CreatePageStamp(importedPage);

                        // Write header
                        ColumnText.ShowTextAligned(pageStamp.GetOverContent(), Element.ALIGN_CENTER,
                            new Phrase("PDF Merger by Helvetic Solutions"), importedPage.Width / 2, importedPage.Height - 30,
                            importedPage.Width < importedPage.Height ? 0 : 1);

                        // Write footer
                        ColumnText.ShowTextAligned(pageStamp.GetOverContent(), Element.ALIGN_CENTER,
                            new Phrase(String.Format("Page {0}", documentPageCounter)), importedPage.Width / 2, 30,
                            importedPage.Width < importedPage.Height ? 0 : 1);




                return ms.GetBuffer();


  • 01.08.2008 - Article created.
  • 17.11.2014 - Updated implementation based on other user's feedback.


This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


About the Author

Michael Ulmann
Architect Helvetic Solutions
Australia Australia
MCAD, MCPD Web Developer 2.0, MCPD Enterprise Developer 3.5
My company: Helvetic Solutions
My blog: Sitecore Experts
Hopp Schwiiz Smile | :)

Comments and Discussions

QuestionCannot download your sample project Pinmemberfredatcodeproject17-Nov-14 2:50 
AnswerRe: Cannot download your sample project PinmemberMichael Ulmann17-Nov-14 12:34 
GeneralRe: Cannot download your sample project Pinmemberfredatcodeproject17-Nov-14 22:49 
SuggestionWorks....usually PinmemberFlindianaJones7-Nov-14 11:57 
GeneralRe: Works....usually PinmemberMichael Ulmann13-Nov-14 20:07 
GeneralRe: Works....usually PinmemberMichael Ulmann16-Nov-14 14:32 
QuestionMerge PinmemberMember 1019053616-Oct-14 6:36 
AnswerRe: Merge PinmemberMichael Ulmann16-Nov-14 14:30 
QuestionThank you PinprofessionalTammam Koujan1-Oct-14 5:34 
AnswerRe: Thank you PinmemberMichael Ulmann3-Nov-14 13:50 
GeneralMy vote of 3 PinmemberSunil Kumar P21-Sep-14 0:49 
GeneralRe: My vote of 3 PinmemberMichael Ulmann13-Nov-14 20:08 
GeneralMy vote of 5 PinmemberTyler Forsythe30-Jul-14 12:23 
GeneralRe: My vote of 5 PinmemberMichael Ulmann13-Nov-14 20:08 
Bugunable to open merged pdf PinmemberDevXYZ18-Jul-14 2:01 
GeneralRe: unable to open merged pdf PinmemberMichael Ulmann16-Nov-14 14:33 
QuestionMerged document always asks to be saved PinmemberRay Mitchell8-Jun-14 20:00 
AnswerRe: Merged document always asks to be saved PinmemberMember 365110127-Jul-14 21:05 
GeneralThanx PinmemberPRABHUSUN7-May-14 2:34 
GeneralRe: Thanx PinmemberMichael Ulmann13-Nov-14 20:08 
QuestionBlank pages - SQL report PDF PinmemberGarethfr3-Oct-13 6:54 
AnswerRe: Blank pages - SQL report PDF [modified] PinmemberMember 1077258924-Apr-14 7:27 
QuestionHelp for merging fillable PDF with regular PDF Pinmemberdfaber512-Jul-13 15:00 
QuestionCrop/Rotate PinmemberCorbin de Bruin25-Apr-13 7:45 
I'm using your code to combine pdf that I've previously cropeed and rotated individually (usually rotated 180 degrees). The merge process doesn't seem to handle this. My output pdf is coming in with original size and rotation. Could you suggest how to fix this?
Questionneed help for security PinmemberHanieef12-Mar-13 16:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150123.1 | Last Updated 17 Nov 2014
Article Copyright 2008 by Michael Ulmann
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid