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

Comprimir documentos PDF en C# y VB.NET

En muchos casos, es un deseo común comprimir y optimizar documentos PDF. Los documentos PDF más pequeños son más fáciles de transferir a través de la red y más baratos de almacenar. Reducir el tamaño del archivo PDF es especialmente importante para fines de archivado.

Optimice documentos PDF en C# y VB.NET

Biblioteca .NET para optimizar documentos PDF

Utilice la biblioteca Docotic.Pdf para comprimir documentos PDF en aplicaciones .NET Framework y .NET Core. Puede descargar los binarios de la biblioteca o utilizar su paquete NuGet. Para probar la biblioteca sin restricciones del modo de evaluación, puede obtener la clave de licencia gratuita por tiempo limitado utilizando el formulario aquí.

Biblioteca Docotic.Pdf 9.3.17036-dev Pruebas de regresión 14,665 pasaron Descargas totales de NuGet 4,191,515

Docotic.Pdf proporciona diferentes medios de optimización:

  • optimizar objetos PDF
  • eliminar objetos PDF duplicados (fuentes, imágenes, etc.)
  • comprimir imágenes
  • fuentes de subconjunto
  • eliminar metadatos
  • eliminar información de la estructura
  • eliminar recursos no utilizados
  • eliminar datos de aplicaciones privadas
  • aplanar campos de formulario y anotaciones
  • fuentes no incrustadas

Puede utilizar todo lo anterior para obtener la mejor relación de compresión para sus documentos PDF. Mire el ejemplo Comprimir documento PDF en .NET para ver todas estas técnicas en acción.

Repasemos estos métodos de compresión con más detalle.

Optimizar objetos PDF

Internamente, un archivo PDF es una colección de objetos PDF de bajo nivel: diccionarios, secuencias, matrices y otros. Al guardar un archivo PDF, Docotic.Pdf aplica las siguientes optimizaciones sin pérdidas de forma predeterminada:

  • comprime secuencias de PDF con codificación Flate
  • elimina objetos PDF no utilizados
  • objetos PDF indirectos en línea
  • escribe objetos PDF sin formatear
  • empaqueta objetos PDF en flujos de objetos comprimidos

Este ejemplo muestra cómo optimizar objetos PDF en C#:

using BitMiracle.Docotic.Pdf;

using (var pdf = new PdfDocument("input.pdf"))
{
    var saveOptions = new PdfSaveOptions();

    // Estas opciones están habilitadas de forma predeterminada y se aplican implícitamente:
    //saveOptions.Compression = PdfCompression.Flate;
    //saveOptions.RemoveUnusedObjects = true;
    //saveOptions.OptimizeIndirectObjects = true;
    //saveOptions.UseObjectStreams = true;
    //saveOptions.WriteWithoutFormatting = true;

    pdf.Save("compressed.pdf", saveOptions);
}

Todas estas optimizaciones no afectan los contenidos visibles (texto, imágenes, marcadores y cualquier otra cosa) del documento PDF. Solo afectan la forma en que se escriben y comprimen los objetos PDF en el archivo PDF de salida.

Eliminar objetos PDF no utilizados es importante para otras técnicas que se analizan a continuación. No establezca la propiedad PdfSaveOptions.RemoveUnusedObjects en false a menos que tenga razones de peso para conservar los objetos no utilizados.

Eliminar objetos duplicados en documentos PDF

Cuando combina documentos PDF, el PDF generado a menudo contiene fuentes e imágenes duplicadas. Reemplazar objetos duplicados ayuda a reducir el tamaño del archivo PDF producido. Aquí está el ejemplo de C# para esta operación:

using (var pdf = new PdfDocument("merged.pdf"))
{
    pdf.ReplaceDuplicateObjects();

    pdf.Save("compressed.pdf");
}

Se recomienda eliminar objetos duplicados antes de comprimir imágenes o eliminar fuentes. De lo contrario, se realizará mucho trabajo adicional para optimizar copias de las mismas imágenes o fuentes.

El método PdfDocument.ReplaceDuplicateObjects no reemplaza las imágenes en línea. Si su documento contiene imágenes en línea, utilice primero el método PdfCanvas.MoveInlineImagesToResources. El método convertirá las imágenes en línea en imágenes normales y luego el método ReplaceDuplicateObjects también podrá deduplicar las imágenes convertidas.

Comprimir imágenes en PDF

La optimización de imágenes PDF suele ser el método de compresión más eficaz para documentos con imágenes rasterizadas.

La biblioteca Docotic.Pdf proporciona métodos integrados para recomprimir imágenes PDF utilizando JPEG, CCITT Grupo 3 y 4 (fax), JPEG 2000 y algoritmos de compresión zip/deflate. También puede cambiar el tamaño o reducir la escala de las imágenes para reducir aún más el tamaño del archivo PDF. O puede optimizar las imágenes usted mismo utilizando una herramienta de terceros y luego reemplazar imágenes.

Mire el ejemplo Optimizar imágenes en documentos PDF en C# y VB.NET en GitHub para ver un ejemplo.

Fuentes de subconjunto

Los documentos PDF suelen incorporar fuentes utilizadas para dibujar texto. Las fuentes incrustadas suelen incluir información sobre todos los glifos admitidos. Eliminar los glifos no utilizados en un documento PDF puede reducir significativamente el tamaño del archivo de salida.

Este ejemplo muestra cómo optimizar fuentes PDF en C#:

using (var pdf = new PdfDocument("text.pdf"))
{
    pdf.RemoveUnusedFontGlyphs();

    pdf.Save("compressed.pdf");
}

El subconjunto no afecta las fuentes utilizadas en controles de texto variables, como cuadros de texto o cuadros combinados.

Eliminar metadatos

