Concatenate PDF documents in C#

Resumen

Este artículo explica cómo fusionar, combinar o concatenar diferentes archivos PDF en un solo PDF usando C#. Cubre temas como

Concatenar archivos PDF usando rutas de archivo

PdfFileEditor es la clase en el espacio de nombres Aspose.Pdf.Facades que te permite concatenar múltiples archivos PDF. No solo puedes concatenar archivos usando FileStreams, sino también usando MemoryStreams. En este artículo, se explicará el proceso de concatenación de archivos usando MemoryStreams y luego se mostrará usando el fragmento de código.

El método Concatenate de la clase PdfFileEditor se puede usar para concatenar dos archivos PDF. El método Concatenate te permite pasar tres parámetros: primer PDF de entrada, segundo PDF de entrada y PDF de salida. El PDF de salida final contiene ambos archivos PDF de entrada.

El siguiente fragmento de código C# te muestra cómo concatenar archivos PDF usando rutas de archivo.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Concatenate files
pdfEditor.Concatenate(dataDir + "input.pdf", dataDir + "input2.pdf", dataDir + "ConcatenateUsingPath_out.pdf");

En algunos casos, cuando hay muchos esquemas, los usuarios pueden desactivarlos configurando CopyOutlines en falso y mejorar el rendimiento de la concatenación.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
PdfFileEditor pfe = new PdfFileEditor();
string[] files = Directory.GetFiles(dataDir);
pfe.CopyOutlines = false;
pfe.Concatenate(files, dataDir + "CopyOutline_out.pdf");

Concatenar varios archivos PDF usando MemoryStreams

El método Concatenate de la clase PdfFileEditor toma los archivos PDF de origen y el archivo PDF de destino como parámetros. Estos parámetros pueden ser rutas a los archivos PDF en el disco o pueden ser MemoryStreams. Ahora, para este ejemplo, primero crearemos dos flujos de archivos para leer los archivos PDF desde el disco. Luego convertiremos estos archivos en matrices de bytes. Estas matrices de bytes de los archivos PDF se convertirán en MemoryStreams. Una vez que obtengamos los MemoryStreams de los archivos PDF, podremos pasarlos al método de concatenación y fusionarlos en un único archivo de salida.

El siguiente fragmento de código C# le muestra cómo concatenar varios archivos PDF usando MemoryStreams:

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Create two file streams to read pdf files
FileStream fs1 = new FileStream(dataDir + "inFile.pdf", FileMode.Open, FileAccess.Read);
FileStream fs2 = new FileStream(dataDir + "inFile2.pdf", FileMode.Open, FileAccess.Read);
// Create byte arrays to keep the contents of PDF files
byte[] buffer1 = new byte[Convert.ToInt32(fs1.Length)];
byte[] buffer2 = new byte[Convert.ToInt32(fs2.Length)];
int i = 0;
// Read PDF file contents into byte arrays
i = fs1.Read(buffer1, 0, Convert.ToInt32(fs1.Length));
i = fs2.Read(buffer2, 0, Convert.ToInt32(fs2.Length));
// Now, first convert byte arrays into MemoryStreams and then concatenate those streams
using (MemoryStream pdfStream = new MemoryStream())
{
using (MemoryStream fileStream1 = new MemoryStream(buffer1))
{
using (MemoryStream fileStream2 = new MemoryStream(buffer2))
{
// Create instance of PdfFileEditor class to concatenate streams
PdfFileEditor pdfEditor = new PdfFileEditor();
// Concatenate both input MemoryStreams and save to putput MemoryStream
pdfEditor.Concatenate(fileStream1, fileStream2, pdfStream);
// Convert MemoryStream back to byte array
byte[] data = pdfStream.ToArray();
// Create a FileStream to save the output PDF file
FileStream output = new FileStream(dataDir + "merged_out.pdf", FileMode.Create,
FileAccess.Write);
// Write byte array contents in the output file stream
output.Write(data, 0, data.Length);
// Close output file
output.Close();
}
}
}
// Close input files
fs1.Close();
fs2.Close();

