Asp.Net MVC comment obtenir une vue pour générer des PDF

Je voudrais appeler une action sur un contrôleur. Demandez au contrôleur d’obtenir les données du modèle. La vue est alors exécutée et génère un fichier PDF. Le seul exemple que j’ai trouvé est dans un article de Lou http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action . Son code est très élégant. La vue utilise ITextSharp pour générer le PDF. Le seul inconvénient est que son exemple utilise Spark View Engine. Existe-t-il un moyen de faire la même chose avec le moteur de visualisation Microsoft standard?

J’utilise iTextSharp pour générer des fichiers PDF dynamics dans MVC. Il vous suffit de placer votre PDF dans un object Stream, puis votre ActionResult renvoie un fichier FileStreamResult. J’ai également défini la disposition du contenu pour que l’utilisateur puisse la télécharger.

 Public FileStreamResult PDFGenerator ()
 {
     Stream fileStream = GeneratePDF ();

     HttpContext.Response.AddHeader ("contenu-disposition", 
     "pièce jointe; filename = form.pdf");

     renvoyer new FileStreamResult (fileStream, "application / pdf");
 }

J’ai également un code qui me permet de prendre un modèle PDF, d’écrire du texte et des images, etc. (si vous le souhaitez).

  • Remarque: vous devez définir la position du stream sur 0.
 Flux privé GeneratePDF ()
 {
     // créer votre pdf et le mettre dans le stream ... pdf variable ci-dessous
     // provient d'une classe que j'utilise pour écrire du contenu dans des fichiers PDF

     MemoryStream ms = new MemoryStream ();

     byte [] byteInfo = pdf.Output ();
     ms.Write (byteInfo, 0, byteInfo.Length);
     ms.Position = 0;

     retourne ms;
 }

Notre dernière réponse à ce problème était d’utiliser Rotativa .

Il encapsule le WKhtmltopdf.exe comme certaines des autres solutions, mais il est de loin le plus facile à utiliser que j’ai trouvé

Je suis allé jusqu’à voter toutes les autres réponses qui résolvent également bien le problème, mais c’est ce que nous avons utilisé pour résoudre le problème posé dans la question ci-dessus. C’est différent des autres réponses.

Voici un tutoriel Rotativa .

après l’avoir installé, c’est tout ce dont vous avez besoin

public ActionResult PrintInvoice(int invoiceId) { return new ActionAsPdf( "Invoice", new { invoiceId= invoiceId }) { FileName = "Invoice.pdf" }; } 

Très très simple

Je suis également tombé sur cette http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3 . C’est facile et rapide et correspond bien à MVC.

Cependant, le seul inconvénient à ce jour est qu’il n’est pas tout à fait flexible que vous souhaitiez avoir une mise en page correcte, par exemple, vous n’avez pas beaucoup de contrôle sur la table et les bordures de cellules via HTML. Il prend en charge forcer la nouvelle page, mais vous devrez appliquer un correctif à iTextsharp.

Créer la mise en page en HTML et l’imprimer ensuite en pdf est le moyen le plus rapide.

Html en pdf de conversion est fourni par phantomjs , wkhtmltopdf ou jsreport

jsreport fournit une intégration directe avec les vues asp.net mvc, où vous pouvez simplement marquer l’action du contrôleur avec l’atsortingbut et imprimer le pdf au lieu du HTML pour vous.

Plus sur ce billet de blog

Disclaimer: Je suis l’auteur de jsreport

C’est une vieille question qui rest pertinente et j’ai pensé partager ce que j’ai mis en place et qui fonctionne bien.

  1. Installez le package NuGet TuesdayPechkin – un fork dans la bibliothèque Pechkin basé sur WkHtmlToPdf qui utilise un moteur Webkit pour convertir les pages HTML au format PDF.

  2. Ecrivez un petit aide pour lire une vue et convertissez-la en chaîne HTML (mvcContext est this.HttpContext). Le remplacement est facultatif bien sûr !:

     public static ssortingng RenderViewToSsortingng(HttpContextBase mvcContext, ssortingng area, ssortingng controllerName, ssortingng viewName, object model) { var context = System.Web.HttpContext.Current; var contextBase = mvcContext; var routeData = new RouteData(); if (area == null) area = ""; routeData.DataTokens.Add("area", area); routeData.Values.Add("controller", controllerName); var controllerContext = new ControllerContext(contextBase, routeData, new EmptyController()); var razorViewEngine = new RazorViewEngine(); var razorViewResult = razorViewEngine.FindView(controllerContext, viewName, "", false); var writer = new SsortingngWriter(); var viewContext = new ViewContext(controllerContext, razorViewResult.View, new ViewDataDictionary(model), new TempDataDictionary(), writer); razorViewResult.View.Render(viewContext, writer); ssortingng hostAddress = context.Request.Url.Scheme + "://" + context.Request.Url.Authority; return writer.ToSsortingng() .Replace("src=\"/", "src=\"" + hostAddress + "/") .Replace(" 

Le travail acharné de ce qui précède a été effectué à partir de l’ adresse suivante :

  1. Créer une action MVC pour générer le document

     public ActionResult DownloadPDF(long CentreID) { var model = GetModel() IPechkin converter = Factory.Create(); byte[] result = converter.Convert(Helpers.PDF.RenderViewToSsortingng(this.HttpContext, "area", "controller", "action", model); MemoryStream outputStream = new MemoryStream(); outputStream.Write(result, 0, result.Length); outputStream.Position = 0; return File(outputStream, "application/pdf", "filename.pdf"); } 

Je viens d’utiliser wkhtmltopdf, pour créer la mise en page en HTML et ensuite, je le convertis en pdf.

Facile, personnalisable, génial comme l’enfer 🙂

Réponse très tardive, mais j’ai trouvé que l’URL suivante m’a aidé à obtenir rapidement mes résultats:

(Assurez-vous de faire référence à la DLL iTextSharp en utilisant les packages Nuget)

https://www.aspsnippets.com/Articles/Export-Grid-Html-Table-data-from-database-to-PDF-file-using-iTextSharp-in-ASPNet-MVC.aspx

EDIT C’est le code que j’ai utilisé pour rendre la table un peu différente (c’est aussi du paysage:

 public ssortingng GetCssForPdf() { ssortingng css = ""; css = "th, td" + "{" + "font-family:Arial; font-size:10px" + "}"; return css; } [HttpPost] [ValidateInput(false)] public FileResult Export(ssortingng GridHtml) { ssortingng webgridstyle = GetCssForPdf(); ssortingng exportData = Ssortingng.Format("{0}{1}", "", GridHtml); var bytes = System.Text.Encoding.UTF8.GetBytes(exportData); using (var input = new MemoryStream(bytes)) { var output = new MemoryStream(); var document = new iTextSharp.text.Document(PageSize.A4, 50, 50, 50, 50); var writer = PdfWriter.GetInstance(document, output); document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate()); Font headerFont = FontFactory.GetFont("Verdana", 10); Font rowfont = FontFactory.GetFont("Verdana", 10); writer.CloseStream = false; document.Open(); var xmlWorker = iTextSharp.tool.xml.XMLWorkerHelper.GetInstance(); xmlWorker.ParseXHtml(writer, document, input, System.Text.Encoding.UTF8); document.Close(); output.Position = 0; return File(output, "application/pdf", "Pipeline_Report.pdf"); //return new FileStreamResult(output, "application/pdf"); } } 

J’espère que cela aide quelqu’un d’autre aussi.