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,似乎有一些付费替代方案:
我没有尝试过这些.
我希望我们很快就会看到这方面的一些开源进展.
And*_*tos 10
如果您必须依赖Core,您将有两个选择:
Core仍然是RC1,慢慢转向RC2,你很快就找不到很多lib.由于.NET Core受到了很多关注,所以第一个库应该会在几个月内推出,但我猜你必须等到至少RC2发布.
您可以获取最适合您需求的开源项目,fork(如果在GitHub上)或只是下载并开始更新到.NET Core.我刚刚完成了它,DapperExtensions它的工作就像一个魅力.你甚至可以为你添加一些辣;)
另一方面,如果你只需要一些有效的东西但不需要嵌入到.NET Core中,那么我已经设法使JsReport正常工作了.它将启动它自己的服务器(嵌入式服务器),Node但集成非常简单(使用AspNet Core非常自己的Dependecy Injection系统!)和PDF创建没有进一步的问题.
如果你感兴趣,这里有一些指示:
将它们添加到project.json:
"jsreport.Embedded": "0.8.1",
"jsreport.Client": "0.8.1"
Run Code Online (Sandbox Code Playgroud)
之后,按照从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控制器上获取它.
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)
由于NuGet对AspNet项目的更改,您必须手动移动一些不会自动移动的内容文件.
首先,找到嵌入式服务器的dnx缓存.应该是这样的:
C:\Users\<name>\.dnx\packages\jsreport.Embedded\0.8.1.
你会注意到content那里有一个文件夹.只需将其内容(两个文件:node.exe和jsreport-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.
这应该解决启动问题.请记住:首次启动将提取文件,并且应该花几分钟时间.在那之后,它会快得多.
| 归档时间: |
|
| 查看次数: |
14131 次 |
| 最近记录: |