2009-04-22 19 views
68

Ich möchte eine Aktion auf einem Controller aufrufen. Lassen Sie den Controller die Daten vom Modell abrufen. Die Ansicht wird ausgeführt und generiert eine PDF-Datei. Das einzige Beispiel, das ich gefunden habe, ist in einem Artikel von Lou http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action. Sein Code ist sehr elegant. Die Ansicht verwendet ITextSharp zum Generieren der PDF. Der einzige Nachteil ist, dass sein Beispiel die Spark View Engine verwendet. Gibt es eine Möglichkeit, eine ähnliche Sache mit der Standard-Microsoft-View-Engine zu machen?Asp.Net MVC, wie zu sehen, um PDF zu generieren

+8

Die Verwendung der Spark-View-Engine ist ein Nachteil? Ich bin verwundet. :) – loudej

+0

Überprüfen Sie dies, RazorPDF: http://www.nyveldt.com/blog/post/Introducing-RazorPDF –

+0

Eine detaillierte Beschreibung, wie es in ASP.NET MVC mit PhantomJS ist hier protokolliert: http: // zizhujy.com/blog/post/2014/07/29/Use-PhantomJS-To-Create-WebPage-to-PDF-Converter.aspx. Und ein Online-Beispiel angewendet die Schritte des Blog-Post ist hier: http://zizhujy.com/en-US/PDFConverter. Dies funktioniert sehr gut, solange die Seite anonymen Besuch erlaubt. –

Antwort

19

Unsere endgültige Antwort auf dieses Problem war, Rotativa zu verwenden.

Es wickelt die WKhtmltopdf.exe wie einige der anderen Lösungen, aber es ist bei weitem die am einfachsten zu bedienen, dass ich

ging ich gefunden habe und bis stimmten alle anderen Antworten, die auch gut, das Problem lösen, aber das haben wir benutzt, um das in der obigen Frage gestellte Problem zu lösen. Es ist anders als die anderen Antworten.

Hier ist ein Rotativa Tutorial.

, nachdem Sie es installiert haben, das ist alles, um Ihren Bedarf

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

Sehr sehr einfach.

+2

Warum der Downvote, ich bin verwirrt. So lösen wir das Problem jetzt, also habe ich die Frage aktualisiert, um sie aktuell zu halten. Ich verstehe nicht. Wie kann ich es besser machen, wenn ich nicht verstehe, warum ich die Stimmen bekommen habe? –

+2

Wieder eine Abstimmung ohne Kommentar ... das ist die Antwort, mit der wir das Problem gelöst haben. Ich habe mir extra Mühe gegeben, zurückzukommen und die Frage mit der aktuelleren Antwort zu aktualisieren. Ich bin verwirrt, wie das eine Down-Vote bewertet, es sei denn, du magst Rotativa einfach nicht. –

+0

Brown Schöne Antwort mit absolut keinem Code, das brauchen wir im 21. Jahrhundert. +1 für beide Kommentare und Antwort..thanks haufen – Learner

81

Ich benutze iTextSharp, um dynamische PDFs in MVC zu generieren. Alles, was Sie tun müssen, ist, Ihre PDF-Datei in ein Stream-Objekt einzufügen und dann Ihr ActionResult ein FileStreamResult zurückzugeben. Ich stelle auch die Inhaltsdisposition so ein, dass der Benutzer sie herunterladen kann.

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

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

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

Ich habe Code auch, die mir eine Vorlage PDF nehmen können, schreiben Sie Text und Bilder, um es usw. (wenn Sie das tun wollte).

  • Hinweis: Sie müssen die Stream-Position setzen 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; 
} 
+0

netten Code verpackt. Ich habe mich gefragt, wie wir das machen könnten. – MikeJ

+0

Genau das, was ich gesucht habe –

+5

Ich würde gerne sehen, Beispiel, wie diese "pdf-Klasse" in dem Beispiel aussieht oder einige Hinweise, wie es zu implementieren? – jesperlind

