Cette page peut contenir du texte traduit automatiquement.

Compresser des documents PDF en C# et VB.NET

Dans de nombreux cas, il s’agit d’un désir commun de compresser et d’optimiser des documents PDF. Les documents PDF plus petits sont plus faciles à transférer via le réseau et moins chers à stocker. La réduction de la taille du fichier PDF est particulièrement importante à des fins d’archivage.

Optimiser les documents PDF en C# et VB.NET

Bibliothèque .NET pour optimiser les documents PDF

Utilisez la bibliothèque Docotic.Pdf pour compresser des documents PDF dans les applications .NET Framework et .NET Core. Vous pouvez télécharger les binaires de la bibliothèque ou utiliser son package NuGet. Pour essayer la bibliothèque sans restrictions du mode d'évaluation, vous pouvez obtenir la clé de licence gratuite à durée limitée en utilisant le formulaire ici.

Bibliothèque Docotic.Pdf 9.3.17036-dev Tests de régression 14,665 réussis Téléchargements totaux de NuGet 4,191,515

Docotic.Pdf propose différents moyens d'optimisation:

  • optimiser les objets PDF
  • supprimer les objets PDF en double (polices, images, etc.)
  • compresser les images
  • polices de sous-ensemble
  • supprimer les métadonnées
  • supprimer les informations sur la structure
  • supprimer les ressources inutilisées
  • supprimer les données d'application privées
  • aplatir les champs de formulaire et les annotations
  • polices non intégrées

Vous pouvez utiliser tout ce qui précède pour obtenir le meilleur taux de compression pour vos documents PDF. Regardez l'exemple Compresser le document PDF dans .NET pour voir toutes ces techniques en action.

Examinons ces méthodes de compression plus en détail.

Optimiser les objets PDF

En interne, un fichier PDF est une collection d'objets PDF de bas niveau : dictionnaires, flux, tableaux et autres. Lors de l'enregistrement d'un fichier PDF, Docotic.Pdf applique par défaut les optimisations sans perte suivantes :

  • compresse les flux PDF avec l'encodage Flate
  • supprime les objets PDF inutilisés
  • Insère des objets PDF indirects
  • écrit des objets PDF sans formatage
  • regroupe les objets PDF dans des flux d'objets compressés

Cet exemple montre comment optimiser les objets PDF en C# :

using BitMiracle.Docotic.Pdf;

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

    // Ces options sont activées par défaut et appliquées implicitement :
    //saveOptions.Compression = PdfCompression.Flate;
    //saveOptions.RemoveUnusedObjects = true;
    //saveOptions.OptimizeIndirectObjects = true;
    //saveOptions.UseObjectStreams = true;
    //saveOptions.WriteWithoutFormatting = true;

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

Toutes ces optimisations n'affectent pas le contenu visible (texte, images, signets et quoi que ce soit d'autre) du document PDF. Ils affectent uniquement la façon dont les objets PDF sont écrits et compressés dans le fichier PDF de sortie.

La suppression des objets PDF inutilisés est importante pour les autres techniques décrites ci-dessous. Ne définissez pas la propriété PdfSaveOptions.RemoveUnusedObjects sur false, sauf si vous avez de bonnes raisons de conserver les objets inutilisés.

Supprimer les objets en double dans les documents PDF

Lorsque vous fusionnez des documents PDF, le PDF produit contient souvent des polices et des images en double. Le remplacement des objets en double permet de réduire la taille du fichier PDF produit. Voici l'exemple C# pour cette opération :

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

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

Il est recommandé de supprimer les objets en double avant de compresser des images ou de désincorporer des polices. Sinon, beaucoup de travail supplémentaire sera effectué pour optimiser les copies des mêmes images ou polices.

La méthode PdfDocument.ReplaceDuplicateObjects ne remplace pas les images en ligne. Si votre document contient des images en ligne, utilisez d'abord la méthode PdfCanvas.MoveInlineImagesToResources. La méthode convertira les images en ligne en images normales, puis la méthode ReplaceDuplicateObjects pourra également dédupliquer les images converties.

Compresser des images en PDF

L'optimisation des images PDF est généralement la méthode de compression la plus efficace pour les documents contenant des images raster.

La bibliothèque Docotic.Pdf fournit des méthodes intégrées pour recompresser les images PDF à l'aide des algorithmes de compression JPEG, CCITT Group 3 et 4 (fax), JPEG 2000 et zip/deflate. Vous pouvez également redimensionner ou réduire les images pour réduire encore plus la taille du fichier PDF. Ou vous pouvez optimiser les images vous-même en utilisant un outil tiers, puis en remplacer les images.

