Esta página puede contener texto traducido automáticamente.
Combinar documentos PDF en C# y VB.NET
A menudo, las empresas combinan archivos PDF para el archivado de documentos. Aunque combinar PDF parece una tarea simple, aquí hay muchos problemas potenciales. Debe combinar correctamente los campos de formulario, los marcadores, las capas y otros objetos PDF. También debe evitar objetos duplicados para obtener un archivo de salida compacto.
La biblioteca Docotic.Pdf gestiona todas las particularidades de la combinación. Le permite combinar documentos PDF en solo unas pocas líneas de código C# o VB.NET.

Docotic.Pdf incluye licencias gratuitas y de pago. Obtenga la biblioteca y una clave de licencia gratuita por tiempo limitado en la página Descargar biblioteca PDF para C# .NET.
Conceptos básicos de combinación de PDF
Los métodos PdfDocument.Append permiten agregar documentos PDF desde archivos, flujos o matrices de bytes. También hay opciones para agregar archivos protegidos y para combinar campos de formulario.
Combinar dos archivos PDF
Este código de ejemplo muestra cómo combinar archivos PDF en C#:
using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.Save("merged.pdf");
Pruebe el ejemplo de código Fusionar dos documentos PDF de GitHub.
Combinar flujos PDF
Es fácil adaptar el ejemplo anterior para trabajar con flujos en lugar de rutas de archivo. Aquí está el método auxiliar para combinar flujos:
void Merge(Stream first, Stream second, Stream result)
{
using var pdf = new PdfDocument(first);
pdf.Append(second);
pdf.Save(result);
}
Combinar varios archivos PDF
Puede llamar repetidamente al método Append para agregar varios archivos PDF:
string[] filesToMerge = ..;
using var pdf = new PdfDocument();
foreach (string file in filesToMerge)
pdf.Append(file);
// Quite la página vacía agregada por la llamada a PdfDocument()
pdf.RemovePage(0);
pdf.Save(pathToFile);
Combinar archivos PDF cifrados
Hay sobrecargas de Append para combinar documentos cifrados:
using var pdf = new PdfDocument();
pdf.Append("encrypted.pdf", new PdfStandardDecryptionHandler("password"));
pdf.Save("merged.pdf");
Puede encontrar más información en el artículo Descifrar documentos PDF en C# y VB.NET.
Combinar formularios PDF
Cada campo de formulario en un documento PDF debe tener un nombre único. Eso puede causar un problema cuando los documentos que se van a combinar contienen campos con los mismos nombres. Docotic.Pdf ofrece las siguientes estrategias de combinación para controles de formulario en conflicto:
- Renombrar los controles agregados cuando entren en conflicto con controles existentes
- Combinar los controles agregados con controles existentes
- Aplanar los controles agregados
- No agregar ningún control
- Agregar los controles tal como están
De forma predeterminada, la biblioteca renombra los controles agregados cuando hay conflicto. Puede elegir una estrategia alternativa con la clase PdfMergingOptions:
using var pdf = new PdfDocument("form.pdf");
var decryptionHandler = new PdfStandardDecryptionHandler(string.Empty);
var mergingOptions = new PdfMergingOptions()
{
ControlMergingMode = PdfControlMergingMode.CopyAsKids
};
pdf.Append("form.pdf", decryptionHandler, mergingOptions);
pdf.Save("merged.pdf");
Con el modo CopyAsKids, la biblioteca combina y sincroniza los controles en conflicto. Es decir, cuando cambie un control, el segundo tendrá el mismo valor.
Reducir el archivo PDF combinado
Los documentos PDF pueden contener objetos idénticos, como fuentes o imágenes. Cuando combina esos documentos, el documento resultante contendrá copias de los mismos objetos. Use el método PdfDocument.ReplaceDuplicateObjects() para optimizar el resultado de la combinación:
using var pdf = new PdfDocument("2024-05-28.pdf");
pdf.Append("2024-05-29.pdf");
pdf.ReplaceDuplicateObjects();
pdf.Save("merged.pdf");
Puede reducir aún más el tamaño del archivo de salida. Por ejemplo, puede eliminar glifos de fuentes no utilizados o comprimir imágenes. Lea sobre las opciones de compresión compatibles en el artículo Comprimir documentos PDF en C# y VB.NET.
Personalizar la combinación de PDF
Docotic.Pdf proporciona métodos para extraer, reordenar o eliminar páginas PDF. Puede usarlos con el método Append para implementar tareas personalizadas de combinación de PDF.
Agregar páginas PDF específicas
Docotic.Pdf también permite combinar una parte de un documento PDF. Hay diferentes formas de hacerlo. Por ejemplo, puede dividir un documento PDF agregado y anexar las páginas extraídas. El siguiente auxiliar de C# agrega las páginas seleccionadas al PdfDocument:
private static void AppendPart(PdfDocument pdf, string filePath, params int[] pagesToAppend)
{
using var streamToAppend = new MemoryStream();
using var other = new PdfDocument(filePath);
using var extracted = other.CopyPages(pagesToAppend);
var options = new PdfSaveOptions
{
UseObjectStreams = false
};
extracted.Save(streamToAppend, options);
pdf.Append(streamToAppend);
}
O puede agregar un documento PDF completo y eliminar las páginas innecesarias. El siguiente ejemplo de código agrega las dos primeras páginas de second.pdf:
using var pdf = new PdfDocument(@"first.pdf");
int pageCountBefore = pdf.PageCount;
pdf.Append(@"second.pdf");
pdf.RemovePages(pageCountBefore + 2);
pdf.Save(pathToFile);
Otra solución se relaciona con la imposición de PDF. Puede leer sobre eso en la sección correspondiente.
Anteponer PDF
Los métodos Append siempre agregan páginas al final del documento actual. ¿Cómo combinar archivos PDF en un orden diferente? A veces puede cambiar el orden de las llamadas a Append. Es decir, use
pdf.Append("first.pdf");
pdf.Append("second.pdf");
en lugar de
pdf.Append("second.pdf");
pdf.Append("first.pdf");
O puede reordenar las páginas después de combinar. Este código C# mueve el documento PDF agregado al principio:
using var pdf = new PdfDocument(@"second.pdf");
int pageCountBefore = pdf.PageCount;
pdf.Append(@"first.pdf");
pdf.MovePages(pageCountBefore, pdf.PageCount - pageCountBefore, 0);
pdf.Save(pathToFile);
Para obtener más información sobre cómo reordenar páginas PDF, lea:
Imponer PDF
Docotic.Pdf permite combinar varias páginas PDF en una sola página. Use el método PdfDocument.CreateXObject(PdfPage) para crear un objeto PdfXObject basado en una página existente. Luego, dibuje este objeto con la escala deseada. Código de ejemplo:
using var src = new PdfDocument(@"src.pdf");
using var dest = new PdfDocument();
PdfXObject firstXObject = dest.CreateXObject(src.Pages[0]);
PdfXObject secondXObject = dest.CreateXObject(src.Pages[1]);
PdfPage page = dest.Pages[0];
page.Orientation = PdfPaperOrientation.Landscape;
double halfOfPage = page.Width / 2;
page.Canvas.DrawXObject(firstXObject, 0, 0, halfOfPage, page.Height, 0);
page.Canvas.DrawXObject(secondXObject, halfOfPage, 0, halfOfPage, page.Height, 0);
dest.Save("result.pdf");
Pruebe el proyecto de ejemplo relacionado Crear XObject desde la página de GitHub.
Combinar como adjunto
A veces puede necesitar incrustar un archivo PDF en otro como adjunto. Eso también es posible. También puede agregar enlaces al archivo incrustado en páginas PDF:
using var pdf = new PdfDocument();
PdfFileSpecification first = pdf.CreateFileAttachment("first.pdf");
pdf.SharedAttachments.Add(first);
var bounds = new PdfRectangle(20, 70, 100, 100);
PdfFileSpecification fs = pdf.CreateFileAttachment("second.pdf");
pdf.Pages[0].AddFileAnnotation(bounds, fs);
pdf.Save("attachments.pdf");
Puede encontrar ejemplos de código relacionados en el grupo PDF attachments en GitHub.
Combinar en subprocesos paralelos
Al combinar muchos archivos PDF, es posible paralelizar el código. La clase PdfDocument no es segura para subprocesos. Por eso, necesitamos usar objetos PdfDocument separados en diferentes subprocesos. Consulte el ejemplo de código Fusionar documentos PDF en hilos paralelos para más detalles.
Este código muestra cómo puede combinar flujos PDF en paralelo:
Stream[] documentsToMerge = ..;
int rangeSize = 50;
while (documentsToMerge.Length > rangeSize)
{
int partitionCount = (int)Math.Ceiling(documentsToMerge.Length / (double)rangeSize);
var result = new Stream[partitionCount];
var partitioner = Partitioner.Create(0, documentsToMerge.Length, rangeSize);
Parallel.ForEach(partitioner, range =>
{
int startIndex = range.Item1;
int count = range.Item2 - range.Item1;
result[startIndex / rangeSize] = MergeToStream(documentsToMerge, startIndex, count);
});
documentsToMerge = result;
}
using PdfDocument final = GetMergedDocument(documentsToMerge, 0, documentsToMerge.Length);
final.Save("merged.pdf");
private static Stream MergeToStream(Stream[] streams, int startIndex, int count)
{
using PdfDocument pdf = GetMergedDocument(streams, startIndex, count);
var result = new MemoryStream();
var options = new PdfSaveOptions
{
UseObjectStreams = false // acelera la escritura de documentos intermedios
};
pdf.Save(result, options);
return result;
}
private static PdfDocument GetMergedDocument(Stream[] streams, int startIndex, int count)
{
var pdf = new PdfDocument();
try
{
for (int i = 0; i < count; ++i)
{
var s = streams[startIndex + i];
pdf.Append(s);
s.Dispose();
}
pdf.RemovePage(0);
pdf.ReplaceDuplicateObjects();
return pdf;
}
catch
{
pdf.Dispose();
throw;
}
}
El código anterior divide los documentos de entrada en grupos del tamaño de rangeSize. Luego, el código combina cada grupo en documentos intermedios en paralelo. El proceso continúa hasta que el número de documentos de entrada es lo suficientemente pequeño para la combinación simple.
La solución en paralelo no es necesariamente más rápida que la versión de un solo subproceso. Los resultados pueden variar según el número de documentos de entrada y sus tamaños. En el código de ejemplo, el valor óptimo del parámetro rangeSize puede ser mayor o menor. Debe hacer pruebas de rendimiento en su aplicación para encontrar la implementación más eficaz.
Conclusión
Puede usar Docotic.Pdf library para combinar documentos PDF en C# y VB.NET. Permite combinar archivos, flujos o matrices de bytes. Puede combinar archivos cifrados, formularios PDF y páginas PDF específicas. Docotic.Pdf también ayuda a comprimir los archivos resultantes y ahorrar espacio en disco.
Pruebe los ejemplos de código del repositorio de ejemplos de Docotic.Pdf en GitHub. Puede obtener una clave de licencia de evaluación y descargar la biblioteca en la página de descarga de Docotic.Pdf.