2

この質問にはおそらく簡単な答えがありますが、私は解決策を見つけることができないようです。

そのため、現在iTextSharpを使用してPDFを生成し、フォームの送信時にこのPDFをユーザーに送り返しています。ただし、このPDFを応答ストリームで送信する代わりに、ファイルへのリンク、つまり「送信していただきありがとうございます。ここをクリックしてPDFをダウンロードしてください」をレンダリングしたいと思います。

StackでほとんどのiTextSharpの質問を調べましたが、すべて応答ストリームを介して送信することに関連しています。

ありがとう

    [HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {

        // Create PDF
        var doc = new Document();
        MemoryStream memoryStream = new MemoryStream();

        PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

        doc.Open();
        doc.Add(new Paragraph("First Paragraph"));
        doc.Add(new Paragraph("Second Paragraph"));
        doc.Close();

        byte[] docData = memoryStream.GetBuffer(); // get the generated PDF as raw data

        // write the data to response stream and set appropriate headers:

        Response.AppendHeader("Content-Disposition", "attachment; filename=test.pdf");
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(docData);

        Response.End();

        return View();

    }
4

1 に答える 1

4

これは iTextSharp から完全に独立しています。

作成したバイト配列をサーバーのどこかに保存し、別のアクションを作成して、生成されたデータを何らかの ID で後で取得し、ユーザーに提供する必要があります。

ファイルシステムに保存することも、セッションまたは TempData に保存することもできます。

public ActionResult Index(FormCollection formCollection)
{
    // Create PDF ...
    byte[] docData = memoryStream.GetBuffer(); 
    // create id and store data in Session
    string id = Guid.NewGuid().ToString();
    Session[id] = docData;
    return View("Index", id);
}

ビューIndex.cshtmlで、string をモデルタイプとして設定し、ダウンロード リンクを生成します。

@model string
@Html.ActionLink("Download pdf", "Download", "Controller", new { id = Model })

そして、あなたの新しいダウンロードアクション:

public ActionResult Download(string id) {
    var docData = (byte[])Session[id];

    if (docData == null) 
      return HttpNotFound();

    // clear data from session
    Session[id] = null;
    // a simpler way of returning binary data with mvc
    return File(docData, "application/pdf", "test.pdf");
}
于 2012-11-21T20:28:53.957 に答える