現在、MVC4でRazorPDFを使用してPDFを組み立てて表示しています。また、ビューを返すと同時にPDFファイルをファイルシステムに保存します。RazorPDFは、MVC4のサーバーディレクトリにPDFファイルを保存します。
コントローラアクションのコードの次の行は、ビューを呼び出している:
return new PdfResult(claims, "PDF");
現在、MVC4でRazorPDFを使用してPDFを組み立てて表示しています。また、ビューを返すと同時にPDFファイルをファイルシステムに保存します。RazorPDFは、MVC4のサーバーディレクトリにPDFファイルを保存します。
コントローラアクションのコードの次の行は、ビューを呼び出している:
return new PdfResult(claims, "PDF");
やっと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プロジェクトに組み込まれた場合、それはいいだろう。
これは素晴らしいです。良い仕事 – Gmorken
あなた自身の応答も答えとして受け入れることができます。私に答えているようです。 –
なぜWebリクエストを介してストリームを取得するだけではないのですか?
string razorPdfUrl="http://...";
var req = HttpWebRequest.Create(RazorPDFURL);
using (Stream pdfStream = req.GetResponse().GetResponseStream())
{
...
}
これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、自分の投稿の下にコメントを残してください。自分の投稿にいつでもコメントすることができます。そして、十分な評判があれば、投稿にコメントすることができます。 – Bruce
これを解決しましたか?私は同じ問題を抱えている。 – Gmorken
私はまだ同じ問題を抱えています。解決策はまだありません。 –
この記事を見たことがありますかhttp://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-mvc? 'PdfResult()'を呼び出す前に 'Content-Disposition'ヘッダを追加することは可能です。 –