在MVC控制器函数中,我有以下代码:
EvoPdf.PdfConverter converter = new EvoPdf.PdfConverter();
converter.LicenseKey = "e/MyLicenceKey+uT05+X65eb67e3t7Q==";
converter.PdfDocumentOptions.BottomMargin = margin;
converter.PdfDocumentOptions.TopMargin = margin;
converter.PdfDocumentOptions.LeftMargin = margin;
converter.PdfDocumentOptions.RightMargin = margin;
var outPdfStream = new System.IO.MemoryStream();
converter.SavePdfFromHtmlStreamToStream(stream, System.Text.Encoding.UTF8
, ControllerContext.HttpContext.Request.Url.GetLeftPart(UriPartial.Authority), outPdfStream);
Response.AddHeader("Content-Disposition", $"inline; filename={reportInfo.ReportName}");
Response.Cache.SetCacheability(System.Web.HttpCacheability.Private);
// System.IO.File.WriteAllBytes(@"c:testaaaa.pdf", bytes);
return File(outPdfStream, "application/pdf");
Firefox可以接收PDF响应并正确显示。IE 10中的Adobe Reader XI插件抱怨"文件不是以‘%PDF’开头的。Local\EWH([b~rkqj)和Chrome抱怨格式不正确。当我通过Firefox保存PDF时,文件的大小约为2.6MB,然而,上面注释掉的代码将PDF保存为大小约为400k的aaaa.PDF。并且该文件可以在所有浏览器和PDF阅读器中打开并正确呈现。
显然,ASP.NET或IIS 7.5/8以某种方式膨胀/污染了400KB,这是Firefox可以容忍的,但其他人不能容忍的。通过VS调试器,我确信当函数返回时,字节/流大约是400KB,但不知何故,当响应离开IIS时,响应会变大几倍。
我使用的是MVC5和.NET 4.5,主机是Windows 7和Server 2012上的IIS EXpress、IIS 7.5、IIS8以及所有最新的修补程序。
这是一个非常常见的问题。
在将pdf内容写入响应之前,您应该使用response.clear()清除响应
然后应该调用Response.End()。
这将只向客户端发送pdf内容。