Cette page peut contenir du texte traduit automatiquement.

Rendre et imprimer des documents PDF en C# et VB.NET

Tout le monde pense à Adobe Reader lorsqu'il s'agit de lire des documents PDF. Mais que faire si vous êtes développeur et souhaitez afficher des documents PDF dans votre application ? Vous ne voulez pas demander à l'utilisateur d'installer Adobe Reader et d'ouvrir le document là-bas.

Vous pouvez également avoir besoin d'implémenter d'autres exigences liées aux PDF. Par exemple, imprimer des documents PDF. Ou générer des miniatures pour des documents PDF téléversés. Ou prendre en charge l'édition de PDF dans votre application de bureau ou web.

Tout ce dont vous avez besoin, c'est d'une bibliothèque PDF capable de rendre et d'imprimer des documents PDF.

Imprimer un PDF en C#

Bibliothèque .NET pour afficher, modifier ou imprimer des documents PDF

La bibliothèque Docotic.Pdf vous permet d'afficher, de modifier et d'imprimer des documents PDF en C# et VB.NET. Vous pouvez implémenter n'importe quel flux de rendu PDF complexe à l'aide de trois fonctionnalités principales.

La première est la possibilité de convertir un PDF en images. Vous pouvez implémenter presque tout à partir de cette fonctionnalité. De l'impression de PDF à l'affichage d'un PDF sur HoloLens ou à la publication d'un PDF sur Instagram. C'est possible parce que les images sont prises en charge partout.

La deuxième fonctionnalité clé est la possibilité de dessiner des pages PDF sur la surface de dessin d'un System.Drawing.Graphics. Elle vous permet de rendre et d'imprimer des PDF dans des applications Windows Forms ou WPF. Pour utiliser cette fonctionnalité, ajoutez la DLL d'extension BitMiracle.Docotic.Pdf.Gdi à votre projet.

Enfin, la troisième fonctionnalité est la possibilité d'extraire les objets des pages PDF. Cette fonctionnalité vous permet de créer un visualiseur PDF ou un éditeur PDF dans votre application C# ou VB.NET.

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.

.NET ne prend pas en charge l'impression des documents PDF nativement. Vous devez transformer votre document PDF en image, en fichier XPS, ou le dessiner sur une surface System.Drawing.Graphics. Ensuite, vous pouvez utiliser des classes .NET pour imprimer le résultat depuis une application Windows Forms ou WPF.

Dans les applications Windows Forms, vous pouvez utiliser les classes de l'espace de noms System.Drawing.Printing. Il existe également les classes pratiques PrintDialog et PrintPreviewDialog pour créer une interface utilisateur d'impression.

Veuillez noter qu'il n'est pas recommandé d'utiliser quoi que ce soit de l'espace de noms System.Drawing dans les environnements macOS et Linux. Les implémentations macOS et Linux de System.Drawing sont incomplètes et différentes de l'implémentation Windows. Vous risquez d'obtenir des résultats incorrects et/ou incohérents si vous utilisez l'espace de noms System.Drawing dans les environnements macOS et Linux.

WPF fournit une autre classe PrintDialog, mais ne fournit pas de classes pour l'aperçu avant impression. Heureusement, WPF vous permet d'utiliser la classe PrintPreviewDialog de System.Windows.Forms.dll. Il est donc plus simple d'utiliser les classes d'impression des espaces de noms System.Windows.Forms et System.Drawing.Printing dans les applications WPF.

Regardez l'application de démonstration Imprimer un PDF dans .NET, qui existe en versions C# et VB.NET pour WinForms et WPF. L'application montre comment :

  • afficher un aperçu avant impression pour les documents PDF
  • imprimer des documents PDF sur une imprimante sélectionnée
  • configurer le format papier, le mode de mise à l'échelle et d'autres paramètres d'impression

