使用 ASP.NET 导出为 pdf 5
Export to pdf using ASP.NET 5
我正在开发 MVC 6 应用程序(DNX Core 5.0 框架)。不幸的是,我找不到任何用于 pdf 导出的库。
我们将不胜感激。
如果您必须依赖Core,您将有两个选择:
1 - 稍等
核心仍然是 RC1,慢慢地转向 RC2,而且你不会很快找到很多库。由于 .NET Core 受到了很多关注,第一个库应该会在几个月内出现,但我猜你至少要等到 RC2 版本。
2 - 叉子(或类似的)
您可以获取最适合您需求的开源项目、fork(如果在 GitHub 上)或直接下载并开始更新到 .NET Core。我刚刚使用 DapperExtensions
完成了这项工作,而且效果非常好。您甚至可以为自己添加一些辣味 ;)
另一方面,如果您只需要一些可以工作但不需要直接嵌入到 .NET Core 中的东西,我已经设法使 JsReport 工作正常。它将启动它自己的基于 Node
的服务器(嵌入式服务器),但集成非常容易(使用 AspNet Core 自己的依赖注入系统!)并且创建 PDF 没有进一步的问题。
如果您对此感兴趣,这里有一些说明:
1 - 参考资料
将这些添加到您的 project.json:
"jsreport.Embedded": "0.8.1",
"jsreport.Client": "0.8.1"
2 - AspNet 集成
之后,按照 jsReport here 的说明进行操作。您可以在此处配置 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[=17=].8.1
.
您会注意到那里有一个名为 content
的文件夹。只需将其内容(两个文件:node.exe
和 jsreport-net-embedded.zip
)复制到 lib\net45
.
所以,为了简单和简单:从
复制内容(仅限文件)
C:\Users\<name>\.dnx\packages\jsreport.Embedded[=22=].8.1\contents
进入
C:\Users\<name>\.dnx\packages\jsreport.Embedded[=23=].8.1\lib\net45
。
那应该可以解决启动问题。请记住:第一次启动将提取文件,应该需要几分钟时间。之后就会快很多
我修改了 RazorAnt/RazorPDF which was working only for older MVC versions to work with ASP.NET Core. Its RazorPDFCore, available on nuget and github:
用法示例
class YourBaseController : RazorPDF.Controller {
// [...]
public IActionResult Pdf() {
var model = /* any model you wish */
return ViewPdf(model);
}
}
在你的Startup.cs
在services.AddMVc();
之前添加以下行
services.AddSingleton<PdfResultExecutor>();
请注意:
在使用 ViewPdf()
方法之前,您需要从基本控制器继承 RazorPDF.Controller
我终于想出了一种从 .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();
}
现在安装所需的 Node.js 软件包:
从命令行将工作目录更改为 .NET Core 项目的根目录,然后 运行 这些命令。
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);
})
};
查看 here 了解有关 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();
}
当然,您可以使用从 nodeServices 返回的 byte[]
做任何您想做的事情,在这个例子中,我只是从控制器操作中输出它,以便可以在浏览器中查看它。
您还可以使用 pdf.js
中的 resp.content.toString('base64')
通过 base64 编码的字符串在 Node.js 和 .NET Core 之间交换数据并使用
var result = await nodeServices.InvokeAsync<byte[]>("./pdf");
在action中然后解码base64编码的字符串。
备选方案
大多数 pdf 生成器解决方案仍然依赖于 .NET 4.5/4.6 框架。
None 以上两个答案(JsReport 和 RazorPDFCore)还适用于 .NET Core。
如果您不喜欢使用 Node.js:
,似乎可以使用一些付费替代方案
- NReco.PdfGenerator.LT
- EVO HTML 到 .NET Core 的 PDF 转换器客户端
- Winnovative HTML 到 .NET Core 的 PDF 转换器客户端
不过我还没有尝试过这些。
我希望我们很快就会看到这个领域的一些开源进展。
死灵法术。
添加对 NodeJS 的依赖是不理想的恕我直言,尤其是考虑到 .NET Core 独立部署。
根据 2017 年,您可以使用 my port of PdfSharpCore to .NET Core 1.1
解析字体,它可以使用图像。附带一个很好的示例应用程序。但是,您必须更换数据库部分。
致谢名单:
https://github.com/groege/PdfSharpCore
有点过时,并且不包含有关如何将其用于图像的示例。
请注意,在使用相应功能之前,您需要注册字体解析器和图像源实现:
PdfSharpCore.Fonts.GlobalFontSettings.FontResolver = new FontResolver();
MigraDocCore.DocumentObjectModel.MigraDoc.DocumentObjectModel
.Shapes.ImageSource.ImageSourceImpl =
new PdfSharpCore.ImageSharp.ImageSharpImageSource();
我知道不久前有人问过这个问题,而且我知道已经提供了几个可能适合某些项目的答案。但我最近创建了一个 GitHub 存储库,它允许直接从 C# 代码创建 PDF,而不需要任何 nodejs、javascript 或 razor。该功能集目前有点受限,但它可以生成包含图像(现阶段仅 .jpg)、形状和格式化文本的 PDF。该库适用于 .net core 2.0,不依赖于任何其他 PDF 生成工具。
请注意,这是我自己的存储库:https://github.com/GZidar/CorePDF
我确实计划随着时间的推移添加功能,但至少现在这可以为其他人提供基础,以便在他们自己的项目中包含简单的 PDF 功能,而无需额外的工具。
我正在开发 MVC 6 应用程序(DNX Core 5.0 框架)。不幸的是,我找不到任何用于 pdf 导出的库。
我们将不胜感激。
如果您必须依赖Core,您将有两个选择:
1 - 稍等
核心仍然是 RC1,慢慢地转向 RC2,而且你不会很快找到很多库。由于 .NET Core 受到了很多关注,第一个库应该会在几个月内出现,但我猜你至少要等到 RC2 版本。
2 - 叉子(或类似的)
您可以获取最适合您需求的开源项目、fork(如果在 GitHub 上)或直接下载并开始更新到 .NET Core。我刚刚使用 DapperExtensions
完成了这项工作,而且效果非常好。您甚至可以为自己添加一些辣味 ;)
另一方面,如果您只需要一些可以工作但不需要直接嵌入到 .NET Core 中的东西,我已经设法使 JsReport 工作正常。它将启动它自己的基于 Node
的服务器(嵌入式服务器),但集成非常容易(使用 AspNet Core 自己的依赖注入系统!)并且创建 PDF 没有进一步的问题。
如果您对此感兴趣,这里有一些说明:
1 - 参考资料
将这些添加到您的 project.json:
"jsreport.Embedded": "0.8.1",
"jsreport.Client": "0.8.1"
2 - AspNet 集成
之后,按照 jsReport here 的说明进行操作。您可以在此处配置 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[=17=].8.1
.
您会注意到那里有一个名为 content
的文件夹。只需将其内容(两个文件:node.exe
和 jsreport-net-embedded.zip
)复制到 lib\net45
.
所以,为了简单和简单:从
复制内容(仅限文件)
C:\Users\<name>\.dnx\packages\jsreport.Embedded[=22=].8.1\contents
进入
C:\Users\<name>\.dnx\packages\jsreport.Embedded[=23=].8.1\lib\net45
。
那应该可以解决启动问题。请记住:第一次启动将提取文件,应该需要几分钟时间。之后就会快很多
我修改了 RazorAnt/RazorPDF which was working only for older MVC versions to work with ASP.NET Core. Its RazorPDFCore, available on nuget and github:
用法示例
class YourBaseController : RazorPDF.Controller {
// [...]
public IActionResult Pdf() {
var model = /* any model you wish */
return ViewPdf(model);
}
}
在你的Startup.cs
在services.AddMVc();
services.AddSingleton<PdfResultExecutor>();
请注意:
在使用 ViewPdf()
方法之前,您需要从基本控制器继承 RazorPDF.Controller
我终于想出了一种从 .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();
}
现在安装所需的 Node.js 软件包:
从命令行将工作目录更改为 .NET Core 项目的根目录,然后 运行 这些命令。
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);
})
};
查看 here 了解有关 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();
}
当然,您可以使用从 nodeServices 返回的 byte[]
做任何您想做的事情,在这个例子中,我只是从控制器操作中输出它,以便可以在浏览器中查看它。
您还可以使用 pdf.js
中的 resp.content.toString('base64')
通过 base64 编码的字符串在 Node.js 和 .NET Core 之间交换数据并使用
var result = await nodeServices.InvokeAsync<byte[]>("./pdf");
在action中然后解码base64编码的字符串。
备选方案
大多数 pdf 生成器解决方案仍然依赖于 .NET 4.5/4.6 框架。 None 以上两个答案(JsReport 和 RazorPDFCore)还适用于 .NET Core。
如果您不喜欢使用 Node.js:
,似乎可以使用一些付费替代方案- NReco.PdfGenerator.LT
- EVO HTML 到 .NET Core 的 PDF 转换器客户端
- Winnovative HTML 到 .NET Core 的 PDF 转换器客户端
不过我还没有尝试过这些。
我希望我们很快就会看到这个领域的一些开源进展。
死灵法术。
添加对 NodeJS 的依赖是不理想的恕我直言,尤其是考虑到 .NET Core 独立部署。
根据 2017 年,您可以使用 my port of PdfSharpCore to .NET Core 1.1
解析字体,它可以使用图像。附带一个很好的示例应用程序。但是,您必须更换数据库部分。
致谢名单:
https://github.com/groege/PdfSharpCore
有点过时,并且不包含有关如何将其用于图像的示例。
请注意,在使用相应功能之前,您需要注册字体解析器和图像源实现:
PdfSharpCore.Fonts.GlobalFontSettings.FontResolver = new FontResolver();
MigraDocCore.DocumentObjectModel.MigraDoc.DocumentObjectModel
.Shapes.ImageSource.ImageSourceImpl =
new PdfSharpCore.ImageSharp.ImageSharpImageSource();
我知道不久前有人问过这个问题,而且我知道已经提供了几个可能适合某些项目的答案。但我最近创建了一个 GitHub 存储库,它允许直接从 C# 代码创建 PDF,而不需要任何 nodejs、javascript 或 razor。该功能集目前有点受限,但它可以生成包含图像(现阶段仅 .jpg)、形状和格式化文本的 PDF。该库适用于 .net core 2.0,不依赖于任何其他 PDF 生成工具。
请注意,这是我自己的存储库:https://github.com/GZidar/CorePDF
我确实计划随着时间的推移添加功能,但至少现在这可以为其他人提供基础,以便在他们自己的项目中包含简单的 PDF 功能,而无需额外的工具。