jueves, 15 de noviembre de 2012

Juntar varios ficheros PDF en .Net

Normalmente una aplicación puede generar varios PDF que mostrar al usuario y en vez de enviarle n documentos la mejor solución es juntarlos en un solo archivo.
Para realizar esta tarea vamos a utilizar la biblioteca iTextSharp, la licencia que tiene es gratuita y se puede utilizar para cualquier proyecto.
Hay varias formas de obtener la misma pero sin duda la mejor forma de obtener esta biblioteca es bajarla a través de NuGet.Si no lo tenemos instalado NuGet desde este enlace se puede instalar: NuGet.
Desde la ventana de NuGet buscamos iTextSharp y nos bajamos la biblioteca y que la añada a la aplicación que estamos desarrollando.
También lo podemos hacer desde la consola de NuGet, para ello accedemos a la consola de NuGet y ejecutamos el siguiente comando:
Install-Package itextsharp
Con el comando anterior se descarga de la web la última versión de la libreria y le añade la referencia a nuestro proyecto, con lo cual ya se puede usar sin problemas.
El codigo para juntar los archivos es bastante sencillo:

var document = new Document(); 
var ms = new MemoryStream();

string[] Lista = { "doc1.pdf""doc2.pdf" };
 
var pdfCopy = new PdfCopy(document, ms);

document.Open();

foreach (var item in Lista)
{
  var pdfReader = new PdfReader(item);
  var n = pdfReader.NumberOfPages;
  for (var page = 0; page < n; )
  {
    pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfReader, ++page));
  }
  pdfCopy.FreeReader(pdfReader);
}
pdfCopy.Flush();
 
document.Close();
ms.WriteTo(new FileStream("documentoJutar.pdf"FileMode.OpenOrCreate));

Lo que se hace en el codigo anterior es crear un Docuemnt con la librería de iTextSharp, y un Memory Stream para ir escribiendo en memoria los documentos que vamos a juntar.
Ponemos la lista de documentos e inicializamos el objeto PdfCopy que es el que hara el trabajo.
Con un for se recorren los archivos y se van copiando página a página.
Una vez acabado se cierra el documento y se escribe en disco lo que hemos hecho en memoria.

Así de simple y sencillo es juntar ficheros PDF con C#. Espero sea util.

4 comentarios:

Santiago dijo...

No funciona ...

Iñaki dijo...

Hola Santiago, y ¿qué es lo que no funciona?

Elkin Garces Carreño dijo...

como hago para escoger varios pdf de una carpeta en una carpeta en mi escritorio por medio de codigo.

Iñaki dijo...

Puedes usar lo siguiente:
string path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\carpeta\";
string[] dirs = Directory.GetFiles(path, "*.pdf");

Un saludo y espero que te sea útil.