Esta página puede contener texto traducido automáticamente.

Dividir documentos PDF en C# y VB.NET

Biblioteca Docotic.Pdf le permite dividir un documento PDF en un grupo 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.

Dividir documentos PDF

Docotic.Pdf viene con licencias pagas, pero también es gratuito en ciertos casos. Obtenga la biblioteca y una clave de licencia gratuita por tiempo limitado en la página Descargar la biblioteca PDF de C# .NET.

Biblioteca Docotic.Pdf 9.5.17615-dev Pruebas de regresión 14,813 pasaron Descargas totales de NuGet 4,924,084

Conceptos básicos de división de PDF

Los métodos PdfDocument.CopyPages le permiten copiar páginas de objetos PdfDocument. Esta es la API principal de Docotic.Pdf para dividir documentos PDF.

Dividir 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 la copia de 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(new int[] { 2, 0 });
copy.RemoveUnusedResources();
copy.Save("result.pdf");

El orden de los índices de páginas 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 PDF por condición

Puede dividir documentos según el contenido. Esto resulta ú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 existen los métodos PdfDocument.ExtractPages. Le permiten eliminar páginas extraídas del documento:

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 Extraer páginas correspondiente de GitHub.

Eliminar y reordenar páginas

Los métodos CopyPages y ExtractPages producen 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 puedes reordenar las páginas después de eliminarlas. Observa los ejemplos de código en estas secciones:

Optimizar archivos de salida

Anteriormente, utilicé el método RemoveUnusedResources para optimizar los archivos resultantes. Docotic.Pdf proporciona más opciones para la compresión de PDF. Por ejemplo, puede eliminar 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 puedes probar el ejemplo de código Comprimir documento PDF en .NET de GitHub.

La división de PDF se utiliza a veces para que los archivos de páginas sean más pequeños que un límite. En tales casos, puedes medir el tamaño resultante y comprimir el archivo si es necesario. Código de muestra:

using var pdf = new PdfDocument("source.pdf");

using PdfDocument copy = pdf.CopyPages(0, 1);
copy.RemoveUnusedResources();

using var ms = new MemoryStream();
copy.Save(ms);

byte limit = 1024 * 1024;
if (ms.Length > limit)
{
    compress(copy);
    copy.Save("result.pdf");
}

Tenga en cuenta que puede resultar imposible comprimir un archivo PDF por debajo de cierto límite. Los resultados dependen del contenido del archivo y del valor límite.

Extraer contenido de la página

También es posible cambiar el contenido de la página al dividirla. Por ejemplo, puede escalar las páginas extraídas antes de usarlas en una imposición de PDF. Pruebe el proyecto de muestra relacionado Crear XObject desde la página de GitHub.

O puede eliminar o reemplazar parte del contenido de las páginas extraídas. Mire el ejemplo de código Copiar texto, rutas e imágenes que muestra cómo copiar objetos de páginas PDF.

Dividir PDF en imágenes

Docotic.Pdf también le permite dividir documentos PDF en imágenes de páginas. Lea el artículo Convertir PDF a imagen en C# y VB.NET para obtener más detalles.

Dividido en hilos paralelos

Es posible que desee paralelizar la división de PDF para documentos grandes. La clase PdfDocument no es segura para subprocesos. Pero es posible utilizar 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 subproceso suele ser más rápido. La solución multiproceso implica una sobrecarga relacionada con el análisis de objetos "PdfDocument" adicionales. Utilice la versión de un solo subproceso a menos que las pruebas demuestren que un código paralelo es más rápido.