Esta página puede contener texto traducido automáticamente.
Dividir documentos PDF en C# y VB.NET
biblioteca Docotic.Pdf permite dividir un documento PDF en un conjunto de archivos más pequeños. Puede extraer páginas individuales o rangos de páginas. También puede dividir documentos PDF según ciertos criterios.

Docotic.Pdf viene con licencias de pago, pero también es gratuito en ciertos casos. Obtenga la biblioteca y una clave de licencia gratuita con tiempo limitado en la página Descargar biblioteca PDF para C# .NET.
Conceptos básicos de división de PDF
Los métodos PdfDocument.CopyPages permiten copiar páginas de objetos PdfDocument. Esta es la API principal de Docotic.Pdf para dividir documentos PDF.
Dividir un PDF en páginas individuales
El siguiente código C# guarda cada página PDF en un archivo independiente:
using var pdf = new PdfDocument("source.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
using PdfDocument copy = pdf.CopyPages(i, 1);
copy.RemoveUnusedResources();
copy.Save(i + ".pdf");
}
El método PdfDocument.RemoveUnusedResources ayuda a reducir los archivos de salida. Es útil cuando las páginas copiadas hacen referencia a fuentes, imágenes o patrones no utilizados. Lea más sobre la compresión de PDF en la sección Optimizar archivos de salida.
Dividir en grupos de páginas
El método CopyPages admite copiar cualquier rango de páginas. Este fragmento de código muestra cómo extraer la tercera y la primera página:
using var pdf = new PdfDocument(@"source.pdf");
using PdfDocument copy = pdf.CopyPages([2, 0]);
copy.RemoveUnusedResources();
copy.Save("result.pdf");
El orden de los índices de página es importante. Define el orden de las páginas en el documento resultante.
Pruebe el ejemplo de código Copiar páginas de GitHub.
Dividir un PDF por condición
Puede dividir documentos según el contenido. Esto es útil si no sabe de antemano qué páginas extraer. Por ejemplo, extraiga páginas que contengan texto específico:
string textToFind = ".NET Standard";
using var pdf = new PdfDocument("C# in depth.pdf");
var pageIndexes = new List<int>();
for (int i = 0; i < pdf.Pages.Count; i++)
{
string pageText = pdf.Pages[i].GetText();
if (pageText.Contains(textToFind, StringComparison.CurrentCultureIgnoreCase))
pageIndexes.Add(i);
}
if (pageIndexes.Count > 0)
{
using var copy = pdf.CopyPages(pageIndexes.ToArray());
copy.RemoveUnusedResources();
copy.Save(textToFind + ".pdf");
}
Puede leer más sobre la extracción de texto en el artículo Extraer texto de PDF en C# y VB.NET.
División avanzada de PDF
Extraer páginas
Los métodos CopyPages no cambian el objeto PdfDocument asociado. También están los métodos PdfDocument.ExtractPages. Permiten eliminar del documento las páginas extraídas:
using var pdf = new PdfDocument(@"source.pdf");
using PdfDocument copy = pdf.ExtractPages(0, 3);
copy.Save("extracted.pdf");
pdf.Save("original.pdf");
Puede probar el ejemplo de código correspondiente Extraer páginas de GitHub.
Eliminar y reordenar páginas
Los métodos CopyPages y ExtractPages generan un nuevo documento con las páginas seleccionadas. Una alternativa es eliminar páginas de un documento actual:
using var pdf = new PdfDocument(@"source.pdf");
pdf.RemovePages(0, 3);
pdf.Save("remaining.pdf");
También puede reordenar las páginas después de la eliminación. Consulte los ejemplos de código en estas secciones:
Optimizar archivos de salida
Antes, usé el método RemoveUnusedResources para optimizar los archivos resultantes. Docotic.Pdf ofrece más opciones para la compresión de PDF. Por ejemplo, puede quitar información de estructura o comprimir imágenes. Lea el artículo Comprimir documentos PDF en C# y VB.NET para obtener más información. También puede probar el ejemplo de código Comprimir documento PDF en .NET de GitHub.
La división de PDF a veces se usa para obtener archivos de página más pequeños que cierto límite. En esos casos, puede medir el tamaño resultante y comprimir el archivo si es necesario. Código de ejemplo:
using var pdf = new PdfDocument("source.pdf");
using PdfDocument copy = pdf.CopyPages(0, 1);
copy.RemoveUnusedResources();
using var ms = new MemoryStream();
copy.Save(ms);
var limit = 1024 * 1024;
if (ms.Length > limit)
{
compress(copy);
copy.Save("result.pdf");
}
Tenga en cuenta que puede ser imposible comprimir un archivo PDF por debajo de cierto límite. Los resultados dependen del contenido del archivo y del valor del límite.
Extraer contenido de página
También es posible cambiar el contenido de la página al dividir. Por ejemplo, puede escalar las páginas extraídas antes de usarlas en una imposición PDF. Pruebe el proyecto de ejemplo relacionado Crear XObject desde la página de GitHub.
O puede eliminar o reemplazar parte del contenido en las páginas extraídas. Consulte el ejemplo de código Copiar texto, rutas e imágenes que muestra cómo copiar objetos de página PDF.
Dividir PDF en imágenes
Docotic.Pdf también permite dividir un documento PDF en imágenes de página. Lea el artículo Convertir PDF a imagen en C# y VB.NET para más detalles.
Dividir en hilos paralelos
Puede que desee paralelizar la división de PDF para documentos grandes. La clase PdfDocument no es segura para subprocesos. Pero es posible usar objetos PdfDocument separados en cada hilo:
string fileName = "source.pdf";
using var temp = new PdfDocument(fileName);
int pageCount = temp.PageCount;
Parallel.For(0, pageCount, i =>
{
using var pdf = new PdfDocument(fileName);
using var copy = pdf.CopyPages(i, 1);
copy.RemoveUnusedResources();
copy.Save($"split_{i}.pdf");
});
Tenga en cuenta que el código de un solo hilo suele ser más rápido. La solución multihilo implica una sobrecarga relacionada con el análisis de objetos PdfDocument adicionales. Use la versión de un solo hilo a menos que las pruebas demuestren que el código paralelo es más rápido.