L'application utilise la bibliothèque Docotic.Pdf, la DLL d'extension BitMiracle.Docotic.Pdf.Gdi, et les classes d'impression des espaces de noms System.Windows.Forms et System.Drawing.Printing. Vous pouvez utiliser ses classes PdfPrintDocument et PdfPrintHelper dans vos projets WPF ou Windows Forms.

La classe PdfPrintDocument décrit la logique d'impression principale. Cette classe relie Docotic.Pdf à la classe System.Drawing.Printing.PrintDocument. La méthode clé est le gestionnaire d'événement printDocument_PrintPage :

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics gr = e.Graphics ?? throw new InvalidOperationException("No Graphics!");

    // Travailler en points pour avoir des unités cohérentes dans tous les contextes :
    // 1. Imprimante
    // 2. Aperçu avant impression
    // 3. PDF
    gr.PageUnit = GraphicsUnit.Point;

    if (m_printAction == PrintAction.PrintToPreview)
    {
        gr.Clear(Color.LightGray);
        gr.FillRectangle(Brushes.White, m_printableAreaInPoints);
        gr.IntersectClip(m_printableAreaInPoints);

        gr.TranslateTransform(m_printableAreaInPoints.X, m_printableAreaInPoints.Y);
    }

    PdfPage page = m_pdf.Pages[m_pageIndex];
    PdfSize pageSizeInPoints = getPageSizeInPoints(page);

    if (m_printSize == PrintSize.FitPage)
    {
        float sx = (float)(m_printableAreaInPoints.Width / pageSizeInPoints.Width);
        float sy = (float)(m_printableAreaInPoints.Height / pageSizeInPoints.Height);
        float scaleFactor = Math.Min(sx, sy);

        centerContentInPrintableArea(gr, pageSizeInPoints, scaleFactor);
        gr.ScaleTransform(scaleFactor, scaleFactor);
    }
    else if (m_printSize == PrintSize.ActualSize)
    {
        centerContentInPrintableArea(gr, pageSizeInPoints, 1);
    }

    page.Draw(gr);

    ++m_pageIndex;
    e.HasMorePages = (m_pageIndex <= m_lastPageIndex);
}

Tout d'abord, nous configurons les transformations de l'objet Graphics de la page imprimée. Il est important de respecter les paramètres "Fit page" et "Actual size". Nous affichons également les marges matérielles de l'imprimante dans la boîte de dialogue d'aperçu avant impression. Ensuite, nous dessinons la page PDF courante sur l'objet Graphics à l'aide de la méthode d'extension PdfPage.Draw.

La classe PdfPrintHelper vous permet d'utiliser PdfPrintDocument avec des classes d'interface utilisateur pour l'impression. Par exemple, vous pouvez afficher la boîte de dialogue d'impression pour votre document PDF comme ceci :

using (var pdf = new PdfDocument("your_document.pdf"))
    action(pdf, getPrintSize());

public static DialogResult ShowPrintDialog(PdfDocument pdf, PrintSize printSize)
{
    using (var printDialog = new PrintDialog())
    {
        printDialog.AllowSomePages = true;
        printDialog.AllowCurrentPage = true;
        printDialog.AllowSelection = true;

        printDialog.PrinterSettings.MinimumPage = 1;
        printDialog.PrinterSettings.MaximumPage = pdf.PageCount;
        printDialog.PrinterSettings.FromPage = printDialog.PrinterSettings.MinimumPage;
        printDialog.PrinterSettings.ToPage = printDialog.PrinterSettings.MaximumPage;

        var result = printDialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            using (var printDocument = new PdfPrintDocument(pdf, printSize))
                printDocument.Print(printDialog.PrinterSettings);
        }

        return result;
    }
}

C'est tout. Faites ce qui suit pour implémenter l'impression de PDF dans votre application Windows Forms ou WPF :

  • ajoutez les fichiers PdfPrintDocument, PdfPrintHelper et PrintSize à partir de l'exemple
  • ajoutez une référence à la bibliothèque Docotic.Pdf
  • ajoutez une référence à la DLL d'extension BitMiracle.Docotic.Pdf.Gdi
  • (WPF uniquement) ajoutez des références aux assemblys System.Windows.Forms et System.Drawing

