新闻中心

C#如何实现PDF文件生成 QuestPDF库使用教程

2025-12-13
浏览次数:
返回列表
QuestPDF 是 .NET 平台最轻量现代的 PDF 生成库,基于 Fluent API 用 C# 直接描述文档结构,需注册中文字体(如 Noto Sans CJK)以支持中文,安装 via NuGet,.NET 6+ 原生兼容。

c#如何实现pdf文件生成 questpdf库使用教程

用 C# 生成 PDF,QuestPDF 是目前最轻量、现代且易上手的开源库之一。它基于 Fluent API 设计,用 C# 代码直接描述文档结构(类似 HTML + CSS),无需模板引擎或外部依赖,编译即用。

安装 QuestPDF

在项目中通过 NuGet 安装:

  • Visual Studio:右键项目 → “管理 NuGet 包” → 搜索并安装 QuestPDF
  • 命令行:dotnet add package QuestPDF

注意:.NET 6+ 项目可直接使用;若用 .NET Framework,请确认版本兼容性(建议升级至 .NET 6/7/8)。

快速生成一个简单 PDF

以下是最小可运行示例,生成含标题和段落的 PDF:

using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
<p>// 初始化(只需一次,通常放在 Program.cs 或 Startup)
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Element(ComposeContent);
});
})
.GeneratePdf("output.pdf");</p><p>void ComposeContent(IContainer container)
{
container
.PaddingVertical(40)
.Column(column =>
{
column.Item().Text("欢迎使用 QuestPDF!").FontSize(24).Bold();
column.Item().Text("这是一个由 C# 代码生成的 PDF 文档。").FontSize(14);
});
}

运行后会在当前目录生成 output.pdf。关键点:

  • Document.Create 定义整个文档
  • Page 控制页面尺寸、边距、页眉页脚
  • Content() 是主体区域,用 Column/Row/Grid 布局
  • 所有样式(字体、颜色、对齐等)链式调用,直观清晰

常用功能与写法

QuestPDF 支持表格、图片、分页、页码、条件内容等实用特性:

OpenAI Codex OpenAI Codex

可以生成十多种编程语言的工作代码,基于 OpenAI GPT-3 的自然语言处理模型

OpenAI Codex 144 查看详情 OpenAI Codex
  • 表格:用 Table + ColumnsDefinition + Cell 构建,支持自动列宽、跨行跨列
  • 图片:用 .Image(bytes).Image(path),支持缩放、居中、比例约束
  • 页码:在页脚中用 page.Number() + page.TotalPages(),如 "第 {0} 页,共 {1} 页"
  • 条件渲染:C# 的 if / foreach 可直接嵌入布局逻辑,比如只在数据非空时显示某区块
  • 自定义字体:需先注册(支持 TTF/OTF),再用 .Font(...) 应用,中文需指定支持 Unicode 的字体(如 Noto Sans CJK)

中文支持与字体配置

默认不支持中文,需手动加载中文字体:

// 注册字体(推荐放在程序启动时执行一次)
QuestPDF.Settings.License = LicenseType.Community;
FontManager.RegisterFont(File.ReadAllBytes("NotoSansCJKsc-Regular.otf"));
<p>// 使用时指定字体
.Text("你好,世界!").Font("Noto Sans CJK SC");

推荐字体:

  • 免费可商用:Google 的 Noto Sans CJK(SC/TC/JP/KO 版本按需选)
  • 系统字体(Windows):"Microsoft YaHei""SimSun",但跨平台部署需谨慎

未正确注册字体时,中文会显示为空白或方块,这是新手最常遇到的问题。

基本上就这些。QuestPDF 上手快、调试直观、扩展性强,适合报表、合同、发票、导出文档等场景。不复杂但容易忽略字体和布局嵌套层级——多看官方 示例库,5 分钟就能写出专业 PDF。

以上就是C#如何实现PDF文件生成 QuestPDF库使用教程的详细内容,更多请关注其它相关文章!


# 可直接  # 广东软文营销推广排名前十  # 南昌红谷滩网站推广公司  # 泰州网站建设思政课教案  # 营销推广月活动启动  # 晋城seo优化案例  # 网站平台推广销售话术  # 青海网站优化效果怎么样  # 哈尔滨网站优化电池流程  # 营销如何去推广销售服务  # 团风自媒体推广网站  # 自然语言  # 这是  # 最轻  # 不规范  # 解决办法  # css  # 链式  # 如何实现  # 放在  # 文档  # .net  # c#  # google  # microsoft  # win  # pdf  # ai  # windows  # go  # html 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Linux如何排查内存不足OOME问题_LinuxOOM分析教程  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  CSS Box Model与弹性按钮:维持布局稳定的动画实践  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  高德地图公交到站提醒失败如何解决 高德提醒权限设置  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Python多版本共存与虚拟环境管理深度指南  优化Django表单:提交验证失败后保留用户输入  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  菜鸟取件码是什么怎么查 最全查询渠道汇总  J*aScript类型检查_j*ascript代码规范  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  Lar*el 递归关系中排除指定分支的教程  J*aScript数据结构转换:将对象数组按类别分组  Log4j Console Appender性能瓶颈与高并发优化策略  解决Tabulator日期时间排序问题的专业指南  晋江读书网页版在线登录 晋江读书电脑版官网  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  Angular Material 垂直步进器:实现底部到顶部排序的教程  从OpenAI API响应中高效提取生成文本  Python中高效访问嵌套字典与列表中的键值对  CSS子选择器:如何区分并样式化嵌套列表的子层级  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  解决Python logging 中 datefmt 导致时间戳固定不变的问题  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  如何仅使用CSS更改登录界面背景图像图标的颜色  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  excel如何生成目录 excel一键生成工作表目录超链接  React/Next.js中实现列表项的动态选择与移动  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  深入理解Go语言中的指针类型:以*string为例  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址 

搜索