Concatenar Array de Archivos PDF Usando Rutas de Archivos

Si deseas concatenar múltiples archivos PDF, puedes usar la sobrecarga del método Concatenate, que te permite pasar un array de archivos PDF. El resultado final se guarda como un archivo combinado creado a partir de todos los archivos en el array. El siguiente fragmento de código C# te muestra cómo concatenar un array de archivos PDF usando rutas de archivos.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Array of files
string[] filesArray = new string[2];
filesArray[0] = dataDir + "input.pdf";
filesArray[1] = dataDir + "input2.pdf";
// Concatenate files
pdfEditor.Concatenate(filesArray, dataDir + "ConcatenateArrayOfFilesWithPath_out.pdf");

Concatenar Array de Archivos PDF Usando Streams

Concatenar un array de archivos PDF no se limita solo a archivos que residen en el disco. También puede concatenar un array de archivos PDF desde flujos. Si desea concatenar múltiples archivos PDF, puede usar la sobrecarga apropiada del método Concatenate. Primero, necesita crear un array de flujos de entrada y un flujo para el PDF de salida y luego llamar al método Concatenate. La salida se guardará en el flujo de salida. El siguiente fragmento de código C# le muestra cómo concatenar un array de archivos PDF usando flujos.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Output stream
FileStream outputStream = new FileStream(dataDir + "ConcatenateArrayOfPdfUsingStreams_out.pdf", FileMode.Create);
// Array of streams
FileStream[] inputStreams = new FileStream[2];
inputStreams[0] = new FileStream(dataDir + "input.pdf", FileMode.Open);
inputStreams[1] = new FileStream(dataDir + "input2.pdf", FileMode.Open);
// Concatenate file
pdfEditor.Concatenate(inputStreams, outputStream);

Concatenar todos los archivos Pdf en una carpeta específica

Incluso puede leer todos los archivos Pdf en una carpeta específica en tiempo de ejecución y concatenarlos, sin siquiera conocer los nombres de los archivos. Proporcione simplemente la ruta del directorio, que contiene los documentos PDF, que le gustaría concatenar.

Por favor intente usar el siguiente fragmento de código C# para lograr esta funcionalidad.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Retrieve names of all the Pdf files in a particular Directory
string[] fileEntries = Directory.GetFiles(dataDir, "*.pdf");
// Get the current System date and set its format
string date = DateTime.Now.ToString("MM-dd-yyyy");
// Get the current System time and set its format
string hoursSeconds = DateTime.Now.ToString("hh-mm");
// Set the value for the final Resultant Pdf document
string masterFileName = date + "_" + hoursSeconds + "_out.pdf";
// Instantiate PdfFileEditor object
Aspose.Pdf.Facades.PdfFileEditor pdfEditor = new PdfFileEditor();
// Call Concatenate method of PdfFileEditor object to concatenate all input files
// Into a single output file
pdfEditor.Concatenate(fileEntries, dataDir + masterFileName);

Concatenar formularios PDF y mantener los nombres de los campos únicos

La clase PdfFileEditor en el espacio de nombres Aspose.Pdf.Facades ofrece la capacidad de concatenar los archivos PDF. Ahora, si los archivos Pdf que se van a concatenar tienen campos de formulario con nombres de campo similares, Aspose.PDF proporciona la característica para mantener los campos en el archivo Pdf resultante como únicos y también puede especificar el sufijo para hacer que los nombres de los campos sean únicos. La propiedad KeepFieldsUnique de PdfFileEditor como verdadera hará que los nombres de los campos sean únicos cuando los formularios Pdf se concatenen. Además, la propiedad UniqueSuffix de PdfFileEditor se puede usar para especificar el formato definido por el usuario del sufijo que se agrega al nombre del campo para hacerlo único cuando los formularios se concatenan. Esta cadena debe contener la subcadena %NUM% que será reemplazada con números en el archivo resultante.

