不需要回答:
用 try -> catch 装饰代码,调试 catch 中是否有任何错误,如果没有,则很可能 htmlToPdf.GeneratePdf 将失败,如果没有继续下一个调试步骤
确保您的 PDF 生成器正常工作,这意味着您将拥有一个有效的 pdf 文件,然后在解决方案中的 App_Data 文件夹中返回字节存储 pdf
var appDataPath = Server.MapPath("~/App_Data");
var filename = string.Format(@"{0}.pdf", DateTime.Now.Ticks);
var path = Path.Combine(appDataPath, filename);
System.IO.File.WriteAllBytes(path, pdfBytes.ToArray());
检查创建和关闭响应
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("Content-Disposition", "Inline; filename=TEST.pdf");
Response.BinaryWrite(pdfBytes);
Response.Flush();
Response.Close()
Response.End()
编辑:
经过长时间的调试会话,发现了什么:使用 WebMarkupMin.Mvc 压缩内容或最小化控制器操作结果压缩不正确(是正确的,但不是您返回 pdf 的方式)。
webMarkupMin 默认设置如下:
enableMinification="true"
disableMinificationInDebugMode="假"
启用压缩=“真”
disableCompressionInDebugMode="假"
这就是为什么在调试模式下运行正确的原因
编译调试=“真”
在 web.config 设置中的 debug="true" 时得到相同的错误:
<webMarkupMin xmlns="http://tempuri.org/WebMarkupMin.Configuration.xsd">
<webExtensions enableMinification="true" disableMinificationInDebugMode="false" enableCompression="true" disableCompressionInDebugMode="false" />
<!-- rest of shebang -->
</webMarkupMin>
您可能会问的问题在哪里,在您的实现中很简单响应流被压缩不正确。
克服问题:
//you can use FileResult, same outcome
public ActionResult ABC()
{
var htmlContent = System.IO.File.ReadAllText(Server.MapPath("~/Views/abc/abc.html"));
var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
//return File(pdfBytes, "application/pdf", "TEST.pdf");
//will add filename to your response, downside is that browser downloads the response
//if your really need Content Disposition in response headers uncomment below line
//Response.AddHeader("Content-Disposition", "Inline; filename=TEST.pdf");
return File(pdfBytes, "application/pdf");
}