Cette page peut contenir du texte traduit automatiquement.

Fractionner des documents PDF en C# et VB.NET

Bibliothèque Docotic.Pdf vous permet de diviser un document PDF en un groupe de fichiers plus petits. Vous pouvez extraire des pages individuelles ou des plages de pages. Vous pouvez également diviser des documents PDF en fonction de certains critères.

Diviser des documents PDF

Docotic.Pdf est livré avec des licences payantes, mais il est aussi gratuit dans certains cas. Vous pouvez télécharger la bibliothèque et obtenir une clé de licence d'évaluation sur la Page de téléchargement Docotic.Pdf.

Bibliothèque Docotic.Pdf 9.4.17467-dev Tests de régression 14,760 réussis Téléchargements totaux de NuGet 4,415,970

Bases du fractionnement de PDF

Les méthodes PdfDocument.CopyPages vous permettent de copier des pages à partir d'objets PdfDocument. Il s'agit de la principale API Docotic.Pdf pour diviser les documents PDF.

Diviser le PDF en pages individuelles

Le code C# suivant enregistre chaque page PDF dans un fichier distinct :

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");
}

La méthode PdfDocument.RemoveUnusedResources permet de réduire les fichiers de sortie. Ceci est utile lorsque les pages copiées font référence à des polices, des images ou des motifs inutilisés. En savoir plus sur la compression PDF dans la section Optimiser les fichiers de sortie.

Diviser en groupes de pages

La méthode CopyPages prend en charge la copie de n'importe quelle plage de pages. Cet extrait de code montre comment extraire la troisième et la première pages :

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

using PdfDocument copy = pdf.CopyPages(new int[] { 2, 0 });
copy.RemoveUnusedResources();
copy.Save("result.pdf");

L'ordre des index des pages est important. Il définit l'ordre des pages dans le document résultant.

Essayez l'exemple de code Copier des pages de GitHub.

Diviser le PDF par condition

Vous pouvez diviser des documents en fonction du contenu. Ceci est utile si vous ne savez pas à l’avance quelles pages extraire. Par exemple, extrayez des pages contenant un texte spécifique :

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");
    }
}

Vous pouvez en savoir plus sur l'extraction de texte dans l'article Extraire le texte d'un PDF en C# et VB.NET.

Fractionnement PDF avancé

Extraire des pages

Les méthodes CopyPages ne modifient pas l'objet PdfDocument associé. Il existe également les méthodes PdfDocument.ExtractPages. Ils permettent de supprimer les pages extraites du document :

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

using PdfDocument copy = pdf.ExtractPages(0, 3);
copy.Save("extracted.pdf");

pdf.Save("original.pdf");

Vous pouvez essayer l’exemple de code Extraire des pages correspondant à partir de GitHub.

Supprimer et réorganiser les pages

Les méthodes CopyPages et ExtractPages produisent un nouveau document avec les pages sélectionnées. Une alternative consiste à supprimer des pages d'un document actuel :

using var pdf = new PdfDocument(@"source.pdf");
pdf.RemovePages(0, 3);
pdf.Save("remaining.pdf")

Vous pouvez également réorganiser les pages après la suppression. Regardez les exemples de code associés :

Optimiser les fichiers de sortie

Plus tôt, j'ai utilisé la méthode RemoveUnusedResources pour optimiser les fichiers résultants. Docotic.Pdf offre plus d'options pour la compression PDF. Par exemple, vous pouvez supprimer des informations sur la structure ou compresser des images. Lisez l'article Compresser des documents PDF en C# et VB.NET pour plus d'informations. Vous pouvez également essayer l’exemple de code Compresser un document PDF dans .NET de GitHub.

Le fractionnement PDF est parfois utilisé pour obtenir des fichiers de page plus petits qu'une certaine limite. Dans de tels cas, vous pouvez mesurer la taille résultante et compresser le fichier si nécessaire. Exemple de code :

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");
}

Notez qu'il peut être impossible de compresser un fichier PDF en dessous d'une certaine limite. Les résultats dépendent du contenu du fichier et de la valeur limite.

Extraire le contenu de la page

Il est également possible de modifier le contenu de la page lors du fractionnement. Par exemple, vous pouvez redimensionner les pages extraites avant de les utiliser dans une imposition PDF. Essayez l'exemple de projet Créer XObject à partir de la page associé à partir de GitHub.

Ou vous pouvez supprimer ou remplacer du contenu sur les pages extraites. Regardez l'exemple de code Copier du texte, des chemins et des images qui montre comment copier des objets de page PDF.

Diviser le PDF en images

Docotic.Pdf vous permet également de diviser un document PDF en images de page. Lisez l'article Convertir un PDF en image en C# et VB.NET pour plus de détails.

Divisé en threads parallèles

Vous souhaiterez peut-être paralléliser le fractionnement de PDF pour les documents volumineux. La classe PdfDocument n'est pas thread-safe. Mais il est possible d'utiliser des objets PdfDocument distincts dans chaque thread :

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");
});

Notez que le code monothread est généralement plus rapide. La solution multithread implique une surcharge liée à l'analyse des objets PdfDocument supplémentaires. Utilisez la version monothread à moins que les tests prouvent qu'un code parallèle est plus rapide.