web-dev-qa-db-fra.com

Comment rendre les PDF en C #

Je veux charger et dessiner graphiquement des fichiers pdf en utilisant C #. Je n'ai pas besoin de les éditer ou quoi que ce soit, mais de les rendre à un niveau de zoom donné.

Les bibliothèques de pdf que j'ai trouvées semblent être axées sur la génération. Comment puis-je faire cela?

Merci.

44
Garth

Il existe quelques autres choix au cas où Adobe ActiveX ne correspond pas à ce que vous recherchez (car Acrobat doit être présent sur l'ordinateur de l'utilisateur et vous ne pouvez pas l'expédier vous-même).

Pour créer l'aperçu PDF, jetez d'abord un coup d'œil à d'autres discussions sur le sujet sur StackOverflow:

Dans les deux derniers, je parle de quelques choses que vous pouvez essayer:

  • Vous pouvez obtenir un moteur de rendu commercial ( PDFViewForNet , PDFRasterizer.NET , ABCPDF , ActivePDF , XpdfRasterizer et d'autres dans les autres réponses ...) .
    Cependant, la plupart sont assez coûteux, surtout si vous ne faites que créer un simple aperçu/vignettes.

  • Outre l’extrait de code d’Omar Shahine, il existe un article CodeProject qui explique comment utiliser Adobe ActiveX, mais il peut être obsolète, facilement brisé par les nouvelles versions et sa légalité est trouble utiliser, mais vous ne pouvez pas l'expédier et vous ne pouvez pas l'utiliser sur un serveur pour produire des images au format PDF).

  • Vous pouvez consulter le code source de SumatraPDF , un visualiseur OpenSource PDF pour Windows. 

  • Il y a aussi Poppler , un moteur de rendu qui utilise Xpdf comme moteur de rendu .Tous sont excellents, mais ils nécessiteront beaucoup d’engagement pour les faire fonctionner et pour s’interfacer avec eux. Net et ils ont tendance à être distribués sous la licence GPL.

  • Vous voudrez peut-être envisager d'utiliser GhostScript comme interpréteur, car le rendu des pages est un processus assez simple.
    L’inconvénient est que vous devrez soit le reconditionner pour l’installer avec votre application, soit en faire un pré-requis (ou au moins une partie de votre processus d’installation).
    Ce n’est pas un gros défi, et c’est certainement plus facile que de devoir forcer les autres moteurs de rendu à coopérer avec .Net.
    J'ai réalisé un petit projet que vous trouverez en pièce jointe sur les forums Developer Express .
    Faites attention aux conditions de licence requises pour GhostScript via.
    Si vous ne pouvez pas partir avec cela, alors le logiciel commercial est probablement votre seul choix.

43
Renaud Bompuis

Google a ouvert la source de son excellent moteur de rendu PDF - PDFium - qu’il a écrit avec Foxit Software.

Il existe un package de nuget C # appelé PdfiumViewer qui donne un wrapper C # autour de PDFium et permet aux fichiers PDF d’être affichés et imprimés.

Je l'ai utilisé et j'ai été très impressionné par la qualité du rendu.


PDFium fonctionne directement avec les flux, il n’est donc nécessaire d’écrire aucune donnée sur le disque.

Ceci est mon exemple d'une application WinForms

    public void LoadPdf(byte[] pdfBytes)
    {
        var stream = new MemoryStream(pdfBytes);
        LoadPdf(stream)
    }

    public void LoadPdf(Stream stream)
    {
        // Create PDF Document
        var pdfDocument = PdfDocument.Load(stream);

        // Load PDF Document into WinForms Control
        pdfRenderer.Load(pdfDocument);
    }

Edit: Pour obtenir le contrôle pdfRenderer dans WinForm: Ajoutez le package PdfiumViewer NuGet au projet; ouvrez le dossier des packages de projets dans l'Explorateur Windows et faites glisser le fichier PdfiumViewer.dll dans la fenêtre Toolbox; Un contrôle appelé PdfRenderer sera disponible pour ajouter:

 Adding PdfRenderer control to WinForms

48
Paddy

Voici ma réponse d'une question différente.

Vous devez d’abord faire référence au contrôle Active Reader d’Adobe Reader.

Bibliothèque de types de contrôles Adobe Acrobat Browser 1.0

% programfiles &\Fichiers communs\Adobe\Acrobat\ActiveX\AcroPDF.dll

Ensuite, il vous suffit de le faire glisser dans votre Windows Form à partir de la Boîte à outils.

Et utilisez un code comme celui-ci pour initialiser le contrôle ActiveX.

private void InitializeAdobe(string filePath)
{
    try
    {
        this.axAcroPDF1.LoadFile(filePath);
        this.axAcroPDF1.src = filePath;
        this.axAcroPDF1.setShowToolbar(false);
        this.axAcroPDF1.setView("FitH");
        this.axAcroPDF1.setLayoutMode("SinglePage");
        this.axAcroPDF1.Show();
    }
    catch (Exception ex)
    {
        throw;
    }
}

Assurez-vous, lorsque votre formulaire se ferme, que vous disposez du contrôle ActiveX

this.axAcroPDF1.Dispose();
this.axAcroPDF1 = null;

sinon, Acrobat risque de rester traîner.

13
Omar Shahine

PdfiumViewer est excellent, mais relativement étroitement couplé à System.Drawing et WinForms. Pour cette raison, j'ai créé mon propre wrapper autour de PDFium: PDFiumSharp

Les pages peuvent être converties en PDFiumBitmap qui, à leur tour, peuvent être enregistrées sur le disque ou exposées sous forme de flux . Ainsi, tout framework capable de charger une image au format BMP à partir d'un flux peut utiliser cette bibliothèque pour afficher des pages pdf.

Par exemple, dans une application WPF, vous pouvez utiliser la méthode suivante pour afficher une page pdf:

using System.Linq;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using PDFiumSharp;

static class PdfRenderer
{
    public static ImageSource RenderPage(string filename, int pageIndex, string password = null, bool withTransparency = true)
    {
        using (var doc = new PdfDocument(filename, password))
        {
            var page = doc.Pages[pageIndex];
            using (var bitmap = new PDFiumBitmap((int)page.Width, (int)page.Height, withTransparency))
            {
                page.Render(bitmap);
                return new BmpBitmapDecoder(bitmap.AsBmpStream(), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First();
            }
        }
    }
}
3
ArgusMagnus

ABCpdf fera cela et bien d’autres choses pour vous.

Le rendu de votre PDF n’est que possible dans divers formats (par exemple, JPEG, GIF, PNG, TIFF, JPEG 2000; vecteur EPS, SVG, Flash et PostScript), mais il peut également le faire dans divers espaces de couleur (par exemple gris, RVB, CMJN) et des profondeurs de bits (par exemple 1, 8, 16 bits par composant). 

Et c'est juste une partie de ce qu'il va faire!

Pour plus de détails, voir:

http://www.websupergoo.com/abcpdf-8.htm

Oh, et vous pouvez obtenir des licences gratuites via le système de licences gratuites.

L'utilisation de Acrobat pour effectuer le rendu PDF pose des problèmes de CLUF. Si vous souhaitez suivre cette voie, vérifiez d’abord soigneusement les aspects juridiques.

3
user81888

Utilisez le contrôle du navigateur Web. Adobe Reader doit être installé pour cela, mais vous l’aurez probablement de toute façon. Définissez l'URL du contrôle sur l'emplacement du fichier.

0
Sesh

Cela semble être la bonne chose: http://code.google.com/p/lib-pdf/

0
DenNukem

Disclaimer: Je travaille pour Atalasoft

Nous avons un PDF Rasterizer qui peut le faire pour .NET

http://www.atalasoft.com/products/dotimage/pdfrasterizer/

0
Lou Franco

La bibliothèque la plus simple que j'ai utilisée est Paolo Gios's library. C'est fondamentalement 

Create GiosPDFDocument object
Create TextArea object
Add text, images, etc to TextArea object
Add TextArea object to PDFDocument object
Write to stream

This est un excellent tutoriel pour vous aider à démarrer.

0
Dale Glaser

Le PDF logiciel dynamique Viewer de ceTe peut faire ce que vous cherchez. J'ai utilisé leur logiciel de générateur et j'en étais plutôt content.

http://www.dynamicpdf.com/

0
Paul Lefebvre