2013-08-09 5 views
5

現在、MVC4でRazorPDFを使用してPDFを組み立てて表示しています。また、ビューを返すと同時にPDFファイルをファイルシステムに保存します。RazorPDFは、MVC4のサーバーディレクトリにPDFファイルを保存します。

コントローラアクションのコードの次の行は、ビューを呼び出している:

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

これを解決しましたか?私は同じ問題を抱えている。 – Gmorken

+0

私はまだ同じ問題を抱えています。解決策はまだありません。 –

+0

この記事を見たことがありますかhttp://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-mvc? 'PdfResult()'を呼び出す前に 'Content-Disposition'ヘッダを追加することは可能です。 –

答えて

4

やっとRazorPDFのコードベースメソッドをレンダリング変更することにより、ディレクトリシステムにPDFファイルを書き込むことができました。以下に示すよう

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

溶液をFileStreamオブジェクトに関連付けられた別のPDFWriterのオブジェクトを作成することであった:次いで

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

IはRendor方法が応答ストリームに関連付けられているPDFWriterのオブジェクトを作成します

 fileStream.Close(); 

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

私は基本的に自分のプロジェクトにRazorPDFのPdfResultとPdfViewクラスを組み込み、大幅に変更する必要がありました:オブジェクトを閉じましたコード。その理由は、pdfをユーザーに送信した電子メールクラスへの呼び出しを組み込む必要があったためです。

フルRenderメソッドが下に表示されます。

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(); 

    } 

この機能は、何らかの形で、現在のRazorPDFプロジェクトに組み込まれた場合、それはいいだろう。

+0

これは素晴らしいです。良い仕事 – Gmorken

+0

あなた自身の応答も答えとして受け入れることができます。私に答えているようです。 –

1

なぜWebリクエストを介してストリームを取得するだけではないのですか?

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

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、自分の投稿の下にコメントを残してください。自分の投稿にいつでもコメントすることができます。そして、十分な評判があれば、投稿にコメントすることができます。 – Bruce

関連する問題