5

ich auf diese http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3 auch kam. Es ist einfach und schnell und passt gut zu MVC.

Allerdings ist der einzige Nachteil bisher, dass es nicht sehr flexibel ist, Sie wollen ein anständiges Layout haben, zum Beispiel haben Sie nicht viel Kontrolle mit Tabelle und Zelle Grenzen durch HTML. Es unterstützt eine neue Seite, aber Sie müssen einen Patch auf iTextsharp anwenden.

+0

Danke, das hat für mich funktioniert! –

2

Ich habe gerade wkhtmltopdf verwendet, um das Layout in HTML zu erstellen und anschließend wandle ich es in pdf um.

Einfache, kundengerecht, fantastisch, wie die Hölle :)

+2

Ich nehme an, du meinst wkhtmltopdf – raider33

5

Erstellen von Layouts in HTML und Druck danach in pdf ist der schnellste Weg.

Html in PDF-Konvertierung wird durch phantomjs, wkhtmltopdf oder jsreport bereitgestellt

jsreport direkte Integration mit asp.net MVC Ansichten bietet, wo können Sie einfach markieren Controller-Aktion mit dem Attribut und es wird pdf statt html drucken für Sie.

Mehr zu diesen blog post

Disclaimer: Ich bin der Autor der jsreport

+1

Wenn du MVC verwendest, ist Rotativa ein wirklich netter Wrapper für wkhtmltopdf ... super einfach zu bedienen, wir haben es konvertiert, um dieses Problem jetzt zu lösen ... Es gab ein Problem mit Bildern, aber es gibt einen Workaround auf SO –

+0

Ja, Rorativa ist ein nettes Wrapper. jsreport ist eher ein Berichtsserver, der Bilder verarbeitet oder den Protokollverlauf für Sie speichert. –

4

Dies ist eine alte Frage, aber eine, die immer noch relevant ist, und ich dachte, ich würde nur teilen, was ich realisiert habe, was gut funktioniert .

  1. NuGet Paket TuesPechkin installieren - eine Gabel in der Pechkin Bibliothek auf wkhtmltopdf basiert, die ein Webkit-Engine verwendet HTML-Seiten in PDF zu konvertieren.

  2. Schreiben Sie einen kleinen Helfer, um eine Ansicht zu lesen und in eine HTML-Zeichenfolge zu konvertieren (mvcContext is this.HttpContext). Der Ersatz ist natürlich optional!:

    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() { } 
    } 
    

Die harte Arbeit der von hier oben waren: http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571

  1. eine MVC-Aktion erstellen das Dokument

    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"); 
    } 
    
  2. zu erzeugen
+0

Für diejenigen, die diesem Tutorial folgen und Fehler bei 'IPechkin'- und' Factory'-Dingen haben, liegt es daran, dass es bereits veraltet ist. Bitte lesen Sie, wie Sie den Repo unter https://github.com/tuespetre/TuesPechkin installieren und implementieren. – chaintng

+0

Und auch, nachdem Sie 'DienstagPechkin' von nugget herunterladen, vergessen Sie nicht,' DienstagPechkin.Wkhtmltox.Win32' oder 'DienstagPechkin.Wkhtmltox.Win64' zu downloaden, da es nicht beim Download enthalten ist. – chaintng

+0

Dies sollte eine der besten Antworten sein. War genau das, was ich suchte und es ist Open Source. – Alao

0

Sehr späte Antwort, aber ich fand, dass die folgende URL hat mir geholfen, meine Ergebnisse schnell zu erhalten:

(Stellen Sie sicher, dass Sie durch die Nutzung der Nuget Pakete zum iTextSharp DLL Referenz)

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

EDIT Dies ist der Code, den ich die Tabelle ein wenig anders aussehen verwendet (Dies ist Landschaft auch:

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"); 
      } 
     } 

Hoffe, das hilft auch jemand anderen.

Verwandte Themen