在ASP.NET Core中将html导出为pdf

Car*_*los 48 pdf-generation asp.net-core

我想将一段html导出为pdf文件,但我没有任何兼容的nuget包.

当我尝试安装任何人时:"X与netcoreapp1.0不兼容(.NETCoreApp,Version = v1.0)."

有谁知道用asp.net核心导出到pdf的任何方法?

Jan*_*aha 27

如果你在.net core 2.0中也可以使用jsreport .net sdk,也没有更复杂的节点服务.这包括将您现有的剃刀视图转换为pdf的过滤器.来自文档:

1.安装nugets jsreport.Binary,jsreport.Localjsreport.AspNetCore

2.在您Startup.cs配置如下

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();              
    services.AddJsReport(new LocalReporting()
        .UseBinary(JsReportBinary.GetBinary())
        .AsUtility()
        .Create());
}
Run Code Online (Sandbox Code Playgroud)

3.然后,您需要向MiddlewareFilter特定操作添加属性并指定要使用的转换.在这种情况下html转换为pdf.

[MiddlewareFilter(typeof(JsReportPipeline))]
public IActionResult Invoice()
{
    HttpContext.JsReportFeature().Recipe(Recipe.ChromePdf);
    return View();
}
Run Code Online (Sandbox Code Playgroud)

您可以在页眉,页脚或页面布局上找到许多其他选项JsReportFeature().请注意,您也可以通过html生成excel文件.请参阅文档中的更多信息.

PS:我是jsreport的作者.

  • 在依赖项和 nuget 方面遇到了很多麻烦,这很糟糕,但我设法配置它。此外,stackoveflow 警方不断删除这些评论。也许他们爱上了这个作者 (3认同)

Sjo*_*und 22

从我原来的答案复制到使用ASP.NET 5导出到pdf:

从.NET Core中的html生成pdf(没有任何.NET框架依赖项)的一种方法是在.NET Core应用程序中使用Node.js.以下示例说明如何在干净的ASP.NET核心Web应用程序项目(Web API模板)中实现HTML到PDF转换器.

安装NuGet包 Microsoft.AspNetCore.NodeServices

在Startup.cs添加一行services.AddNodeServices()这样的

public void ConfigureServices(IServiceCollection services)
{
    // ... all your existing configuration is here ...

    // Enable Node Services
    services.AddNodeServices();
}
Run Code Online (Sandbox Code Playgroud)

现在安装所需的Node.js包:

从命令行将工作目录更改为.NET Core项目的根目录并运行这些命令.

npm init
Run Code Online (Sandbox Code Playgroud)

并按照说明创建package.json文件

npm install jsreport-core --save
npm install jsreport-jsrender --save
npm install jsreport-phantom-pdf --save
Run Code Online (Sandbox Code Playgroud)

pdf.js在包含的项目的根目录中创建一个文件

module.exports = function (callback) {
    var jsreport = require('jsreport-core')();

    jsreport.init().then(function () {
        return jsreport.render({
            template: {
                content: '<h1>Hello {{:foo}}</h1>',
                engine: 'jsrender',
                recipe: 'phantom-pdf'
            },
            data: {
                foo: "world"
            }
        }).then(function (resp) {
            callback(/* error */ null, resp.content.toJSON().data);
        });
    }).catch(function (e) {
        callback(/* error */ e, null);
    })
};
Run Code Online (Sandbox Code Playgroud)

看看这里有更多的解释jsreport-core.

现在在调用此Node.js脚本的Mvc控制器中创建一个操作

[HttpGet]
public async Task<IActionResult> MyAction([FromServices] INodeServices nodeServices)
{
    var result = await nodeServices.InvokeAsync<byte[]>("./pdf");

    HttpContext.Response.ContentType = "application/pdf";

    string filename = @"report.pdf";
    HttpContext.Response.Headers.Add("x-filename", filename);
    HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "x-filename");
    HttpContext.Response.Body.Write(result, 0, result.Length);
    return new ContentResult();
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用byte[]nodeServices返回的任何内容执行任何操作,在此示例中,我只是从控制器操作中输出它,以便可以在浏览器中查看它.

您还可以通过一个base64编码字符串中使用Node.js的交流和.NET核心之间的数据resp.content.toString('base64')pdf.js,并使用 var result = await nodeServices.InvokeAsync<byte[]>("./pdf");在动作然后解码Base64编码的字符串.


备择方案

大多数pdf生成器解决方案仍然依赖于.NET 4.5/4.6框架.但是,如果您不喜欢使用Node.js,似乎有一些付费替代方案:

  • NReco.PdfGenerator.LT
  • 用于.NET Core的EVO HTML到PDF转换器客户端
  • 用于.NET Core的Winnovative HTML to PDF Converter Client

我没有尝试过这些.

我希望我们很快就会看到这方面的一些开源进展.

  • 知道如何使用现有的Razor视图(或任何其他html页面)作为输入吗? (3认同)
  • @jao您应该能够使用`module.exports = function(callback,html){`并在模板集`content:html`中更改pdf.js,然后在您的操作中执行`var result = await nodeServices.InvokeAsync < byte []>("./ pdf",razorRenderedHtmlString);`.但是,除非事先将其内联,否则您可能会对css感到困惑. (3认同)
  • 关于在ASP.NET中使用NodeServices的TIL (2认同)

use*_*245 5

您可以检查DinkToPdf库。它是.NET Core wkhtmltopdf库的包装。

同步转换器

在多线程应用程序和Web服务器中使用此转换器。转换任务将保存到阻塞收集中,并在单个线程上执行。

var converter = new SynchronizedConverter(new PdfTools());
Run Code Online (Sandbox Code Playgroud)

定义要转换的文件

var doc = new HtmlToPdfDocument()
{
    GlobalSettings = {
        ColorMode = ColorMode.Color,
        Orientation = Orientation.Landscape,
        PaperSize = PaperKind.A4Plus,
    },
    Objects = {
        new ObjectSettings() {
            PagesCount = true,
            HtmlContent = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur mauris eget ultrices  iaculis. Ut                               odio viverra, molestie lectus nec, venenatis turpis.",
            WebSettings = { DefaultEncoding = "utf-8" },
            HeaderSettings = { FontSize = 9, Right = "Page [page] of [toPage]", Line = true, Spacing = 2.812 }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 它第一次生成pdf,然后第二次拒绝生成,我不知道为什么 (3认同)
  • 这对 Kestrel 非常有效,但不适用于 IIS。任何想法为什么? (2认同)
  • @ user1646245是,在对代码进行一些调试之后,我们能够在此单例问题中准确地发现问题。老实说,我们把它作为单例,但是有人决定每次调用导出到pdf例程时都要重新初始化它。现在它可以正常工作 (2认同)