前言

大家用 asp.net core 进行项目开发时,常会有生成 pdf 的需求,那如何生成呢?这篇文章我们就来讨论如何通过 dinktopdf 来生成 pdf 文档,dinktopdf 封装了 c++ 的 wkhtmltopdf 工具包,前者通过 p/invoke 的方式来调用后者,而底层的 wkhtmltopdf 利用 qt webkit 渲染引擎将 html 转成 pdf。

安装 dinktopdf

要想安装 dinktopdf,可以通过 nuget 可视化界面或者通过 nuget package manager console 命令行工具输入以下命令:

install-package dinktopdf

安装完毕之后可以验证下 dinktopdf.dll 是否已成功引用到项目中。

既然是封装了 c++ 的 wkhtmltopdf,肯定要拿到原生的 wkhtmltopdf 工具包, 官方下载地址:https://wkhtmltopdf.org/downloads.html ,也可以在 dinktopdf 的官方github:https://github.com/rdvojmoc/dinktopdf/tree/master/v0.12.4  上下载,然后根据你的需要选择 32bit 还是 64bit 。

注册 dinktopdf

要想在 asp.net core 中使用,需要在 configureservices() 方法下将 dinktopdf 注入到 ioc 容器中,下面的代码展示了如何去实现。

 public void configureservices(iservicecollection services)
 {
 services.addsingleton(typeof(iconverter),new synchronizedconverter(new pdftools()));

 services.addcontrollers();
 }

创建 reportservice

基础配置做好之后,接下来我们来写生成 pdf 的业务逻辑,创建一个 ireportservice 和 reportservice 实现类,代码如下:

 public interface ireportservice
 {
 public byte[] generatepdfreport();
 }

 public class reportservice : ireportservice
 {
 private readonly iconverter _converter;
 public reportservice(iconverter converter)
 {
 _converter = converter;
 }
 public byte[] generatepdfreport()
 {
 throw new notimplementedexception();
 }
 }

从上面的代码可以看出,iconverter 实例是通过 构造函数 注入的,接下来可以在 generatepdfreport() 方法中构建生成 pdf 的具体业务逻辑。

 public byte[] generatepdfreport()
 {
 var html = $@"<!doctype html>
 <html lang=""en"">
 <head>
 this is the header of this document.
 </head>
 <body>
 <h1>this is the heading for demonstration purposes only.</h1>
 <p>this is a line of text for demonstration purposes only.</p>
 </body>
 </html>";
 globalsettings globalsettings = new globalsettings();
 globalsettings.colormode = colormode.color;
 globalsettings.orientation = orientation.portrait;
 globalsettings.papersize = paperkind.a4;
 globalsettings.margins = new marginsettings { top = 25, bottom = 25 };
 objectsettings objectsettings = new objectsettings();
 objectsettings.pagescount = true;
 objectsettings.htmlcontent = html;
 websettings websettings = new websettings();
 websettings.defaultencoding = "utf-8";
 headersettings headersettings = new headersettings();
 headersettings.fontsize = 15;
 headersettings.fontname = "ariel";
 headersettings.right = "page [page ] of [topage]";
 headersettings.line = true;
 footersettings footersettings = new footersettings();
 footersettings.fontsize = 12;
 footersettings.fontname = "ariel";
 footersettings.center = "this is for demonstration purposes only.";
 footersettings.line = true;
 objectsettings.headersettings = headersettings;
 objectsettings.footersettings = footersettings;
 objectsettings.websettings = websettings;
 htmltopdfdocument htmltopdfdocument = new htmltopdfdocument()
 {
 globalsettings = globalsettings,
 objects = { objectsettings },
 };
 return _converter.convert(htmltopdfdocument);
 }

然后再将 ireportservice 和 reportservice 注入到 ioc 容器中,如下代码所示:

services.addsingleton<ireportservice, reportservice>();

创建 reportcontroller

generatepdfreport() 方法的业务逻辑构建好之后,现在可以将 ireportservice 实例注入到 reportcontroller 中来最终渲染 pdf,下面的代码展示了如何去实现。

 [route("api/[controller]")]
 [apicontroller]
 public class reportcontroller : controllerbase
 {
 private readonly ireportservice _reportservice;
 public reportcontroller(ireportservice reportservice)
 {
 _reportservice = reportservice;
 }
 [httpget]
 public iactionresult get()
 {
 var pdffile = _reportservice.generatepdfreport();
 return file(pdffile,"application/octet-stream", "simplepdf.pdf");
 }
 }

在 asp.net core 中并没有内置对 pdf 的支持,所以有这方面的需求只能借助于第三方框架,而 dinktopdf 就是这么一款非常优秀的工具包,dinktopdf 是一款用 .net 语言编写的用于包装 c++ 的 wkhtmltopdf 的工具包,它可以非常方便的将 html 转成 pdf ,关于更多 dinktopdf 可参考 github:https://github.com/rdvojmoc/dinktopdf

译文链接:https://www.infoworld.com/article/3605276/how-to-create-pdf-documents-in-aspnet-core-5.html

总结

到此这篇关于asp.net core 5中如何生成pdf文档的文章就介绍到这了,更多相关asp.net core5生成pdf内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!