我正在开发MVC 6应用程序(DNXCore5.0框架)。不幸的是,我没有找到任何的pdf导出库。
任何帮助都将不胜感激。
发布于 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中:
"jsreport.Embedded": "0.8.1",
"jsreport.Client": "0.8.1"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; });
// ...
}例如,要使用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");
}4-重要:您的服务器不会启动(缺少一个zip文件)
由于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。
这应该可以解决启动问题。记住:第一次启动将提取文件,应该需要几分钟。在那之后,它会快得多。
发布于 2017-01-19 11:10:06
我终于想出了一种从.NET核心生成pdf(没有任何.NET框架依赖项)的方法,就是在.NET核心应用程序中使用Node.js。下面的示例演示如何在干净的ASP.NET核心网络应用程序项目(Web模板)中实现HTML转换器。
安装NuGet包Microsoft.AspNetCore.NodeServices
在Startup.cs中添加行services.AddNodeServices(),如下所示
public void ConfigureServices(IServiceCollection services)
{
// ... all your existing configuration is here ...
// Enable Node Services
services.AddNodeServices();
}现在安装所需的Node.js包:
从命令行将工作目录更改为.NET核心项目的根目录,并运行这些命令。
npm init并按照说明创建package.json文件
npm install jsreport-core --save
npm install jsreport-jsrender --save
npm install jsreport-phantom-pdf --save在包含以下内容的项目根目录中创建一个文件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);
})
};有关这里的更多解释,请看jsreport-core。
现在在Mvc控制器中创建一个操作,该控制器调用此Node.js脚本
[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,那么似乎可以使用一些付费的替代方案:
不过我还没试过这些呢。
我希望我们很快就能看到这方面的一些开源进展。
发布于 2017-09-15 08:59:17
我知道这个问题是在一段时间前提出的,我知道已经提供了几个答案,很可能对某些项目是正确的。但我最近创建了一个GitHub存储库,它允许直接从C#代码创建PDF,而不需要nodejs、javascript或剃刀。目前,特征集是有限的,但是它使用图像(仅在此阶段使用.jpg)、形状和格式化文本生成PDF。该库与.net核心2.0一起工作,并且不依赖于任何其他PDF生成工具。
请注意,这是我自己的存储库:https://github.com/GZidar/CorePDF
我确实计划随着时间的推移添加功能,但至少在现在,这可能为其他人在自己的项目中包含简单的PDF功能提供了基础,而不需要额外的工具。
https://stackoverflow.com/questions/36983300
复制相似问题