0

我正在使用 Nreco PDF 将 html 页面转换为 PDF 。最近实现了捆绑和缩小,因此compilation debug = false在 web config 中进行了设置。

从那时起,PDF 生成失败,chrome 显示此消息“加载 PDF 文档失败”。

当我打开调试模式时,一切都按预期工作。

这是代码片段:

public ActionResult ABC()
{
    var htmlContent =System.IO.File.ReadAllText(Server.MapPath("~/Views/abc/abc.html"));
    createpdf(htmlContent);
}

public void createpdf(string htmlContent)
{
    var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter();
    var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);

    Response.ContentType = "application/pdf";
    Response.ContentEncoding = System.Text.Encoding.UTF8;
    Response.AddHeader("Content-Disposition", "Inline; filename=TEST.pdf");
    Response.BinaryWrite(pdfBytes);
    Response.Flush();
    Response.End();
}

我想知道在使用 debug = false 运行时导致此代码失败的原因。

4

2 回答 2

2

不需要回答:

用 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");
                
            }
于 2017-05-02T07:01:49.140 回答
0

更改为使用 File() 返回字节,例如: return File(pdfBytes, "application/pdf"); 不要使用 Response.BinaryWrite() 直接返回字节,这将导致 minifer 无法读取 pdf 流,因此向客户端返回空响应

于 2017-05-02T12:00:31.507 回答