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);