Consultez l'exemple Optimiser les images dans un document PDF en C# et VB.NET sur GitHub pour un exemple.

Polices de sous-ensemble

Les documents PDF intègrent généralement des polices utilisées pour dessiner du texte. Les polices intégrées incluent souvent des informations sur tous les glyphes pris en charge. La suppression des glyphes inutilisés dans un document PDF peut réduire considérablement la taille du fichier de sortie.

Cet exemple montre comment optimiser les polices PDF en C# :

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

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

Le sous-ensemble n'affecte pas les polices utilisées dans les contrôles de texte variables, tels que les zones de texte ou les zones de liste déroulante.

Supprimer les métadonnées

Les documents PDF peuvent contenir des métadonnées XMP non compressées contenant des informations sur l'auteur, les mots-clés, l'heure de création, etc. Les métadonnées n'affectent pas le contenu visible du document PDF.

Cet exemple montre comment supprimer les métadonnées d'un fichier PDF en C# :

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

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

Supprimer les informations sur la structure

Les documents PDF peuvent inclure des informations sur leur structure logique. Les informations sont utilisées pour :

  • produire des documents PDF balisés
  • Rendre le document PDF accessible pour les appareils et accessoires fonctionnels

La suppression de ces informations permet de réduire la taille du fichier PDF. Mais le PDF ne sera plus balisé ni accessible aux appareils d’assistance. Cet exemple montre comment supprimer les informations de structure d'un PDF en C# :

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

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

Supprimer les ressources inutilisées du PDF

Les pages PDF et les XObjects peuvent référencer plus de polices, d'images ou de motifs qu'ils n'en utilisent. Vous pouvez utiliser la méthode PdfDocument.RemoveUnusedResources pour supprimer les ressources inutilisées du PDF. Voici l'exemple C# :

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

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

Supprimer les données d'application privées du PDF

Les documents PDF, produits par le logiciel Adobe, peuvent inclure des données d'application privées. Ces données d'application sont stockées dans des dictionnaires de pages.

Cet exemple montre comment nettoyer et compresser un PDF en C# en supprimant les dictionnaires de morceaux de page :

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

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

Aplatir les champs et les annotations du formulaire PDF

Vous pouvez réduire la taille d'un document PDF avec un formulaire rempli en aplatissant les champs du formulaire. L'aplatissement remplacera les champs de formulaire par leur représentation visuelle. Les valeurs renseignées seront conservées. Cet exemple C# montre comment aplatir tous les champs d'un formulaire PDF :

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

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

Vous pouvez également aplatir toutes les annotations et tous les contrôles à l'aide de la méthode PdfDocument.FlattenWidgets.

De plus, la méthode PdfWidget.Flatten vous permet d'aplatir des annotations ou des contrôles individuels.

Désintégrer les polices

L'intégration de polices PDF est parfaitement logique pour les polices personnalisées ou rares. Dans le même temps, les polices largement disponibles comme Arial ou Verdana peuvent augmenter la taille des fichiers PDF sans raison valable. Vous pouvez désintégrer les polices populaires disponibles sur vos plateformes cibles. Exemple de code C# :

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

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

/// <summary>
/// Cette méthode désintègre toute police :
/// * installé dans le système d'exploitation
/// * ou son nom est inclus dans la liste "toujours désintégrer"
/// * et son nom n'est pas inclus dans la liste "toujours conserver".
/// </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();
    }
}

N'utilisez pas cette technique avec des documents PDF/A. Un document PDF/A doit intégrer toutes les polices.

Veuillez toujours tester les documents PDF avec des polices non intégrées dans vos systèmes d'exploitation cibles (Windows, Linux, macOS, iOS, Android) et vos visionneuses PDF (Adobe, Foxit, etc.).

Autres méthodes pour réduire la taille du PDF

Il existe de nombreuses méthodes d'optimisation mentionnées ci-dessus. Cependant, vous pouvez compresser encore plus les documents PDF en supprimant le contenu sans importance. Docotic.Pdf permet de supprimer ces objets des documents PDF:

  • annotations
  • pièces jointes
  • signets
  • champs de formulaire
  • pages
  • scripts
  • transparence

Vous pouvez également supprimer du texte, des images et des graphiques vectoriels des pages PDF. L'aplatissement du texte est également possible.

Conclusion

Vous pouvez utiliser la bibliothèque Docotic.Pdf pour compresser des PDF en C# et VB.NET. Docotic.Pdf fournit de nombreux moyens d'optimisation efficaces.

Téléchargez et essayez l’exemple complet Compresser le document PDF en C# et VB.NET à partir de GitHub.

Contactez-nous, et nous vous conseillerons sur la manière d'obtenir le meilleur taux de compression pour vos documents PDF.