C# 从ASP.NET MVC中的视图中下载HTML字符串中的PDF

C# 从ASP.NET MVC中的视图中下载HTML字符串中的PDF,c#,asp.net,angularjs,asp.net-mvc,C#,Asp.net,Angularjs,Asp.net Mvc,我正在尝试使用NReco.PdfConverter下载从表单HTML代码解析的PDF。在发现AJAX不起作用后,我在许多帖子中按照建议进行了表单操作。然而,这带来了我自己无法解决的新问题: 如何使用模型替换控制器中丑陋的[ValidateResponse(false)] 我怎样才能确保文件确实被打开 以正确的方式格式化HTML字符串,以便PDFGGenerator可以使用它 将CSS添加到PDF 编辑: 好的,我更新了控制器代码,现在我可以成功地创建一个PDF文件。我添加了以下代码行: Resp

我正在尝试使用NReco.PdfConverter下载从表单HTML代码解析的PDF。在发现AJAX不起作用后,我在许多帖子中按照建议进行了表单操作。然而,这带来了我自己无法解决的新问题:

  • 如何使用模型替换控制器中丑陋的
    [ValidateResponse(false)]
  • 我怎样才能确保文件确实被打开
  • 以正确的方式格式化HTML字符串,以便PDFGGenerator可以使用它
  • 将CSS添加到PDF
  • 编辑: 好的,我更新了控制器代码,现在我可以成功地创建一个PDF文件。我添加了以下代码行:

    Response.ContentType = "application/pdf";
    Response.ContentEncoding = System.Text.Encoding.UTF8;
    Response.AddHeader("Content-Disposition", "inline; filename=test.pdf");
    Response.BinaryWrite(pdfBytes);
    
    但是内容不是我所期望的。我怀疑JSON.stringify没有正确格式化字符串。事实证明,我使用了错误的jQuery选择器,实际上选择了包含打印按钮的表单。修复后,我现在可以成功地将HTML字符串加载到PDF中,只是缺少CSS。如何确保PDF与使用te PdfConverter的网页完全相同

    Html:

    TemplateController中的打印操作:

    public FileResult Print(FormCollection fC)
    {
        var pdfConverter = new HtmlToPdfConverter();
        var strHtml = fC.GetValue("strHtml").AttemptedValue;
        var pdfBytes = pdfConverter.GeneratePdf(strHtml);
        Response.ContentType = "application/pdf";
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.AddHeader("Content-Disposition", "inline; filename=test.pdf");
        Response.BinaryWrite(pdfBytes);
        return File(pdfBytes, "application/pdf");
    }
    

    我不确定你用什么来创建PDF,但我知道所有的C#PDF库都有有限的CSS支持。支持HTML和CSS转换为PDF的库必须将HTML和CSS转换为PDF格式所能理解的命令。有些图书馆比其他图书馆做得更好,但没有一个图书馆实现了一对一的对等。一般来说,你能期待的最好的是支持。这实际上是相当有限的。令人惊讶的是,CSS Level 3为我们带来了如此之多,而我们过去能够控制的却如此之少

    如果你的目标是把网页截图做成PDF格式,那么你唯一的选择就是一个名为。它是一个已编译的二进制文件,而不是可以添加到代码中的真正库。您必须调用文件系统并执行它,这并不理想,这取决于您所处的信任环境。不过,wkhtmltopdf的独特之处在于它集成了WebKit引擎,用于Safari,以前是Chrome和Opera。换句话说,它会像浏览器一样呈现网页,然后将位图转换成PDF格式。通过这种方式,您可以获得近乎完美的外观和感觉平衡。

    我正在使用它生成pdf
    angular.module("app").controller("FormController", function ($scope) {
        $scope.printToPdf = function () {
            var strHtml = $('#werkorderFormulier form').html();
            $scope.strHtml = JSON.stringify(strHtml);
        }
    });
    
    public FileResult Print(FormCollection fC)
    {
        var pdfConverter = new HtmlToPdfConverter();
        var strHtml = fC.GetValue("strHtml").AttemptedValue;
        var pdfBytes = pdfConverter.GeneratePdf(strHtml);
        Response.ContentType = "application/pdf";
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.AddHeader("Content-Disposition", "inline; filename=test.pdf");
        Response.BinaryWrite(pdfBytes);
        return File(pdfBytes, "application/pdf");
    }