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.
// 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(); | |
// 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(new FileStream(dataDir + "Concatenated_Table_Of_Contents.pdf", FileMode.Open)); | |
// Create link for first document | |
contentEditor.CreateLocalLink(new System.Drawing.Rectangle(150, 650, 100, 20), 2, 1, System.Drawing.Color.Transparent); |
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);