Los documentos PDF pueden contener metadatos XMP sin comprimir con información sobre el autor, palabras clave, hora de creación, etc. Los metadatos no afectan el contenido visible del documento PDF.

Este ejemplo muestra cómo eliminar metadatos de un archivo PDF en C#:

using (var pdf = new PdfDocument("metadata.pdf"))
{
    XmpMetadata xmp = pdf.Metadata;
    xmp.Unembed();
    pdf.Info.Clear(false);

    pdf.Save("compressed.pdf");
}

Eliminar información de la estructura

Los documentos PDF pueden incluir información sobre su estructura lógica. La información se utiliza para:

  • producir documentos PDF etiquetados
  • hacer que el documento PDF sea accesible para dispositivos de asistencia

Eliminar dicha información ayuda a reducir el tamaño del archivo PDF. Pero el PDF ya no estará etiquetado ni será accesible para dispositivos de asistencia. Este ejemplo muestra cómo eliminar información de estructura de PDF en C#:

using (var pdf = new PdfDocument("tagged.pdf"))
{
    pdf.RemoveStructureInformation();

    pdf.Save("compressed.pdf");
}

Eliminar recursos no utilizados de PDF

Las páginas PDF y XObjects pueden hacer referencia a más fuentes, imágenes o patrones de los que utilizan. Puede utilizar el método PdfDocument.RemoveUnusedResources para eliminar recursos no utilizados de PDF. Aquí está el ejemplo de C#:

using (var pdf = new PdfDocument("input.pdf"))
{
    pdf.RemoveUnusedResources();

    pdf.Save("compressed.pdf");
}

Eliminar datos de aplicaciones privadas de PDF

Los documentos PDF, producidos por el software de Adobe, pueden incluir datos de aplicaciones privadas. Estos datos de aplicación se almacenan en diccionarios por páginas.

Este ejemplo muestra cómo limpiar y comprimir PDF en C# eliminando diccionarios de páginas:

using (var pdf = new PdfDocument("input.pdf"))
{
    pdf.RemovePieceInfo();

    pdf.Save("compressed.pdf");
}

Aplanar campos y anotaciones de formulario PDF

Puede reducir el tamaño de un documento PDF con un formulario completo aplanando los campos del formulario. El aplanamiento reemplazará los campos del formulario con su representación visual. Los valores completados se conservarán. Este ejemplo de C# muestra cómo aplanar todos los campos del formulario PDF:

using (var pdf = new PdfDocument("form.pdf"))
{
    pdf.FlattenControls();

    pdf.Save("compressed.pdf");
}

Alternativamente, puede aplanar todas las anotaciones y controles usando el método PdfDocument.FlattenWidgets.

Además, el método PdfWidget.Flatten le permite aplanar anotaciones o controles individuales.

Fuentes no incrustadas

La incrustación de fuentes PDF tiene mucho sentido para fuentes personalizadas o raras. Al mismo tiempo, las fuentes ampliamente disponibles como Arial o Verdana pueden aumentar el tamaño del archivo PDF sin una buena razón. Puede eliminar fuentes populares disponibles en sus plataformas de destino. Código C# de muestra:

using (var pdf = new PdfDocument("input.pdf"))
{
    unembedFonts(pdf);

    pdf.Save("compressed.pdf");
}

/// <summary>
/// Este método elimina cualquier fuente que sea:
/// * instalado en el sistema operativo
/// * o tiene su nombre incluido en la lista "siempre desintegrado"
/// * y su nombre no está incluido en la lista "conservar siempre".
/// </summary>
private static void unembedFonts(PdfDocument pdf)
{
    string[] alwaysUnembedList = new string[] { "MyriadPro-Regular" };
    string[] alwaysKeepList = new string[] { "ImportantFontName", "AnotherImportantFontName" };

    foreach (PdfFont font in pdf.GetFonts())
    {
        if (!font.Embedded ||
            font.EncodingName == "Built-In" ||
            Array.Exists(alwaysKeepList, name => font.Name == name))
        {
            continue;
        }

        if (font.Format == PdfFontFormat.TrueType || font.Format == PdfFontFormat.CidType2)
        {
            SystemFontLoader loader = SystemFontLoader.Instance;
            byte[] fontBytes = loader.Load(font.Name, font.Bold, font.Italic);
            if (fontBytes != null)
            {
                font.Unembed();
                continue;
            }
        }
        
        if (Array.Exists(alwaysUnembedList, name => font.Name == name))
            font.Unembed();
    }
}

No utilice esta técnica con documentos PDF/A. Un documento PDF/A debe incrustar todas las fuentes.

Pruebe siempre los documentos PDF con fuentes no incrustadas en sus sistemas operativos de destino (Windows, Linux, macOS, iOS, Android) y visores de PDF (Adobe, Foxit, etc.).

Otros métodos para reducir el tamaño del PDF

Hay muchos métodos de optimización mencionados anteriormente. Sin embargo, puedes comprimir aún más los documentos PDF eliminando el contenido sin importancia. Docotic.Pdf le permite eliminar estos objetos de documentos PDF:

  • anotaciones
  • archivos adjuntos
  • marcadores
  • campos de formulario
  • paginas
  • guiones
  • transparencia

También puede eliminar texto, imágenes y gráficos vectoriales de páginas PDF. También es posible aplanar el texto.

Conclusión

Puede utilizar la biblioteca Docotic.Pdf para comprimir PDF en C# y VB.NET. Docotic.Pdf proporciona muchos medios de optimización eficaces.

Descargue y pruebe el ejemplo completo Comprimir documento PDF en C# y VB.NET de GitHub.

Contáctenos y le aconsejaremos cómo lograr la mejor relación de compresión para sus documentos PDF.