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



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

  1. 如何使用模型来替换控制器中丑陋的[ValidateResponse(false)]
  2. 如何确保文件真的被打开
  3. 以正确的方式格式化HTML字符串,以便PdfGenerator可以使用它。
  4. 将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:

<form action="User/Template/Print" method="POST" id="print-form" enctype="multipart/form-data">
    <input type="text" hidden ng-model="strHtml" name="strHtml" ng-init="printToPdf()" />
    <button class="btn btn-success" type="submit">@Html.Raw(new Icon("print").Html) Print</button>
</form>

AngularJS:

angular.module("app").controller("FormController", function ($scope) {
    $scope.printToPdf = function () {
        var strHtml = $('#werkorderFormulier form').html();
        $scope.strHtml = JSON.stringify(strHtml);
    }
});

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级别2的支持。这实际上是相当有限的。令人惊讶的是,CSS Level 3给我们带来了这么多,而我们过去能够控制的却很少。

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

最新更新