我尝试在服务器上创建PDF,然后在单击按钮时在浏览器的新选项卡中打开它。 PDF生成正常,但我无法通过浏览器打开它而无需下载。在IE中,它无法识别该文件,在Chrome中它会提示用户下载。任何帮助表示赞赏。我的代码如下:
C#Controller
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 :(得分:4)
您正在返回生成的PDF的Base-64编码表示,然后使用该字符串创建链接并将href设置为内联。然后触发链接上的单击。看起来很复杂。
我会采取不同的方法......
让服务器返回PDF字节(我假设PdfWriter有办法访问byte []):
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将显示在新的浏览器窗口/选项卡中。
答案 1 :(得分:0)
Nava的回答并没有解决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中,然后您就可以使用简单的锚标记。