Asp.Net MVC comment obtenir view pour générer PDF

je voudrais appeler une action d'un contrôleur. Demandez au contrôleur de récupérer les données du modèle. La vue s'exécute alors et génère un 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 le moteur Spark View. Est-il un moyen de faire quelque chose de similaire avec le moteur Microsoft view standard?

69
demandé sur Eric Brown - Cal 2009-04-23 01:59:42

7 réponses

j'utilise iTextSharp pour générer des PDF dynamiques dans MVC. Tout ce que vous devez faire est de mettre votre PDF dans un objet Stream et ensuite votre ActionResult retourner un FileStreamResult. J'ai aussi configuré le contenu-disposition pour que l'utilisateur puisse le télécharger.

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

    HttpContext.Response.AddHeader("content-disposition", 
    "attachment; filename=form.pdf");

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

j'ai aussi du code qui me permet de prendre un modèle PDF, y écrire du texte et des images etc (Si vous voulez le faire).

  • Note: vous devez régler la position du flux à 0.
private Stream GeneratePDF()
{
    //create your pdf and put it into the stream... pdf variable below
    //comes from a class I use to write content to PDF files

    MemoryStream ms = new MemoryStream();

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

    return ms;
}
81
répondu David 2009-04-22 22:19:48

notre dernière réponse à ce problème était d'utiliser Rotativa .

il conclut le WKhtmltopdf.exe comme certains des autres solutions, mais c'est de loin le plus facile à utiliser que j'ai trouvé

j'ai voté toutes les autres réponses qui résolvent aussi bien le problème, mais c'est ce que nous avons utilisé pour résoudre le problème posé dans la question ci-dessus. Il est différent de l'autre des réponses.

voici un Rotativa Tutoriel .

après l'installation, 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.

20
répondu Eric Brown - Cal 2016-08-11 15:53:27

je suis aussi tombé sur ce http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3 . Il est facile et rapide, et s'adapte bien avec MVC.

cependant, le seul inconvénient jusqu'à présent est qu'il n'est pas tout à fait flexible que vous voulez avoir une mise en page décente, par exemple, vous n'avez pas beaucoup de contrôle avec la table, et les frontières de cellules par html. Il sorte de supports force nouvelle page, mais vous devrez appliquer un patch à iTextsharp.

5
répondu Sean Dong 2012-05-30 08:55:16

créer la mise en page en html et imprimer ensuite en pdf est le moyen le plus rapide.

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

jsreport fournit une intégration directe avec asp.net vues mvc, où vous pouvez juste marquer l'action du contrôleur avec l'attribut et il imprimera pdf au lieu de html pour vous.

plus sur ce billet de blog

avertissement: je suis l'auteur de jsreport

5
répondu Jan Blaha 2014-04-20 17:58:20

C'est une vieille question, mais elle est toujours pertinente et j'ai pensé que je voudrais juste partager ce que j'ai mis en œuvre qui fonctionne bien.

  1. installez NuGet package TuesPechkin - une fourchette dans la bibliothèque Pechkin basée sur WkHtmlToPdf qui utilise un moteur Webkit pour convertir les pages HTML en PDF.

  2. écrivez un petit helper pour lire une vue et la convertir en chaîne HTML (mvcContext est ceci.HttpContext). Le remplacer est facultatif bien sûr!:

    public static string RenderViewToString(HttpContextBase mvcContext, string area, string controllerName, string 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 StringWriter();
        var viewContext = new ViewContext(controllerContext,
                                    razorViewResult.View,
                                    new ViewDataDictionary(model),
                                    new TempDataDictionary(),
                                    writer);
        razorViewResult.View.Render(viewContext, writer);
    
        string hostAddress = context.Request.Url.Scheme + "://" + context.Request.Url.Authority;
    
        return writer.ToString()
                     .Replace("src=\"/", "src=\"" + hostAddress + "/")
                     .Replace("<link href=\"/", "<link href=\"" + hostAddress + "/");                         
    }
    
    class EmptyController : ControllerBase
    {
        protected override void ExecuteCore() { }
    }
    

le dur labeur de ce qui précède était d'ici: http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571

  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.RenderViewToString(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");
    }
    
5
répondu McGaz 2014-10-29 17:45:58

je viens d'utiliser wkhtmltopdf, pour créer la mise en page en html et ensuite, je la convertis en pdf.

Facile, personnalisable, terrifiant comme l'enfer :)

2
répondu NicoJuicy 2014-08-20 07:21:48

Très Retard de Réponse, mais j'ai trouvé que l'URL suivante m'a aidé à obtenir mes résultats rapidement :

(assurez-vous de faire référence à la DLL iTextSharp en utilisant les paquets 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 faire la table look un peu différent(C'est le paysage ainsi:

public string GetCssForPdf()
        {
            string css = "";

            css = "th, td" +
                   "{" +
                       "font-family:Arial; font-size:10px" +
                    "}";

            return css;
        }

[HttpPost]
        [ValidateInput(false)]
        public FileResult Export(string GridHtml)
        {
            string webgridstyle = GetCssForPdf();

            string exportData = String.Format("<html><body>{0}{1}</body></html>", "<style>" + webgridstyle + "</style>", 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 ça aidera aussi quelqu'un d'autre.

0
répondu AxleWack 2018-03-08 13:49:48