2016-03-30 14 views
2

ボタンをクリックすると、サーバー上にPDFを作成し、ブラウザの新しいタブで開きます。 PDFはうまく生成されますが、ブラウザをダウンロードせずに開くことはできません。 IEではファイルを認識せず、Chromeではダウンロードを促します。どんな助けもありがとうございます。私のコードは以下の通りです:PDFサーバー側を作成し、新しいブラウザのウィンドウまたはタブで開く

C#のコントローラー、それはまだ新しいタブで開くのではなく、ファイルをダウンロードするよう

public string CreateCustomReport() 
{ 
    var doc = new Document(); 
    MemoryStream m = new MemoryStream(); 

    try 
    { 
     string query = ""; 
     PdfWriter.GetInstance(doc, m).CloseStream = false; 

     SqlConnection conn = new SqlConnection(conn); 
     conn.Open(); 

     SqlCommand cmd = new SqlCommand(query, conn); 
     cmd.CommandType = CommandType.Text; 
     SqlDataReader sqdr = cmd.ExecuteReader(); 

     doc.Open(); 
     PdfPTable table = new PdfPTable(4); 
     PdfPCell cell = new PdfPCell(new Phrase(customTitle)); 
     cell.Colspan = 4; 
     table.AddCell(cell); 
     table.AddCell(groupBy); 
     table.AddCell(col1); 
     table.AddCell(col2); 
     table.AddCell("Event"); 
     while (sqdr.Read()) 
     { 
      table.AddCell(Convert.ToString(sqdr["GroupBy"].ToString())); 
      table.AddCell(Convert.ToString(sqdr["Col1"].ToString())); 
      table.AddCell(Convert.ToString(sqdr["Col2"].ToString())); 
      table.AddCell(Convert.ToString(sqdr["Events"].ToString())); 
     } 

     doc.Add(table); 
     doc.Close(); 
    } 
    catch (Exception) 
    { 

    } 
    return System.Convert.ToBase64String(m.ToArray()); 
} 

jQueryの

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(params), 
    url: '@Url.Action("CreateCustomReport")', 
    error: function(error) { 
     debugger; 
     alert("Search failed."); 
    }, 

    success: function(data) { 
     var openpdf = $('<a id="openpdf" download="Report.pdf" href="data:application/pdf;base64,' + data + '" target="new">'); 
     $('body').append(openpdf); 
     document.getElementById("openpdf").click(); 
     $("#openpdf").remove(); 


    } 
}); 

答えて

0

ナバの答えはOPの問題を解決していません。そのためには、レスポンスヘッダーを変更する必要があります。

public FileResult CreateCustomReport() 
{ 
    ... 
    Response.AppendHeader("Content-Disposition", "inline; filename=Out.pdf"); 
    return File(m.ToArray(), "application/pdf"); 
} 

そして、あなたのビューで:

:あなたはそれがクリックされた後、ダウンロードリンクを非表示にする場合

<a href="@Url.Action("CreateCustomReport")" target="_blank">Download PDF</a>

は、あなたは自分のアンカーにonclickを追加することができます<a href="@Url.Action("CreateCustomReport")" target="_blank" onclick="this.style.display='none'">Download PDF</a>

編集:私は他の答えにコメントすることはできませんが、あなたのコメントから読んでくださいねPOSTリクエストによる引数の受け渡しPOSTでこれを本当に行う必要がある場合は、隠しフォームとtarget="_blank"属性を使用できます。あなたがGETでそれを行うことができれば、あなたはURLにデータを埋め込むことができ、単純なアンカータグを使うことができます。

3

生成されたPDFのBase64エンコード表現を返し、その文字列を使用してリンクを作成し、hrefインラインを設定します。次に、リンクをクリックします。非常に複雑に思えます。

私は別のアプローチを取るだろう...

は、サーバーが(私はPDFWriterの[]はバイトにアクセスする方法を持っていると仮定しています)PDFバイトを返しておいてください、そして、

public ActionResult CreateCustomReport() 
{ 
    byte[] contents = doc.GetBytes(); //????? 
    return File(contents, "application/pdf", "test.pdf"); 
} 

AJAX呼び出しを使用して、代わりにURLにユーザーをリダイレクトしません:

<a href="@Url.Action("CreateCustomReport")" target="_blank">Download PDF</a> 

このアプローチではJavaScriptに依存せず、ダウンロード/ファイルを保存するようユーザーにプロンプ​​トを表示せずにIEやChromeで動作します。 PDFは新しいブラウザウィンドウ/タブに表示されます。

+0

これははるかにクリーンですが、PDFはユーザーの入力に基づいて生成され、ユーザーがボタンをクリックして送信すると返信する必要があるため、自分のやり方と同じようにしています。私は、それらが関連しているとは思わなかったので、引数をCreateCustomReportメソッドに除外しました。 –

関連する問題