Por favor, vea el siguiente fragmento de código simple para lograr esta funcionalidad.

Concatenar archivos PDF y crear Tabla de Contenidos

Concatenar archivos PDF

Por favor, eche un vistazo al siguiente fragmento de código para obtener información sobre cómo fusionar los archivos PDF.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Save concatenated output file
pdfEditor.Concatenate(new FileStream(dataDir + "input1.pdf", FileMode.Open), new FileStream(dataDir + "input2.pdf", FileMode.Open), new FileStream(dataDir + "ConcatenatePdfFilesAndCreateTOC_out.pdf", FileMode.Create));

Insertar página en blanco

Una vez que los archivos PDF han sido fusionados, podemos insertar una página en blanco al principio del documento en la cual se puede crear la Tabla de Contenidos. Para cumplir con este requisito, podemos cargar el archivo fusionado en el objeto Document y necesitamos llamar al método Page.Insert(…) para insertar una página en blanco.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Insert a blank page at the begining of concatenated file to display Table of Contents
Aspose.Pdf.Document concatenated_pdfDocument = new Aspose.Pdf.Document(new FileStream(dataDir + "Concatenated_Table_Of_Contents.pdf", FileMode.Open));
// Insert a empty page in a PDF
concatenated_pdfDocument.Pages.Insert(1);

Añadir Sellos de Texto

Para crear una Tabla de Contenidos, necesitamos añadir sellos de texto en la primera página usando los objetos PdfFileStamp y Stamp. Stamp class proporciona el método BindLogo(...) para agregar FormattedText y también podemos especificar la ubicación para agregar estos sellos de texto usando el método SetOrigin(..). En este artículo, estamos concatenando dos archivos PDF, por lo que necesitamos crear dos objetos de sello de texto que apunten a estos documentos individuales.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Set Text Stamp to display string Table Of Contents
Aspose.Pdf.Facades.Stamp stamp = new Aspose.Pdf.Facades.Stamp();
stamp.BindLogo(new FormattedText("Table Of Contents", System.Drawing.Color.Maroon, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 18));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
stamp.SetOrigin((new PdfFileInfo(new FileStream(dataDir + "input1.pdf", FileMode.Open)).GetPageWidth(1) / 3), 700);
// Set particular pages
stamp.Pages = new int[] { 1 };

Crear enlaces locales

Ahora necesitamos agregar enlaces hacia las páginas dentro del archivo concatenado. Para cumplir con este requisito, podemos usar el método CreateLocalLink(..) de la clase PdfContentEditor. En el siguiente fragmento de código, hemos pasado Transparent como cuarto argumento para que el rectángulo alrededor del enlace no sea visible.

