如何最好地在ASP.NET MVC中将网格导出为PDF

时间:2013-03-19 16:35:28

标签: javascript asp.net-mvc asp.net-mvc-4 infragistics iggrid

我不知道这一定是重要的,但我正在使用Infragistics iggrid为我的网格和他们的Reports东西导出为PDF。

我遇到的根本问题是我要导出的数据是在浏览器中,我希望我不必创建要下载的服务器端文件。我们在屏幕上有一个用户点击下载PDF的图标。

所以我在客户端上做的是收集所有数据。这必须在客户端完成,因为我想在用户对数据进行排序,过滤和按列排序时导出数据(否则我只能收集数据服务器端,这会使这更简单)。然后我通过POST将数据发送到服务器。

在服务器端,我生成PDF文件。现在,显然,我可以保存PDF服务器端并重定向到生成的文件,但这增加了我宁愿避免的临时文件的维护(但最糟糕的情况是,我可以去那里。现在只需钓鱼选项)

我尝试返回数据base64编码然后执行:

window.open("data:application/pdf;base64," + encodedData);

这不起作用(至少在IE中),因为URL限制有点超过2K。

我尝试在这里使用downloadDataURI javascript函数:http://code.google.com/p/download-data-uri/

但这似乎只适用于Chrome(即使在评论了webkit检查后),我显然也不够聪明,无法找出原因。

我确定我错过了一些不需要创建服务器端文件的明显可能性,但我只是没有看到它。 (免责声明:我的女儿今天早上可怕地把我吵醒了,所以答案可能非常微不足道,明天我大脑工作的时候会感到愚蠢。)

1 个答案:

答案 0 :(得分:2)

  

在服务器端,我生成PDF文件。现在,显然,我可以   保存PDF服务器端并重定向到生成的文件,但那   添加临时文件的维护,我宁愿避免(但是   最坏的情况,我可以去那里。现在就去钓鱼吧。

您无需将其保存在服务器上。您可以简单地将PDF文件(我假设您将某种Stream或byte [])传输给用户。您需要做的就是

 Response.ContentType = "application/pdf";
 Response.AddHeader("Content-Disposition", "filename.pdf");
 Response.BinaryWrite(bytes);
 Response.Flush();
 Response.Close();
 Response.End();

这将提示用户保存文件或在Adobe Reader中打开它。该文件根本不会在服务器上创建。