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

Comprimir documentos PDF en C# y VB.NET

En muchos casos, es habitual querer comprimir y optimizar documentos PDF. Los documentos PDF más pequeños son más fáciles de transferir por red y más baratos de almacenar. Reducir el tamaño de los archivos PDF es especialmente importante con fines de archivo.

Optimizar documentos PDF en C# y VB.NET

Biblioteca .NET para optimizar documentos PDF

Use Docotic.Pdf library para comprimir documentos PDF en aplicaciones .NET Framework y .NET Core. La biblioteca está disponible en NuGet y en nuestro sitio. Obtenga la biblioteca y una clave de licencia gratuita por tiempo limitado en la página Descargar biblioteca PDF para C# .NET.

Docotic.Pdf proporciona distintos medios de optimización:

  • optimizar objetos PDF
  • eliminar objetos PDF duplicados (fuentes, imágenes, etc.)
  • comprimir imágenes
  • generar subconjuntos de fuentes
  • eliminar metadatos
  • eliminar información de estructura
  • eliminar recursos no utilizados
  • eliminar datos privados de la aplicación
  • aplanar campos de formulario y anotaciones
  • desincrustar fuentes

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

Revisemos 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, flujos, matrices y otros. Al guardar un archivo PDF, Docotic.Pdf aplica de forma predeterminada las siguientes optimizaciones sin pérdida:

  • comprime flujos PDF con codificación Flate
  • elimina objetos PDF no utilizados
  • convierte en línea objetos PDF indirectos
  • escribe objetos PDF sin formato
  • 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 al contenido visible (texto, imágenes, marcadores ni nada más) del documento PDF. Solo afectan a cómo se escriben y comprimen los objetos PDF en el archivo PDF de salida.

Eliminar objetos PDF no utilizados es importante para otras técnicas comentadas a continuación. No establezca la propiedad PdfSaveOptions.RemoveUnusedObjects en false a menos que tenga motivos sólidos para conservar los objetos no utilizados.

Eliminar objetos duplicados en documentos PDF

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

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

pdf.Save("compressed.pdf");

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

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

Comprimir imágenes en PDF

Optimizar 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 volver a comprimir imágenes PDF usando algoritmos de compresión JPEG, CCITT Group 3 y 4 (fax), JPEG 2000 y zip/deflate. También puede cambiar el tamaño o reducir la escala de las imágenes para disminuir aún más el tamaño del archivo PDF. O puede optimizar las imágenes usted mismo usando una herramienta de terceros y luego reemplazar imágenes.

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

Generar subconjuntos de fuentes

Los documentos PDF suelen incrustar las fuentes usadas para dibujar texto. Las fuentes incrustadas a menudo incluyen información sobre todos los glifos compatibles. Eliminar 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");

La generación de subconjuntos no afecta a las fuentes usadas en controles de texto variable, como cuadros de texto o cuadros combinados.

Eliminar metadatos

Los documentos PDF pueden contener metadatos XMP no comprimidos con información sobre el autor, las palabras clave, la hora de creación, etc. Los metadatos no afectan al 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 estructura

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

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

Eliminar esa información ayuda a reducir el tamaño del archivo PDF. Pero el PDF ya no tendrá etiquetas ni será accesible para dispositivos de asistencia. Este ejemplo muestra cómo eliminar la 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 los XObject pueden hacer referencia a más fuentes, imágenes o patrones de los que usan. Puede usar el método PdfDocument.RemoveUnusedResources para eliminar recursos no utilizados de PDF. Aquí está el ejemplo en C#:

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

pdf.Save("compressed.pdf");

Eliminar datos privados de aplicación de PDF

Los documentos PDF, producidos por software de Adobe, pueden incluir datos privados de la aplicación. Estos datos de aplicación se almacenan en diccionarios page-piece.

Este ejemplo muestra cómo limpiar y comprimir PDF en C# eliminando diccionarios page-piece:

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

pdf.Save("compressed.pdf");

Aplanar campos de formulario y anotaciones de PDF

Puede reducir el tamaño de un documento PDF con un formulario completado aplanando los campos de formulario. El aplanado reemplazará los campos de formulario por su representación visual. Se conservarán los valores introducidos. Este ejemplo en C# muestra cómo aplanar todos los campos de formulario PDF:

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

pdf.Save("compressed.pdf");

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

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

Desincrustar fuentes

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

using var pdf = new PdfDocument("input.pdf");
UnembedFonts(pdf);
pdf.Save("compressed.pdf");

/// <summary>
/// Este método desincrusta cualquier fuente que:
/// * esté instalada en el SO
/// * o tenga su nombre incluido en la lista "always unembed"
/// * y cuyo nombre no esté incluido en la lista "always keep".
/// </summary>
private static void UnembedFonts(PdfDocument pdf)
{
    string[] alwaysUnembedList = ["MyriadPro-Regular"];
    string[] alwaysKeepList = ["ImportantFontName", "AnotherImportantFontName"];

    using var ms = new MemoryStream();

    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;

            ms.Position = 0;
            if (loader.TryLoad(font.Name, font.Bold, font.Italic, ms))
            {
                font.Unembed();
                continue;
            }
        }

        if (Array.Exists(alwaysUnembedList, name => font.Name == name))
            font.Unembed();
    }
}

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

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

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

Hay muchos métodos de optimización mencionados arriba. Sin embargo, puede comprimir documentos PDF aún más eliminando contenido poco importante. Docotic.Pdf permite eliminar estos objetos de documentos PDF:

  • anotaciones
  • archivos adjuntos
  • marcadores
  • campos de formulario
  • páginas
  • scripts
  • transparencia

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

Conclusión

Puede usar Docotic.Pdf library 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 desde GitHub.

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