【问题标题】:ASP.NET MVC has File(outPdfStream, "application/pdf") returned bloating bytes?ASP.NET MVC 有 File(outPdfStream, "application/pdf") 返回膨胀字节?
【发布时间】:2015-11-09 04:29:39
【问题描述】:

在 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:\test\aaaa.pdf", bytes);
            return File(outPdfStream, "application/pdf");

Firefox 可以接收 PDF 响应并正确显示。 IE 10 中的 Adob​​e Reader XI 插件抱怨“文件不以'%PDF'开头。Local\EWH([b~rkqj”, Chrome 抱怨格式不正确。当我通过 Firefox 保存 PDF 时,文件的大小大约 2.6 MB,但是,上面注释掉的代码将 pdf 保存为 aaaa.pdf,大小约为 400k。并且该文件可以在所有浏览器和 PDF 阅读器中正确打开和呈现。

显然 ASP.NET 或 IIS 7.5/8 以某种方式膨胀/污染了 400KB,这可能是 Firefox 可以容忍的,但其他人不能。通过 VS 调试器,我很确定函数返回时字节/流大约是 400 KB,但不知何故,当响应离开 IIS 时,响应会变大几倍。

我使用的是 MVC5 和 .NET 4.5,主机是 IIS EXpress、IIS 7.5、Windows 7 和 Server 2012 上的 IIS8 以及所有最新补丁。

【问题讨论】:

  • 甚至添加 Response.AddHeader("Content-Length", outPdfStream.Length.ToString());无济于事,同样的膨胀反应。
  • 选择另存为以保存下载的文件并在二进制编辑器中打开该文件以查看实际内容。
  • 是的,2.6 MB 文件是实际内容,但只能在 Firefox 中查看。 Adobe Reader、IE 和 Chrom 认为它已损坏。注释代码保存的文件大小为 400 KB,所有浏览器和 PDF 阅读器都可以正确读取。
  • 我明白,但我们需要看看 2.6 mb 的数据包含什么
  • 感谢您的提示,奥古兹。根据HxD,文件的头部实际上是要渲染的HTML。奇怪的是,如果我将 PDF 转换器创建的字节流保存到控制器内部的文件中,那么文件 aaaa.pdf 是正确的。我猜 html 中的 javascript 引用可能会造成一些麻烦。

标签: c# asp.net-mvc pdf iis


【解决方案1】:

这是一个很常见的问题。

在将 pdf 内容写入响应之前,您应该使用 Response.Clear() 清除响应,

然后应该调用 Response.End()。

这只会将 pdf 内容发送给客户端。

【讨论】:

  • 返回中的 html 是在控制器内渲染 html 时生成的,在将 html 渲染为 pdf 之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2011-09-23
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
相关资源
最近更新 更多