2009-04-22 46 views
68

Tôi muốn gọi hành động trên bộ điều khiển. Yêu cầu bộ điều khiển lấy dữ liệu từ mô hình. Chế độ xem sau đó chạy và tạo một tệp PDF. Ví dụ duy nhất tôi đã tìm thấy là trong một bài viết của Lou http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action. Mã của anh ấy rất tao nhã. Chế độ xem đang sử dụng ITextSharp để tạo tệp PDF. Nhược điểm duy nhất là ví dụ của ông sử dụng Spark View Engine. Có cách nào để làm một điều tương tự với công cụ xem chuẩn của Microsoft không?Asp.Net MVC cách xem để tạo PDF

+8

Sử dụng công cụ xem Spark là một nhược điểm? Tôi bị thương. :) – loudej

+0

Kiểm tra điều này, RazorPDF: http://www.nyveldt.com/blog/post/Introducing-RazorPDF –

+0

Mô tả chi tiết về cách thực hiện trong ASP.NET MVC với PhantomJS được đăng nhập tại đây: http: // zizhujy.com/blog/post/2014/07/29/Use-PhantomJS-To-Create-WebPage-to-PDF-Converter.aspx. Và một ví dụ trực tuyến áp dụng các bước của bài đăng blog là ở đây: http://zizhujy.com/en-US/PDFConverter. Điều này hoạt động tuyệt vời miễn là trang cho phép truy cập ẩn danh. –

Trả lời

19

câu trả lời cuối cùng của chúng tôi cho vấn đề này là sử dụng Rotativa.

Nó kết thúc tốt đẹp các WKhtmltopdf.exe như một số các giải pháp khác, nhưng đó là bởi đến nay các đơn giản nhất để sử dụng mà tôi đã tìm thấy

tôi đã đi và lên bình chọn tất cả các câu trả lời khác mà cũng giải quyết vấn đề tốt, nhưng đây là những gì chúng tôi sử dụng để giải quyết vấn đề đặt ra trong câu hỏi trên. Nó khác với các câu trả lời khác.

Đây là Rotativa Tutorial.

sau khi bạn cài đặt nó, đây là tất cả nhu cầu của bạn

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

Rất Rất đơn giản.

+2

Tại sao các downvote, tôi bối rối. Đây là cách chúng tôi giải quyết vấn đề ngay bây giờ, vì vậy tôi đã cập nhật câu hỏi để giữ cho nó hiện tại. Tôi không hiểu. Làm thế nào tôi có thể làm tốt hơn nếu tôi không hiểu tại sao tôi bị bỏ phiếu xuống? –

+2

Một lần nữa bỏ phiếu xuống mà không có bình luận ... đây là câu trả lời chúng tôi sử dụng để giải quyết vấn đề. Tôi đã nỗ lực nhiều hơn để quay lại và cập nhật câu hỏi với câu trả lời hiện tại hơn. Tôi đang bối rối như thế nào mà tỷ lệ bỏ phiếu xuống, trừ khi bạn chỉ không thích rotativa. –

+0

Brown Câu trả lời hay với mã hoàn toàn không có, đó là những gì chúng ta cần trong thế kỷ 21. 1 cho cả hai ý kiến ​​và câu trả lời..thanks heaps – Learner

81

Tôi sử dụng iTextSharp để tạo PDF động trong MVC. Tất cả những gì bạn cần làm là đưa PDF của bạn vào một đối tượng Stream và sau đó ActionResult của bạn trả về một FileStreamResult. Tôi cũng đặt bố cục nội dung để người dùng có thể tải xuống.

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

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

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

Tôi cũng có mã cho phép tôi lấy mẫu PDF, viết văn bản và hình ảnh cho v.v. (nếu bạn muốn làm điều đó).

  • Lưu ý: bạn phải thiết lập vị trí Suối đến 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

. Tôi đã tự hỏi làm thế nào chúng ta có thể làm điều đó. – MikeJ

+0

Chỉ cần những gì tôi đang tìm kiếm –

+5

Tôi rất thích xem ví dụ về những gì mà "lớp pdf" trong ví dụ này trông giống như hoặc nhận được một số gợi ý về cách thực hiện nó? – jesperlind

