2013-08-09 16 views
5

Tôi hiện đang lắp ráp và hiển thị tệp PDF bằng RazorPDF trong MVC4 và muốn lưu tệp PDF vào hệ thống tệp cùng lúc tôi trả lại chế độ xem.RazorPDF lưu tệp pdf vào thư mục máy chủ trong MVC4

Các dòng mã sau đây trong hành động điều khiển được gọi xem:

return new PdfResult(claims, "PDF"); 
+1

Bạn đã giải quyết vấn đề này chưa? Tôi đang gặp vấn đề tương tự. – Gmorken

+0

Tôi vẫn gặp sự cố tương tự. Chưa có giải pháp nào. –

+0

Bạn đã xem bài đăng này http://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-mvc? Bạn có thể thêm tiêu đề 'Content-Disposition' trước khi gọi' PdfResult() '- cho dù nó hoạt động hay không vẫn còn để được nhìn thấy. –

Trả lời

4

tôi đã có thể cuối cùng đã viết pdf với hệ thống thư mục bằng cách thay đổi cơ sở mã của RazorPDF Phương thức render. Phương pháp Rendor tạo ra một đối tượng PdfWriter được kết hợp với dòng phản hồi:

 // Associate output with response stream 
     var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream); 
     pdfWriter.CloseStream = false; 

Giải pháp là để tạo ra một đối tượng PdfWriter rằng có liên quan đến một đối tượng FileStream như minh họa dưới đây:

 // Create the pdf file in the directory system 
     var fileStream = new FileStream(myPdfFilePath, FileMode.Create); 
     var pdfWriter2 = PdfWriter.GetInstance(document, fileStream); 

tôi sau đó đóng các đối tượng:

 fileStream.Close(); 

     pdfWriter.Close(); 
     pdfWriter2.Close(); 

Tôi đã cơ bản kết hợp các lớp PdfResult và PdfView của RazorPDF vào dự án của riêng tôi và thay đổi đáng kể mã. Lý do là vì tôi cũng phải mã hóa các cuộc gọi đến một lớp email đã gửi bản pdf cho người dùng.

Phương pháp đầy đủ Render được hiển thị dưới đây:

public void Render(ViewContext viewContext, TextWriter writer) 
    { 
     // generate view into string 
     var sb = new System.Text.StringBuilder(); 
     TextWriter tw = new System.IO.StringWriter(sb); 
     myResult.View.Render(viewContext, tw); 
     var resultCache = sb.ToString(); 

     // detect itext (or html) format of response 
     XmlParser parser; 
     using (var reader = GetXmlReader(resultCache)) 
     { 
      while (reader.Read() && reader.NodeType != XmlNodeType.Element) 
      { 
       // no-op 
      } 

      if (reader.NodeType == XmlNodeType.Element && reader.Name == "itext") 
       parser = new XmlParser(); 
      else 
       parser = new HtmlParser(); 
     } 

     // Create a document processing context 
     var document = new Document(); 
     document.Open(); 

     // Associate output with response stream 
     var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream); 
     pdfWriter.CloseStream = false; 

     // Create the pdf file in the directory system 
     var fileStream = new FileStream(myPdfFilePath, FileMode.Create); 
     var pdfWriter2 = PdfWriter.GetInstance(document, fileStream); 

     // this is as close as we can get to being "success" before writing output 
     // so set the content type now 
     viewContext.HttpContext.Response.ContentType = "application/pdf"; 

     // parse memory through document into output 
     using (var reader = GetXmlReader(resultCache)) 
     { 
      parser.Go(document, reader); 
     } 

     fileStream.Close(); 

     // Send an email to the claimant 
     Thread.Sleep(100); 
     if (File.Exists(myPdfFilePath)) 
     { 
      var subject = "PDF Documents"; 

      var body = Config.GetContent(ContentParams.CLAIM_DOCUMENT_EMAIL_BODY_TEXT); 

      bool success; 
      string errorMessage; 

      Email.Send(myEmailAddress, subject, body, out success, out errorMessage, myPdfFilePath); 
     } 

     pdfWriter.Close(); 
     pdfWriter2.Close(); 

    } 

Nó sẽ được tốt đẹp nếu khả năng này bằng cách nào đó đưa vào dự án RazorPDF hiện hành.

+0

Công trình này tuyệt vời. Làm tốt công việc – Gmorken

+0

Bạn cũng có thể chấp nhận câu trả lời của chính mình làm câu trả lời. Có vẻ câu trả lời cho tôi. –

1

tại sao không chỉ nhận luồng thông qua yêu cầu web tới url?

string razorPdfUrl="http://..."; 
var req = HttpWebRequest.Create(RazorPDFURL); 
using (Stream pdfStream = req.GetResponse().GetResponseStream()) 
{ 
    ... 
} 
+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng mình và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bài đăng bất kỳ. – Bruce

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