QuestPDF 官方API文档
介绍
QuestPDF 是一个用于生成 PDF 文档的开源 .NET 库。
它提供了一个布局引擎,设计时考虑了完整的分页支持。该文档由许多简单的元素(例如边框、背景、图像、文本、填充、表格、网格等)组成,这些元素组合在一起以创建更复杂的结构。这样,作为开发人员,您可以了解每个元素的行为并充满信心地使用它们。此外,文档及其所有元素都支持分页功能。例如,一个元素可以移动到下一页(如果没有足够的空间)或者甚至像表格的行一样在页面之间拆分。
与其他库不同,它不依赖于在许多情况下不可靠的 HTML 到 PDF 的转换。相反,它实现了自己的布局引擎,该引擎经过优化以涵盖所有与分页相关的要求。
快速入门
安装
该库以 NuGet 包的形式提供。您可以像从 IDE 中安装任何其他 NuGet 包一样安装它。
// 程序包管理器 Install-Package QuestPDF // .NET CLI dotnet add package QuestPDF // .csproj文件中的包引用 <PackageReference Include="QuestPDF" Version="2022.12.1" />
示例
使用 QuestPDF 开始制作原型有多容易?由于其最小的 API,真的很容易!请分析下面的代码:
using System; using System.Windows.Forms; using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; namespace NETtoPDF { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Document.Create(container => { container.Page(page => { page.Size(PageSizes.A5); page.Margin(2, Unit.Centimetre); page.PageColor(Colors.White); page.DefaultTextStyle(x => x.FontSize(12).FontFamily("黑体")); page.Background().Image("D:\\VS2022\\NETtoPDF\\167979257449892.jpg"); page.Header(); page.Content() .PaddingVertical(1, Unit.Centimetre) .Column(x => { x.Spacing(20); x.Item().Text("这是一个PDF文件").FontSize(26).FontColor(Colors.Blue.Medium); x.Item().Text("这是使用QuestPDF NET组件生成的PDF文件,文件的大小可能会受到字体的样式影响。"); x.Item().Image("D:\\VS2022\\NETtoPDF\\167979257449892.jpg"); }); page.Footer() .AlignCenter() .Text(x => { x.Span("当前页 "); x.CurrentPageNumber(); }); }); }).GeneratePdf("hello.pdf"); } } }
示例效果图:
视觉元素
Text
一般使用默认或自定义样式绘制文本,文本总是占用尽可能少的空间。如果文本字符串很长,则元素可能占据整个宽度并中断到下一行。此元素支持分页。
1、“文本”方法,如下所示:
//直接输出文字,需要文件配置默认的字体(中文) .Text("这是一个PDF文件"); //设置字体颜色、大小 .Text("这是一个PDF文件").FontColor("#F00").FontSize(24)
2、“文本块”方法,如下所示:
//文本块方法 .Text(text => { text.Span("关关雎鸠,在河之洲。"); //下划线 text.Span("窈窕淑女,君子好逑。").Underline(); });
3、基本字体样式
//字体颜色 x.Item().Text("测试字体基本样式").FontColor("#F00"); //字体格式 x.Item().Text("测试字体基本样式").FontFamily("黑体"); //字体字号 x.Item().Text("测试字体基本样式").FontSize(24); //行间距 x.Item().Text("测试字体基本样式").LineHeight(1.5f); //斜体 x.Item().Text("测试字体基本样式").Italic(); //字体背景色 x.Item().Text("测试字体基本样式").BackgroundColor("#f00"); //中划线 x.Item().Text("测试字体基本样式").Strikethrough(); //下划线 x.Item().Text("测试字体基本样式").Underline(); //下标 x.Item().Text(t => { t.Span("CM"); t.Span("2").Subscript(); }); //上标 x.Item().Text(t => { t.Span("CM"); t.Span("2").Superscript(); }); //字体排列方式 x.Item().Text(text => { //左对齐 text.AlignLeft(); //居中 text.AlignCenter(); //右对齐 text.AlignRight(); text.Span("Sample text"); });
4、定义默认字体样式
//用于文件页面默认样式设定 container.Page(page => { page.DefaultTextStyle(x => x.FontSize(12).FontFamily("黑体")); }); //用于文本块默认样式设定 x.Item().Text(t => { t.DefaultTextStyle(tt => tt.FontSize(12).FontFamily("黑体").FontColor(Colors.Blue.Medium)); t.Line("第一行文本"); t.Line("第二行文本").Underline(); });
5、字体由细到粗
注意,并非所有字体都支持每种样式,QuestPDF将匹配最接近的可用样式
.Weight(FontWeight.Normal) .Thin() .ExtraLight() .Light() .NormalWeight() .Medium() .SemiBold() .Bold() .ExtraBold() .Black() .ExtraBlack()
6、一些特殊的用法
//设置样式 var highlight = TextStyle.Default.BackgroundColor(Colors.Green.Lighten3); //赋值样式Text Text.Span("E=mc").Style(highlight); //换行 Text.EmptyLine(); //行与字母设置方式 .Column(column => { //设置间距数组 var lineHeights = new[] { 0.8f, 1f, -1.5f }; //遍历间距数组 foreach (var lineHeight in lineHeights) { //行项目 column //行项目 .Item() //边框1 .Border(1) //边距 .Padding(10) //输出内容 .Text("行内容") //字体大小 .FontSize(16) //行间距,可以为负值 .LineHeight(lineHeight) //字符间距,可以为负值 .LetterSpacing(lineHeight); } });
7、定义自定义样式类
public static class Typography { public static TextStyle Title => TextStyle .Default .FontType("Helvetica") .FontColor(Colors.Black) .FontSize(20) .Bold(); public static TextStyle Headline => TextStyle .Default .FontType("Helvetica") .FontColor(Colors.Blue.Medium) .FontSize(14); public static TextStyle Normal => TextStyle .Default .FontType("Helvetica") .FontColor("#000000") .FontSize(10) .LineHeight(1.25f) .AlignLeft(); }
然后,可以通过以下方式使用预定义的排版:
.Text("自定义的文本样式").Style(Typography.Headline)
Images
此元素可用于在文档中放置图像。
默认情况下,“图像”会保留图像的纵横比。
图像被加载到SkiaSharp.image对象中。请注意,所有限制都是派生的。例如,可用的图像格式可能因平台而异。
您可以使用任何常见光栅格式的图像,例如JPG、PNG、BMB等。
// 可以提供如下图像: // 1) 二进制数组 byte[] imageData = File.ReadAllBytes("167979257449892.jpg"); x.Item().Image(imageData); // 2) 文件名称 x.Item().Image("167979257449892.jpg"); // 3) 文件流 var stream = new FileStream("167979257449892.jpg", FileMode.Open); x.Item().Image(stream);