如何在ASP.NETCore5中生成PDF

本文转载自微信公众号「码农读书」,作者码农读书。转载本文请联系码农读书公众号。

站在用户的角度思考问题,与客户深入沟通,找到通州网站设计与通州网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站制作、网站设计、企业官网、英文网站、手机端网站、网站推广、申请域名雅安服务器托管、企业邮箱。业务覆盖通州地区。

大家用 ASP.NET Core 进行项目开发时,常会有生成 PDF 的需求,那如何生成呢?这篇文章我们就来讨论如何通过 DinkToPdf 来生成 PDF 文档,DinkToPdf 封装了 C++ 的 wkhtmltopdf 工具包,前者通过 P/Invoke 的方式来调用后者,而底层的 wkhtmltopdf 利用 Qt WebKit 渲染引擎将 html 转成 pdf。

安装 DinkToPdf

要想安装 DinkToPdf,可以通过 Nuget 可视化界面或者通过 NuGet Package Manager Console 命令行工具输入以下命令:

 
 
 
 
  1. 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 容器中,下面的代码展示了如何去实现。

 
 
 
 
  1. public void ConfigureServices(IServiceCollection services)
  2.         {
  3.             services.AddSingleton(typeof(IConverter),new SynchronizedConverter(new PdfTools()));
  4.             services.AddControllers();
  5.         }

创建 ReportService

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

 
 
 
 
  1. public interface IReportService
  2.     {
  3.         public byte[] GeneratePdfReport();
  4.     }
  5.     public class ReportService : IReportService
  6.     {
  7.         private readonly IConverter _converter;
  8.         public ReportService(IConverter converter)
  9.         {
  10.             _converter = converter;
  11.         }
  12.         public byte[] GeneratePdfReport()
  13.         {
  14.             throw new NotImplementedException();
  15.         }
  16.     }

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

 
 
 
 
  1. public byte[] GeneratePdfReport()
  2. {
  3.     var html = $@"
  4.                    
  5.                    
  6.                    
  7.                        This is the header of this document.
  8.                    
  9.                   
  10.                   

    This is the heading for demonstration purposes only.

  11.                   

    This is a line of text for demonstration purposes only.

  12.                   
  13.                   
  14.                   ";
  15.     GlobalSettings globalSettings = new GlobalSettings();
  16.     globalSettings.ColorMode = ColorMode.Color;
  17.     globalSettings.Orientation = Orientation.Portrait;
  18.     globalSettings.PaperSize = PaperKind.A4;
  19.     globalSettings.Margins = new MarginSettings { Top = 25, Bottom = 25 };
  20.     ObjectSettings objectSettings = new ObjectSettings();
  21.     objectSettings.PagesCount = true;
  22.     objectSettings.HtmlContent = html;
  23.     WebSettings webSettings = new WebSettings();
  24.     webSettings.DefaultEncoding = "utf-8";
  25.     HeaderSettings headerSettings = new HeaderSettings();
  26.     headerSettings.FontSize = 15;
  27.     headerSettings.FontName = "Ariel";
  28.     headerSettings.Right = "Page [page] of [toPage]";
  29.     headerSettings.Line = true;
  30.     FooterSettings footerSettings = new FooterSettings();
  31.     footerSettings.FontSize = 12;
  32.     footerSettings.FontName = "Ariel";
  33.     footerSettings.Center = "This is for demonstration purposes only.";
  34.     footerSettings.Line = true;
  35.     objectSettings.HeaderSettings = headerSettings;
  36.     objectSettings.FooterSettings = footerSettings;
  37.     objectSettings.WebSettings = webSettings;
  38.     HtmlToPdfDocument htmlToPdfDocument = new HtmlToPdfDocument()
  39.     {
  40.         GlobalSettings = globalSettings,
  41.         Objects = { objectSettings },
  42.     };
  43.     return _converter.Convert(htmlToPdfDocument);
  44. }

然后再将 IReportService 和 ReportService 注入到 IOC 容器中,如下代码所示:

 
 
 
 
  1. services.AddSingleton();

创建 ReportController

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

 
 
 
 
  1. [Route("api/[controller]")]
  2.  [ApiController]
  3.  public class ReportController : ControllerBase
  4.  {
  5.      private readonly IReportService _reportService;
  6.      public ReportController(IReportService reportService)
  7.      {
  8.          _reportService = reportService;
  9.      }
  10.      [HttpGet]
  11.      public IActionResult Get()
  12.      {
  13.          var pdfFile = _reportService.GeneratePdfReport();
  14.          return File(pdfFile,"application/octet-stream", "SimplePdf.pdf");
  15.      }
  16.  }

在 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.NETCore5中生成PDF
链接URL:http://www.shufengxianlan.com/qtweb/news1/10651.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联