前言 在.NET平台中操作生成PDF的类库有很多如常见的有iTextSharp、PDFsharp、Aspose.PDF等,今天我们分享一个用于生成PDF文档的现代开源.NET库:QuestPDF,本文将介绍QuestPDF并使用它快速实现发票PDF文档生成功能。
QuestPDF介绍 QuestPDF 是一个用于生成 PDF 文档的现代开源 .NET 库。QuestPDF 由简洁易用的 C# Fluent API 提供全面的布局引擎。轻松生成 PDF 报告、发票、导出等。QuestPDF它提供了一个布局引擎,在设计时考虑了完整的分页支持。与其他库不同,它不依赖于 HTML 到 PDF 的转换,这在许多情况下是不可靠的。相反,它实现了自己的布局引擎,该引擎经过优化,可以满足所有与分页相关的要求。
QuestPDF License 分为社区版、专业版、和企业版。
项目源代码 
创建一个控制台应用 创建一个名为QuestPDFExercise的控制台应用。
安装QuestPDF Nuget包 搜索:QuestPDF包进行安装。
快速实现发票PDF文档生成 创建InvoiceModel namespace QuestPDFExerciseset ; }set ; }set ; }set ; }set ; }set ; }set ; }set ; }set ; }set ; }CreateInvoiceDetails namespace QuestPDFExercisereadonly  Random _random = new Random();GetInvoiceDetails return  new InvoiceModel"追逐时光者" ,"DotNetGuide技术社区" ,"DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。" GenerateRandomOrderItemInfo return  new OrderItemCreateInvoiceDocument using QuestPDF.Fluent;"dotnetguide.png" );" / " );#region 构建页眉部分 "发票编号 #{Model.InvoiceNumber}" ).FontFamily("fangsong" ).FontSize(20).SemiBold().FontColor(Colors.Blue.Medium);"发行日期: " ).FontFamily("fangsong" ).FontSize(13).SemiBold();"{Model.IssueDate:d}" );"终止日期: " ).FontFamily("fangsong" ).FontSize(13).SemiBold();"{Model.DueDate:d}" );#endregion #region 构建内容部分 "卖方公司名称" , Model.SellerCompanyName));"客户公司名称" , Model.CustomerCompanyName));"总计: {totalPrice}" ).FontFamily("fangsong" ).SemiBold();if  (!string.IsNullOrWhiteSpace(Model.Comments))"container" >container</param>"#" ).FontFamily("fangsong" );"消费类型" ).Style(headerStyle).FontFamily("fangsong" );"花费金额" ).Style(headerStyle).FontFamily("fangsong" );"数量" ).Style(headerStyle).FontFamily("fangsong" );"总金额" ).Style(headerStyle).FontFamily("fangsong" );in  Model.OrderItems)"{index}" ).FontFamily("fangsong" );"fangsong" );"{item.Price}" ).FontFamily("fangsong" );"{item.Quantity}" ).FontFamily("fangsong" );"{item.Price * item.Quantity}" ).FontFamily("fangsong" );#endregion #region 构建页脚部分 "DotNetGuide技术社区介绍" ).FontSize(14).FontFamily("fangsong" ).SemiBold();"fangsong" );#endregion "fangsong" ).SemiBold();"fangsong" );Program using QuestPDF.Infrastructure;false ;完整示例源代码 https://github.com/YSGStudyHards/DotNetExercises
示例运行效果图 
注意运行时需要把dotnetguide.png图片放到bin\Debug\net8.0文件夹目录中,否则会读不到图片报错:
注意问题 中文报异常 QuestPDF.Drawing.Exceptions.DocumentDrawingException:“Could not find an appropriate font fallback for  glyph: U-53D1 '发' . Font families available on current environment that contain this glyph: Microsoft JhengHei, Microsoft JhengHei UI, Microsoft YaHei, Microsoft YaHei UI, SimSun, NSimSun, DengXian, FangSong, KaiTi, SimHei, FZCuHeiSongS-B-GB. Possible solutions: 1) Use one of the listed fonts as the primary font in  your document. 2) Configure the fallback TextStyle using the 'TextStyle.Fallback'  method with one of the listed fonts. You can disable  this check by setting the 'Settings.CheckIfAllTextGlyphsAreAvailable'  option to 'false' . However, this may result with text glyphs being incorrectly rendered without any warning.”加上这段代码: 
// 2、禁用QuestPDF库中文本字符可用性的检查false ;原因: 
默认情况下,使用 QuestPDF 生成 PDF 文档时,它会检查所使用的字体是否支持文本中的所有字符,并在发现不能显示的字符时输出一条警告消息。这个选项可以确保文本中的所有字符都能正确地显示在生成的 PDF 文件中。
中文乱码问题 
解决方案: 
假如Text("")中为汉字一定要在后面加上FontFamily("fangsong")[仿宋字体]或FontFamily("simhei")[黑体字体],否则中文无法正常显示。
项目源码地址 更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。
阅读原文:点击此处