首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ASP.NET 5导出到pdf

使用ASP.NET 5导出到pdf
EN

Stack Overflow用户
提问于 2016-05-02 13:11:05
回答 5查看 19.9K关注 0票数 10

我正在开发MVC 6应用程序(DNXCore5.0框架)。不幸的是,我没有找到任何的pdf导出库。

任何帮助都将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-05-03 20:54:11

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

1-等等

核心仍然是RC1,慢慢地转移到RC2,而且你不会很快发现太多的libs。由于.NET内核引起了广泛的关注,几个月后就会出现第一个库,但我想您至少要等待RC2的发布。

2-叉子(或类似)

您可以抓取一个最适合您的需要的开源项目,fork (如果在GitHub上),或者只是下载并开始更新到.NET核心。我刚刚用DapperExtensions做了这件事,它很有魅力。你甚至可以为你加一些辛辣的;)

另一方面,如果您只需要一些可以工作但不需要直接嵌入到.NET核心中的东西,那么我已经设法使JsReport正常工作了。它将启动基于Node的非常自己的服务器(嵌入式服务器),但是集成非常容易(有了AspNet Core,非常独立的注入系统!)并且PDF被创建,没有进一步的问题。

如果你对此感兴趣,以下是一些说明:

1-参考资料

将这些添加到project.json中:

代码语言:javascript
复制
"jsreport.Embedded": "0.8.1",
"jsreport.Client": "0.8.1"

2- AspNet集成

之后,按照jsReport 这里的说明进行操作。您可以按照以下方式配置AspNet DI系统:

代码语言:javascript
复制
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; });
   // ...
}

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

3-使用情况

代码语言:javascript
复制
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");
}

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

这应该可以解决启动问题。记住:第一次启动将提取文件,应该需要几分钟。在那之后,它会快得多。

票数 10
EN

Stack Overflow用户

发布于 2017-01-19 11:10:06

我终于想出了一种从.NET核心生成pdf(没有任何.NET框架依赖项)的方法,就是在.NET核心应用程序中使用Node.js。下面的示例演示如何在干净的ASP.NET核心网络应用程序项目(Web模板)中实现HTML转换器。

安装NuGet包Microsoft.AspNetCore.NodeServices

在Startup.cs中添加行services.AddNodeServices(),如下所示

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    // ... all your existing configuration is here ...

    // Enable Node Services
    services.AddNodeServices();
}

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

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

代码语言:javascript
复制
npm init

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

代码语言:javascript
复制
npm install jsreport-core --save
npm install jsreport-jsrender --save
npm install jsreport-phantom-pdf --save

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

代码语言:javascript
复制
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);
    })
};

有关这里的更多解释,请看jsreport-core

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

代码语言:javascript
复制
[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();
}

当然,您可以随意使用从byte[]返回的nodeServices,在本例中,我只是从控制器操作输出它,以便在浏览器中查看。

您还可以在Node.js和.NET Core之间使用base64编码字符串交换数据,在pdf.js中使用resp.content.toString('base64'),在操作中使用var result = await nodeServices.InvokeAsync<byte[]>("./pdf");,然后解码base64编码的字符串。

Alternatives

大多数pdf生成器解决方案仍然依赖于.NET 4.5/4.6框架。以上两个答案(JsReport和RazorPDFCore)中还没有一个适用于.NET核心。

如果您不喜欢使用Node.js,那么似乎可以使用一些付费的替代方案:

不过我还没试过这些呢。

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

票数 14
EN

Stack Overflow用户

发布于 2017-09-15 08:59:17

我知道这个问题是在一段时间前提出的,我知道已经提供了几个答案,很可能对某些项目是正确的。但我最近创建了一个GitHub存储库,它允许直接从C#代码创建PDF,而不需要nodejs、javascript或剃刀。目前,特征集是有限的,但是它使用图像(仅在此阶段使用.jpg)、形状和格式化文本生成PDF。该库与.net核心2.0一起工作,并且不依赖于任何其他PDF生成工具。

请注意,这是我自己的存储库:https://github.com/GZidar/CorePDF

我确实计划随着时间的推移添加功能,但至少在现在,这可能为其他人在自己的项目中包含简单的PDF功能提供了基础,而不需要额外的工具。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36983300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档