Complete code

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Create a MemoryStream object to hold the resultant PDf file
using (MemoryStream Concatenated_Stream = new MemoryStream())
{
// Save concatenated output file
pdfEditor.Concatenate(new FileStream(dataDir + "input1.pdf", FileMode.Open), new FileStream(dataDir + "input2.pdf", FileMode.Open), Concatenated_Stream);
// Insert a blank page at the begining of concatenated file to display Table of Contents
Aspose.Pdf.Document concatenated_pdfDocument = new Aspose.Pdf.Document(Concatenated_Stream);
// Insert a empty page in a PDF
concatenated_pdfDocument.Pages.Insert(1);
// Hold the resultnat file with empty page added
using (MemoryStream Document_With_BlankPage = new MemoryStream())
{
// Save output file
concatenated_pdfDocument.Save(Document_With_BlankPage);
using (var Document_with_TOC_Heading = new MemoryStream())
{
// Add Table Of Contents logo as stamp to PDF file
PdfFileStamp fileStamp = new PdfFileStamp();
// Find the input file
fileStamp.BindPdf(Document_With_BlankPage);
// Set Text Stamp to display string Table Of Contents
Aspose.Pdf.Facades.Stamp stamp = new Aspose.Pdf.Facades.Stamp();
stamp.BindLogo(new FormattedText("Table Of Contents", System.Drawing.Color.Maroon, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 18));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
stamp.SetOrigin((new PdfFileInfo(Document_With_BlankPage).GetPageWidth(1) / 3), 700);
// Set particular pages
stamp.Pages = new int[] { 1 };
// Add stamp to PDF file
fileStamp.AddStamp(stamp);
// Create stamp text for first item in Table Of Contents
var Document1_Link = new Aspose.Pdf.Facades.Stamp();
Document1_Link.BindLogo(new FormattedText("1 - Link to Document 1", System.Drawing.Color.Black, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 12));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
Document1_Link.SetOrigin(150, 650);
// Set particular pages on which stamp should be displayed
Document1_Link.Pages = new int[] { 1 };
// Add stamp to PDF file
fileStamp.AddStamp(Document1_Link);
// Create stamp text for second item in Table Of Contents
var Document2_Link = new Aspose.Pdf.Facades.Stamp();
Document2_Link.BindLogo(new FormattedText("2 - Link to Document 2", System.Drawing.Color.Black, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 12));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
Document2_Link.SetOrigin(150, 620);
// Set particular pages on which stamp should be displayed
Document2_Link.Pages = new int[] { 1 };
// Add stamp to PDF file
fileStamp.AddStamp(Document2_Link);
// Save updated PDF file
fileStamp.Save(Document_with_TOC_Heading);
fileStamp.Close();
// Now we need to add Heading for Table Of Contents and links for documents
PdfContentEditor contentEditor = new PdfContentEditor();
// Bind the PDF file in which we added the blank page
contentEditor.BindPdf(Document_with_TOC_Heading);
// Create link for first document
contentEditor.CreateLocalLink(new System.Drawing.Rectangle(150, 650, 100, 20), 2, 1, System.Drawing.Color.Transparent);
// Create link for Second document
// We have used new PdfFileInfo("d:/pdftest/Input1.pdf").NumberOfPages + 2 as PdfFileInfo.NumberOfPages(..) returns the page count for first document
// And 2 is because, second document will start at Input1+1 and 1 for the page containing Table Of Contents.
contentEditor.CreateLocalLink(new System.Drawing.Rectangle(150, 620, 100, 20), new PdfFileInfo(dataDir + "Input1.pdf").NumberOfPages + 2, 1, System.Drawing.Color.Transparent);
// Save updated PDF
contentEditor.Save( dataDir + "Concatenated_Table_Of_Contents.pdf");
}
}
}

Concatenar archivos PDF en una carpeta

La clase PdfFileEditor en el espacio de nombres Aspose.Pdf.Facades le ofrece la capacidad de concatenar el archivo PDF. Incluso puede leer todos los archivos Pdf en una carpeta en particular en tiempo de ejecución y concatenarlos, sin siquiera conocer los nombres de los archivos. Simplemente proporcione la ruta del directorio, que contiene los documentos PDF que le gustaría concatenar.

Intente usar el siguiente fragmento de código C# para lograr esta funcionalidad de Aspose.PDF:

// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();

// Recuperar nombres de todos los archivos Pdf en un directorio particular
string[] fileEntries = Directory.GetFiles(dataDir, "*.pdf");

// Obtener la fecha del sistema actual y establecer su formato
string date = DateTime.Now.ToString("MM-dd-yyyy");
// Obtener la hora del sistema actual y establecer su formato
string hoursSeconds = DateTime.Now.ToString("hh-mm");
// Establecer el valor para el documento Pdf resultante final
string masterFileName = date + "_" + hoursSeconds + "_out.pdf";

// Instanciar objeto PdfFileEditor
Aspose.Pdf.Facades.PdfFileEditor pdfEditor = new PdfFileEditor();

// Llamar al método Concatenate del objeto PdfFileEditor para concatenar todos los archivos de entrada
// En un solo archivo de salida
pdfEditor.Concatenate(fileEntries, dataDir + masterFileName);