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.
Arthur 4:41 am on April 4, 2008 Enlace permanente
Hello,
Thank for this post, but :
where do you find com.lowagie.tools ?
Is it a part of the textsharp lib ?
I didn’t find.
Thanks.
Arth’
alex 8:14 am on April 4, 2008 Enlace permanente
It is part of iTextDotNet
RAj 2:00 pm on November 3, 2009 Enlace permanente
Hi alex,
this is really nice…
do you have any idea how to merge the TOC (Table of Contentes) into first page while merging pdf files ?
Regards,
Raj.
Paul 11:48 am on January 7, 2010 Enlace permanente
In the above example where is the merged pdf file?
alex 3:39 pm on January 7, 2010 Enlace permanente
It is stored in the last element of the array (it only merges two pdf files).
Dennis 4:30 pm on July 30, 2010 Enlace permanente
This looks like a great tool. Just what i need for a little tool I am writing at the moment. Sadly, itext.dll ain’t working in my VS2010(vb.net), Vista64bit environment. When I hit debug I always get a “Could not load file or assembly iText.dll or one of its dependencies. An attempt was made to load a program with an incorrect format.”
itextsharp.dll works fine but does not include concat.pdf.
alex 8:38 am on August 2, 2010 Enlace permanente
Dennis, have you tried building yourself a new dll from the IText.NET source code ?