Les classes de l'espace de noms System.Drawing.Printing fonctionnent bien dans les applications Windows Forms et WPF. Cependant, il existe des cas où vous ne pouvez pas ou ne devez pas utiliser System.Drawing.Printing.

Par exemple, vous ne devez pas utiliser System.Drawing.Printing dans les services Windows ou les applications ASP.NET. System.Drawing.Printing peut produire des résultats incohérents lors de l'impression sous Linux ou macOS. Et vous ne pouvez pas utiliser System.Drawing.Printing dans les applications Eto.Forms ou Avalonia.

Dans ces cas, vous devez d'abord convertir le document PDF en image. Cet exemple C# montre comment enregistrer une page PDF au format PNG ou convertir un document PDF entier en TIFF multipage :

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

PdfDrawOptions options = PdfDrawOptions.Create();
options.HorizontalResolution = printerDpi;
options.VerticalResolution = printerDpi;

// enregistrer une page
pdf.Pages[0].Save("page0.png", options);

// enregistrer le document entier en TIFF bitonal multipage
options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
pdf.SaveAsTiff("your_document.tiff", options);

Ensuite, imprimez les images à l'aide d'un autre framework ou outil d'impression. Regardez l'application de démonstration Imprimer un PDF dans Eto.Forms, qui montre comment imprimer des documents PDF sans System.Drawing.Printing.

Rendre des PDF en C# et VB.NET

L'affichage de PDF dans votre application est similaire à l'impression. Dans ASP.NET, WPF, Eto.Forms, Avalonia ou tout autre type d'application, convertissez le PDF en image puis affichez l'image.

Dans une application Windows Forms, vous pouvez dessiner une page PDF sur un contexte System.Drawing.Graphics depuis n'importe quel contrôle. Ou vous pouvez convertir une page PDF en System.Drawing.Bitmap puis afficher ce bitmap dans un PictureBox.

Cet exemple montre comment convertir une page PDF en Bitmap en C# :

using var pdf = new PdfDocument("render.pdf");
const float TargetResolution = 300;

PdfPage page = pdf.Pages[0];
double scaleFactor = TargetResolution / page.Resolution;

using var bitmap = new Bitmap((int)(page.Width * scaleFactor), (int)(page.Height * scaleFactor));
bitmap.SetResolution(TargetResolution, TargetResolution);

using (Graphics gr = Graphics.FromImage(bitmap))
    page.Draw(gr);

bitmap.Save("result.png");

Le code ci-dessus nécessite d'ajouter la DLL d'extension BitMiracle.Docotic.Pdf.Gdi à votre projet.

Créer un visualiseur PDF ou un éditeur PDF dans une application .NET

Docotic.Pdf vous permet d'obtenir des informations détaillées sur chaque objet d'une page PDF. Vous pouvez extraire des fragments de texte, des images, des chemins vectoriels, des contrôles de formulaire et des annotations à partir d'une page PDF.

Ensuite, dans votre application, vous pouvez rendre tous les objets extraits. Vous pouvez également implémenter la possibilité de sélectionner et de modifier les objets rendus.

Regardez l'exemple Extraire du texte, des images et des chemins à partir d'un PDF. Il montre comment extraire et dessiner des objets de page dans un contexte System.Drawing.Graphics.

Vous pouvez également extraire les objets texte sous forme de chemins vectoriels. Pour cela, utilisez la surcharge PdfPage.GetObjects(PdfObjectExtractionOptions).

Conclusion

Utilisez la bibliothèque Docotic.Pdf pour afficher et imprimer des documents PDF dans vos projets .NET. Consultez les exemples C# et VB.NET associés :

Contactez-nous si vous avez des questions sur l'impression ou le rendu de PDF.