2009-11-19 7 views
9

Je voudrais imprimer les reçus de mon application asp.net mvc. Pour l'instant je pense que ma meilleure option est de créer des fichiers PDF, qui sont plus faciles à manipuler quand ils vont les imprimer, à cause des marges/headers/footers/etc. Je ne veux pas les faire configurer leurs navigateurs juste pour qu'ils puissent imprimer mes reçus, certains d'entre eux ne sont pas si intelligents.Générer des fichiers PDF à partir de asp.net mvc

D'autres options?

Quel est le meilleur (gratuit) bibliothèque/api pour générer des fichiers PDF à partir d'une application asp.net mvc

+2

dupliquer: http://stackoverflow.com/questions/779430/asp-net-mvc-how-to-get -view-to-generate-pdf –

+0

Je ne souhaite pas générer le fichier PDF sur une vue, ce n'est donc pas la même question. – hminaya

+2

@hminaya: alors c'est une copie de http://stackoverflow.com/questions/1244109/generating-pdf-file-in-net –

Répondre

7

J'ai eu un bon succès la création d'étiquettes de codes à barres en format PDF à l'aide Report.net ainsi que iTextSharp. Pour iTextSharp en particulier, l'API semblait assez facile et cela a bien fonctionné dans notre application ASP.NET MVC. Il n'y a pas beaucoup de documentation pour iTextSharp, vous devez donc consulter la documentation de Java pour iText (dont c'est un port de). Bonus: Ils sont tous les deux gratuits!

+2

Les versions de iTextSharp postérieures à la version 4.7 ne sont pas gratuites si vous êtes les utiliser commercialement. La licence a changé. –

+0

Comment avez-vous travaillé sur Report.net avec MVC? J'ai du mal à comprendre comment obtenir les sorties ViewPDF ou ResponsePDF à convertir en ActionResult. –

+0

Scratch mon commentaire ci-dessus sur l'utilisation de Report.NET avec MVC. Voir ma réponse pour un exemple de code. –

0

Je voudrais utiliser iTextSharp si vous cherchez à générer des PDF à partir de, mais dans la mesure où d'autres options vont, pourquoi ne pas simplement utiliser css pour styliser une option d'impression de la page?

+2

Parce que je ne peux pas contrôler ce que le navigateur met sur le pied de page et l'en-tête de la page, comme l'URL et d'autres choses ... – hminaya

9

En utilisant Report.NET le code pour retourner leur exemple Bonjour tout le monde dans une action MVC est:

public void MyPDFAction() 
    { 
     Root.Reports.Report report = new Root.Reports.Report(new PdfFormatter()); 
     FontDef fd = new FontDef(report, "Helvetica"); 
     FontProp fp = new FontPropMM(fd, 25); 
     Page page = new Page(report); 
     page.AddCB_MM(80, new RepString(fp, "Hello World!")); 
     RT.ViewPDF(report, "HelloWorld.pdf"); 
    } 

Le type de retour de l'action est void car le code Report.NET met directement à jour la réponse, qui est renvoyée par défaut pour les actions annulées. Cela ouvre une visionneuse pdf directement à partir du navigateur.

Pour obtenir la réponse retournée comme une page plutôt qu'un téléchargement remplacer la ligne de RT.ViewPDF avec

RT.ResponsePDF(report, System.Web.HttpContext.Current.Response); 

Cependant, cette méthode est marquée comme dépréciée en faveur de celui qui traite System.Web.UI .Page. Malheureusement, je ne sais pas comment traiter un objet Page dans le contexte d'une application MVC.

J'ai été incapable d'obtenir Report.NET pour lancer le téléchargement d'un fichier PDF.

Télécharger Report.NET here.

Édition J'ai récemment découvert PDFSharp qui semble être entretenu plus récemment que Report.NET. Il est également disponible sous licence MIT. Vous pouvez télécharger à partir de here. Il y a aussi un vaste wiki avec de nombreux exemples.

Code de base pour retourner un fichier en téléchargement dans MVC:

[HttpGet] 
    public ActionResult MyPdfAction() 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      PdfDocument document = new PdfDocument(); 
      PdfPage page = document.AddPage(); 
      XGraphics gfx = XGraphics.FromPdfPage(page); 
      XFont font = new XFont("Verdana", 20, XFontStyle.Bold); 
      gfx.DrawString("Hello, World!", font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Center); 
      document.Save(stream, false); 
      return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf"); 
     } 
    } 

Une autre Modifier Si vous êtes intéressant dans la production de documents en grande partie à base de texte avec des tables, il vaut bien vérifier MigraDoc car il fournit une couche d'abstraction utile au-dessus des primitives PDFSharp. MigraDoc est inclus dans le téléchargement PDFSharp. Vous devrez ajouter les projets PDFSharp, PDFSharp.Charting, MigraDoc.DocumentObjectModel et MigraDoc.Rendering à votre projet pour que tout fonctionne.

code pour générer un PDF à télécharger ici:

[HttpGet] 
    public ActionResult MyPdfAction() 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      Document document = CreateDocument(); 
      document.UseCmykColor = true; 
      const bool unicode = false; 
      const PdfFontEmbedding embedding = PdfFontEmbedding.Always; 
      PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(unicode, embedding); 
      pdfRenderer.Document = document; 
      pdfRenderer.RenderDocument(); 
      pdfRenderer.PdfDocument.Save(stream, false); 
      return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf"); 
     } 
    } 


    /// <summary> 
    /// Creates an absolutely minimalistic document. 
    /// </summary> 
    static Document CreateDocument() 
    { 
     Document document = new Document(); 
     Section section = document.AddSection(); 
     Paragraph paragraph = section.AddParagraph(); 
     paragraph.Format.Font.Color = Color.FromCmyk(100, 30, 20, 50); 
     paragraph.AddFormattedText("Hello, World!", TextFormat.Bold); 
     return document; 
    } 

Résumé Après avoir examiné un certain nombre de solutions PDF pour C# MVC, j'utilise PdfSharp/MigraDoc. J'ai déduit iTextSharp et les projets basés dessus à cause des coûts de licence élevés si vous l'utilisez commercialement (2500 € dans mon cas). Report.NET a été développé avec ASP.NET classic et n'a pas reçu de mise à jour depuis 2006.

Questions connexes