2013-02-27 44 views
7

chúng tôi đang tạo một ứng dụng ASP.Net MVC cần có khả năng tạo tệp PDF và hiển thị nó lên màn hình hoặc lưu ở nơi nào đó dễ dàng để người dùng truy cập. Chúng tôi đang sử dụng PdfSharp để tạo tài liệu. Khi đã hoàn tất, làm cách nào để người dùng lưu tài liệu hoặc mở tài liệu đó trong trình đọc? Tôi đặc biệt bối rối vì PDF được tạo phía máy chủ nhưng chúng tôi muốn nó hiển thị phía máy khách.Làm cách nào để hiển thị tệp PDF bằng PdfSharp trong ASP.Net MVC?


Dưới đây là bộ điều khiển MVC để tạo ra các báo cáo mà chúng tôi đã viết cho đến nay:

public class ReportController : ApiController 
{ 
    private static readonly string filename = "report.pdf"; 

    [HttpGet] 
    public void GenerateReport() 
    { 
     ReportPdfInput input = new ReportPdfInput() 
     { 
      //Empty for now 
     }; 

     var manager = new ReportPdfManagerFactory().GetReportPdfManager(); 
     var documentRenderer = manager.GenerateReport(input); 
     documentRenderer.PdfDocument.Save(filename); //Returns a PdfDocumentRenderer 
     Process.Start(filename); 
    } 
} 

Khi điều này chạy, tôi nhận được một UnauthorizedAccessException tại documentRenderer.PdfDocument.Save(filename); nói rằng, Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied. Tôi cũng không chắc chắn điều gì sẽ xảy ra khi dòng Process.Start(filename); được thực hiện.

Đây là mã trong manager.GenerateReport(input):

public class ReportPdfManager : IReportPdfManager 
{ 
    public PdfDocumentRenderer GenerateReport(ReportPdfInput input) 
    { 
     var document = CreateDocument(input); 
     var renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always); 
     renderer.Document = document; 
     renderer.RenderDocument(); 

     return renderer; 
    } 

    private Document CreateDocument(ReportPdfInput input) 
    { 
     //Put content into the document 
    } 
} 

Trả lời

6

Tôi không quen với PDF sắc nét nhưng đối với MVC là chủ yếu được thực hiện thông qua xây dựng trong chức năng. Bạn cần lấy tài liệu pdf của bạn được biểu diễn dưới dạng một mảng byte. Sau đó, bạn chỉ cần sử dụng phương thức File của MVC để trả về trình duyệt và cho phép nó xử lý việc tải xuống. Có phương pháp nào trong lớp của họ để làm điều đó không?

public class PdfDocumentController : Controller 
{ 
    public ActionResult GenerateReport(ReportPdfInput input) 
    { 
     //Get document as byte[] 
     byte[] documentData; 

     return File(documentData, "application/pdf"); 
    } 

} 
+3

Có một mẫu web cho thấy cách lấy mảng byte và trả về cho người dùng không có MVC. Với MVC bạn chỉ cần mã để lấy mảng byte (từ luồng bộ nhớ, không cần tệp). Ví dụ: http://www.pdfsharp.net/wiki/Clock-sample.ashx –

+2

Đối với người dùng mới, điều đó trở nên hơi khó hiểu, vì vậy bạn (NickAlbrecht) bận tâm cập nhật câu trả lời để thực hiện chính xác điều như @PDFsharpTeam đã thêm liên kết trợ giúp. [** MemoryStream stream = new MemoryStream(); //// document.Save (stream, false); //// Byte [] documentBytes = stream.ToArray(); //// return File (documentBytes, "application/pdf"); **] (Nó đã giúp tôi rất nhiều. Cảm ơn bạn !!!) –

11

Sử dụng gợi ý Yarx và hướng dẫn PDFSharp Team, đây là mã chúng tôi đã kết thúc với:

Bộ điều khiển:

[HttpGet] 
public ActionResult GenerateReport(ReportPdfInput input) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     var manager = new ReportPdfManagerFactory().GetReportPdfManager(); 
     var document = manager.GenerateReport(input); 
     document.Save(stream, false); 
     return File(stream.ToArray(), "application/pdf"); 
    } 
} 

ReportPdfManager:

public PdfDocument GenerateReport(ReportPdfInput input) 
{ 
    var document = CreateDocument(input); 
    var renderer = new PdfDocumentRenderer(true, 
     PdfSharp.Pdf.PdfFontEmbedding.Always); 
    renderer.Document = document; 
    renderer.RenderDocument(); 

    return renderer.PdfDocument; 
} 

private Document CreateDocument(ReportPdfInput input) 
{ 
    //Creates a Document and puts content into it 
} 
+0

FYI: Dòng 'document.Save (stream, false)' lấy tham số 'false' để chỉ ra rằng' stream' không nên đóng như một tác dụng phụ của việc gọi 'Save'. Hành vi này là cần thiết để chúng ta có thể gọi 'stream.ToArray' trong dòng tiếp theo, và do đó khối' using' mà chúng ta đã sử dụng có thể hoạt động như mong đợi. – Kevin

+0

Tôi đã tải xuống và tham chiếu DLL nhưng nó nói rằng nó không thể tìm thấy ReportPdfInput ..? – Murphybro2

+0

@ Murphybro2 'ReportPdfInput' là một lớp chúng tôi đã viết có chứa tất cả thông tin cần thiết để hiển thị tệp PDF mà chúng tôi muốn. Nó không phải là một phần của thư viện. Xin lỗi vì sự nhầm lẫn! – Kevin

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