5

Tôi cũng đã xem qua http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3 này. Thật dễ dàng và nhanh chóng, và phù hợp tốt với MVC. Tuy nhiên, nhược điểm duy nhất cho đến nay là nó không phải là khá linh hoạt bạn muốn có một bố trí phong nha, ví dụ, bạn không có nhiều kiểm soát với bảng, và biên giới tế bào thông qua html. Nó hỗ trợ loại trang mới, nhưng bạn sẽ phải áp dụng một bản vá cho iTextsharp.

+0

Cảm ơn, điều này đã làm việc cho tôi! –

2

Tôi vừa sử dụng wkhtmltopdf, để tạo bố cục bằng html và sau đó, tôi chuyển đổi nó thành pdf.

Dễ dàng, tùy chỉnh, tuyệt vời như địa ngục :)

+2

Tôi giả định bạn có nghĩa là wkhtmltopdf – raider33

5

Tạo bố cục in html và in sau đó vào pdf là cách nhanh nhất.

Html vào chuyển đổi pdf được cung cấp bởi phantomjs, wkhtmltopdf hoặc jsreport

jsreport cung cấp tích hợp trực tiếp với tầm asp.net MVC, nơi bạn có thể chỉ cần đánh dấu hành động điều khiển với thuộc tính và nó sẽ in pdf thay vì html cho bạn.

Thông tin thêm về blog post

Disclaimer này: Tôi là tác giả của jsreport

+1

Nếu bạn đang sử dụng MVC, Rotativa thực sự là một trình bao bọc đẹp cho wkhtmltopdf ... siêu dễ sử dụng, chúng tôi đã chuyển đổi sang nó để giải quyết vấn đề này ngay bây giờ ... Đã xảy ra sự cố với hình ảnh, nhưng có một cách giải quyết khác trên SO –

+0

Có, Rorativa là một trình bao bọc đẹp. jsreport là một máy chủ báo cáo xử lý hình ảnh hoặc giữ lịch sử báo cáo cho bạn. –

4

Đây là một câu hỏi cũ nhưng một trong đó là vẫn có liên quan và tôi nghĩ rằng tôi chỉ muốn chia sẻ những gì tôi đã thực hiện mà hoạt động tốt .

  1. Cài đặt gói NuGet dựa trên WkHtmlToPdf sử dụng công cụ Webkit để chuyển đổi trang HTML sang PDF.

  2. Viết một chút trợ giúp để đọc chế độ xem và chuyển đổi nó thành chuỗi HTML (mvcContext is this.HttpContext). Thay thế là tùy chọn của khóa học!:

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

Các công việc khó khăn của các bên trên là từ đây: http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571

  1. Tạo một MVC hành động để tạo ra các tài liệu

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

Đối với những người làm theo hướng dẫn này và có lỗi về 'IPechkin' và 'Nhà máy' những điều đó là bởi vì nó không được chấp nhận. Xin vui lòng đọc làm thế nào để cài đặt và thực hiện trên repo chính nó tại https://github.com/tuespetre/TuesPechkin. – chaintng

+0

Ngoài ra, sau khi bạn tải xuống 'ThirdPechkin' từ nuget, đừng quên tải xuống' TuesPechkin.Wkhtmltox.Win32' hoặc 'TuesPechkin.Wkhtmltox.Win64' vì nó không bao gồm khi tải xuống. – chaintng

+0

Đây phải là một trong những câu trả lời hàng đầu. Đã chính xác những gì tôi đang tìm kiếm và nó là mã nguồn mở. – Alao

0

Rất trễ trả lời, nhưng tôi phát hiện ra rằng các URL sau đã giúp tôi có được kết quả của tôi một cách nhanh chóng:

(Đảm bảo rằng bạn tham khảo với iTextSharp DLL bằng cách sử dụng các gói NuGet)

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

EDIT Đây là mã tôi sử dụng để làm bàn trông hơi khác một chút (Đây là cảnh quan cũng như:

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

Hy vọng điều này sẽ giúp người khác.

Các vấn đề liên quan