使用ASP.NET 5导出为pdf

Ant*_*kov 10 asp.net-core-mvc dnx50 asp.net-core

我正在研究MVC 6应用程序(DNX Core 5.0框架).不幸的是,我找不到任何pdf导出库.

任何帮助将不胜感激.

Sjo*_*und 12

我终于找到了一种从.NET Core(没有任何.NET框架依赖项)生成pdf的方法是在我的.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框架.上面的两个答案(JsReport和RazorPDFCore)都不适用于.NET Core.

如果您不喜欢使用Node.js,似乎有一些付费替代方案:

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

我没有尝试过这些.

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


And*_*tos 10

如果您必须依赖Core,您将有两个选择:

1 - 稍等一下

Core仍然是RC1,慢慢转向RC2,你很快就找不到很多lib.由于.NET Core受到了很多关注,所以第一个库应该会在几个月内推出,但我猜你必须等到至少RC2发布.

2 - 叉(或类似)

您可以获取最适合您需求的开源项目,fork(如果在GitHub上)或只是下载并开始更新到.NET Core.我刚刚完成了它,DapperExtensions它的工作就像一个魅力.你甚至可以为你添加一些辣;)


另一方面,如果你只需要一些有效的东西但不需要嵌入到.NET Core中,那么我已经设法使JsReport正常工作了.它将启动它自己的服务器(嵌入式服务器),Node但集成非常简单(使用AspNet Core非常自己的Dependecy Injection系统!)和PDF创建没有进一步的问题.

如果你感兴趣,这里有一些指示:

1 - 参考文献

将它们添加到project.json:

"jsreport.Embedded": "0.8.1",
"jsreport.Client": "0.8.1"
Run Code Online (Sandbox Code Playgroud)

2 - AspNet集成

之后,按照从jsReport说明这里.您可以在此处配置AspNet DI系统:

public void ConfigureServices(IServiceCollection services)
{
   // ...
   var _server = new EmbeddedReportingServer();
   _server.StartAsync().Wait();
   services.AddInstance<IEmbeddedReportingServer>(_server);
   services.AddSingleton<IReportingService>((s) => { return s.GetRequiredService<IEmbeddedReportingServer>().ReportingService; });
   // ...
}
Run Code Online (Sandbox Code Playgroud)

例如,要使用你只需要接收IReportingService或手动从Resolver控制器上获取它.

3 - 用法

public IActionResult SomeReport()
{
   // This is <my> type of usage. It's a bit manual because I'm currently loading reports from DB. You can use it in a diferent way (check jsReport docs).
   var service = Resolver.GetRequiredService<jsreport.Client.IReportingService>();

   var phantomOptions = new jsreport.Client.Entities.Phantom()
   {
      format = "A4",
      orientation = "portrait",
      margin = "0cm"
   };
   phantomOptions.footer = "<h2>Some footer</h2>";
   phantomOptions.footerHeight = "50px";
   phantomOptions.header = "<h2>Some header</h2>";
   phantomOptions.headerHeight = "50px";
   var request = new jsreport.Client.RenderRequest()
   {
      template = new jsreport.Client.Entities.Template()
      {
         content = "<div>Some content for your report</div>",
         recipe = "phantom-pdf",
         name = "Your report name",
         phantom = phantomOptions
      }
   };

   var _report = service.RenderAsync(request).Result;

   // Request file download.
   return File(_report.Content, "application/pdf", "Some fancy name.pdf");
}
Run Code Online (Sandbox Code Playgroud)

4 - 重要:您的服务器无法启动(缺少zip文件)

由于NuGet对AspNet项目的更改,您必须手动移动一些不会自动移动的内容文件.

首先,找到嵌入式服务器的dnx缓存.应该是这样的:
C:\Users\<name>\.dnx\packages\jsreport.Embedded\0.8.1.

你会注意到content那里有一个文件夹.只需将其内容(两个文件:node.exejsreport-net-embedded.zip)复制到lib\net45.

所以,简单明了,万无一失:将内容(仅限文件)复制
C:\Users\<name>\.dnx\packages\jsreport.Embedded\0.8.1\contents

C:\Users\<name>\.dnx\packages\jsreport.Embedded\0.8.1\lib\net45.

这应该解决启动问题.请记住:首次启动将提取文件,并且应该花几分钟时间.在那之后,它会快得多.