【问题标题】:Downloading a PDF from a HTML string out of a View in ASP.NET MVC从 ASP.NET MVC 中的视图中的 HTML 字符串下载 PDF
【发布时间】:2016-04-07 11:11:55
【问题描述】:

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

  1. 如何使用模型替换控制器中丑陋的[ValidateResponse(false)]
  2. 如何确保文件真正被打开?
  3. 以正确的方式格式化 HTML 字符串,以便 PdfGenerator 可以使用它。
  4. 向 PDF 添加 CSS

编辑: 好的,我更新了控制器代码,现在可以成功创建 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");
}

【问题讨论】:

    标签: c# asp.net angularjs asp.net-mvc


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多