Cette page peut contenir du texte traduit automatiquement.

Diviser des documents PDF en C# et VB.NET

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

Diviser des documents PDF

Docotic.Pdf est fourni avec des licences payantes, mais il est aussi gratuit dans certains cas. Obtenez la bibliothèque et une clé de licence gratuite à durée limitée sur la page Télécharger la bibliothèque PDF C# .NET.

Notions de base de la division PDF

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

Diviser un 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 aide à réduire les fichiers de sortie. Elle est utile lorsque les pages copiées référencent des polices, des images ou des motifs inutilisés. Pour en savoir plus sur la compression PDF, consultez 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 page et la première page :

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

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

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

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

Diviser un PDF selon une condition

Vous pouvez diviser des documents en fonction du contenu. C'est utile si vous ne savez pas à l'avance quelles pages extraire. Par exemple, extraire les 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 Extraction de texte depuis un PDF en C# et VB.NET.

Division avancée de PDF

Extraire des pages

Les méthodes CopyPages ne modifient pas l'objet PdfDocument associé. Il existe également les méthodes PdfDocument.ExtractPages. Elles 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 correspondant Extraire des pages sur GitHub.

Supprimer et réorganiser les pages

Les méthodes CopyPages et ExtractPages produisent un nouveau document avec les pages sélectionnées. Une autre solution 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 suppression. Consultez les exemples de code dans ces sections :

Optimiser les fichiers de sortie

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

La division de PDF est parfois utilisée pour obtenir des fichiers de pages plus petits qu'une certaine limite. Dans ce cas, vous pouvez mesurer la taille obtenue 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);

var 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 de la limite.

Extraire le contenu des pages

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

Vous pouvez aussi supprimer ou remplacer certains contenus sur les pages extraites. Consultez l'exemple de code Copier du texte, des chemins et des images qui montre comment copier des objets de page PDF.

Diviser un PDF en images

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

Diviser en threads parallèles

Vous pouvez vouloir paralléliser la division PDF pour de grands documents. 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. Une solution multithread implique une surcharge liée à l'analyse d'objets PdfDocument supplémentaires. Utilisez la version monothread sauf si des tests prouvent qu'un code parallèle est plus rapide.