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 de logiciels et souhaitez afficher des documents PDF dans votre application? Vous ne souhaitez pas demander à l'utilisateur de configurer Adobe Reader et d'y ouvrir le document.

Vous devrez peut-être également mettre en œuvre d’autres exigences liées au PDF. Par exemple, imprimez des documents PDF. Ou générez des vignettes pour les documents PDF téléchargés. Ou prenez en charge l'édition de PDF dans votre application de bureau ou Web.

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

Imprimer un PDF en C#

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

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.

Le premier est la possibilité de convertir un PDF en images. Vous pouvez implémenter presque tout sur la base de cette fonctionnalité. De l'impression PDF à l'affichage d'un PDF sur HoloLense ou à la publication d'un PDF sur Instagram. Cela est possible car 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». Il vous permet de restituer et d'imprimer des PDF dans des applications Windows Forms ou WPF. Pour utiliser cette fonctionnalité, ajoutez DLL d'extension BitMiracle.Docotic.Pdf.Gdi à votre projet.

Dernier point mais non le moindre, la possibilité d'extraire des objets de page PDF. Cette fonctionnalité vous permet de créer une visionneuse PDF ou un éditeur PDF dans votre application C# ou VB.NET.

Vous pouvez télécharger les binaires de la bibliothèque ou utiliser son package NuGet. Pour essayer Docotic.Pdf sans restrictions du mode d'évaluation, vous pouvez obtenir la clé de licence gratuite à durée limitée en utilisant le formulaire ici.

.NET ne prend pas en charge l'impression de documents PDF prêts à l'emploi. Vous devez transformer votre document PDF en image, en fichier XPS ou le dessiner sur une surface System.Drawing.Graphics. Vous pouvez ensuite utiliser les classes .NET pour imprimer la sortie à partir d'un Windows Forms ou d'une application WPF.

Dans les applications Windows Forms, vous pouvez utiliser les classes de l'espace de noms System.Drawing.Printing. Il existe également des 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. Ainsi, il est plus facile d'utiliser les classes d'impression des espaces de noms System.Windows.Forms et System.Drawing.Printing dans les applications WPF.

Consultez l'application de démonstration Print PDF in .NET disponible 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 du 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 principale logique d'impression. Cette classe connecte Docotic.Pdf à la classe System.Drawing.Printing.PrintDocument. La méthode clé est le gestionnaire d'événements printDocument_PrintPage :

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics gr = e.Graphics;

    // Travailler par points pour avoir des unités cohérentes pour 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 mettons en place les transformations de l'objet Graphics de la page imprimée. Il est important de respecter les paramètres «Ajuster la page» et «Taille réelle». Et nous affichons également les marges nettes de l'imprimante dans la boîte de dialogue Aperçu avant impression. Ensuite, nous dessinons la page PDF actuelle sur l'objet Graphics en utilisant la méthode d'extension PdfPage.Draw.

La classe PdfPrintHelper vous permet d'utiliser PdfPrintDocument avec les classes d'interface utilisateur pour l'impression. Par exemple, vous pouvez afficher la boîte de dialogue d'impression de 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 ça. Procédez comme suit pour implémenter l'impression PDF dans votre application Windows Forms ou WPF :

  • ajoutez les fichiers PdfPrintDocument, PdfPrintHelper et PrintSize à partir de l'exemple
  • ajouter une référence à la bibliothèque Docotic.Pdf
  • ajouter une référence à DLL d'extension BitMiracle.Docotic.Pdf.Gdi
  • (WPF uniquement) ajouter 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. Mais il y a 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 de tels cas, vous devez d'abord convertir le document PDF en image. Cet exemple C# montre comment enregistrer une page PDF en tant qu'image 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 l'intégralité du document au format TIFF bitonal multipage
    options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
    pdf.SaveAsTiff("your_document.tiff", options);
}

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

Rendre le PDF en C# et VB.NET

L'affichage d'un PDF dans votre application est comme une impression. Dans ASP.NET, WPF, Eto.Forms, Avalonia ou tout autre type d'application, convertir le PDF en image, puis afficher l'image.

Dans une application Windows Forms, vous pouvez dessiner une page PDF sur un contexte System.Drawing.Graphics à partir de n'importe quel contrôle. Ou vous pouvez convertir une page PDF en System.Drawing.Bitmap, puis afficher le bitmap dans une 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 vous oblige à ajouter DLL d'extension BitMiracle.Docotic.Pdf.Gdi à votre projet.

Créer une visionneuse 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 morceaux 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 restituer tous les objets extraits. Vous pouvez également implémenter la possibilité de sélectionner et de modifier les objets rendus.

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

Vous pouvez également extraire des objets texte sous forme de chemins vectoriels. Utilisez la surcharge PdfPage.GetObjects(PdfObjectExtractionOptions) pour cela.

Conclusion

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

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