I’ve made a simple class to merge PDF files using iText#:
csharp:using System;
using System.
Collections.
Generic;
using System.
IO;
using iTextSharp.
text;
using iTextSharp.
text.
pdf;
public class PdfMerge
{
private BaseFont baseFont;
private bool enablePagination =
false;
private readonly List<PdfReader> documents;
private int totalPages;
public BaseFont BaseFont
{
get
{ return baseFont;
}
set
{ baseFont = value;
}
}
public bool EnablePagination
{
get
{ return enablePagination;
}
set
{
enablePagination = value;
if (value && baseFont ==
null)
baseFont = BaseFont.
CreateFont(BaseFont.
HELVETICA, BaseFont.
CP1252, BaseFont.
NOT_EMBEDDED);
}
}
public List<PdfReader> Documents
{
get
{ return documents;
}
}
public void AddDocument
(string filename
)
{
documents.
Add(new PdfReader
(filename
));
}
public void AddDocument
(Stream pdfStream
)
{
documents.
Add(new PdfReader
(pdfStream
));
}
public void AddDocument
(byte[] pdfContents
)
{
documents.
Add(new PdfReader
(pdfContents
));
}
public void AddDocument
(PdfReader pdfDocument
)
{
documents.
Add(pdfDocument
);
}
public void Merge
(string outputFilename
)
{
Merge
(new FileStream
(outputFilename, FileMode.
Create));
}
public void Merge
(Stream outputStream
)
{
if (outputStream ==
null || !outputStream.
CanWrite)
throw new Exception
("OutputStream es nulo o no se puede escribir en éste.");
Document newDocument =
null;
try
{
newDocument =
new Document
();
PdfWriter pdfWriter = PdfWriter.
GetInstance(newDocument, outputStream
);
newDocument.
Open();
PdfContentByte pdfContentByte = pdfWriter.
DirectContent;
if (EnablePagination
)
documents.
ForEach(delegate(PdfReader doc
)
{
totalPages += doc.
NumberOfPages;
});
int currentPage =
1;
foreach (PdfReader pdfReader
in documents
)
{
for (int page =
1; page <= pdfReader.
NumberOfPages; page++
)
{
newDocument.
NewPage();
PdfImportedPage importedPage = pdfWriter.
GetImportedPage(pdfReader, page
);
pdfContentByte.
AddTemplate(importedPage,
0,
0);
if (EnablePagination
)
{
pdfContentByte.
BeginText();
pdfContentByte.
SetFontAndSize(baseFont,
9);
pdfContentByte.
ShowTextAligned(PdfContentByte.
ALIGN_CENTER,
string.
Format("{0} de {1}", currentPage++, totalPages
),
520,
5,
0);
pdfContentByte.
EndText();
}
}
}
}
finally
{
outputStream.
Flush();
if (newDocument !=
null)
newDocument.
Close();
outputStream.
Close();
}
}
public PdfMerge
()
{
documents =
new List<PdfReader>
();
}
}
Usage:
csharp:string basePath =
"c:\\pdf";
PdfMerge demo =
new PdfMerge
();
demo.
AddDocument(Path.
Combine(basePath,
"static-dynamic-typing-meijer.pdf"));
demo.
AddDocument(Path.
Combine(basePath,
"composable-memory-transactions.pdf"));
demo.
Merge("mergedPapers.pdf");
Console.
WriteLine("Archivo generado en: {0}", Path.
GetFullPath("mergedPapers.pdf"));
If you want the source code, you can download the Visual Studio 2005 solution.