推荐一个开源的现代化的 PDF 生成组件

1f7e1a6db47648734b36009a344a9e49.png

42752487489214be20666ad1ae736299.gif

1918e22ad67a1fb81b5d7aa09d581586.png

你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用!

前言

QuestPDF 是一个开源免费的 .NET 组件库,可以用来生成 PDF 文档。在 Github 上有4千多的 Star。项目充分考虑了 PDF 文档的设计和布局,并且具有完整的分页支持。

QuestPDF 基于著名的图形库 SkiaSharp 创建,可以把您的数据转换为 PDF 文档。它提供了一个高度优化的布局引擎,每个内核每分钟能够生成超过 1000 个 PDF 文件。并且整个过程是线程安全的。

如何使用

你可以在 Nuget 中搜索并安装 QuestPDF。

// Package Manager
Install-Package QuestPDF// .NET CLI
dotnet add package QuestPDF// Package reference in .csproj file
<PackageReference Include="QuestPDF" Version="2022.11.0" />

下面的代码中,我们基于 minimal API,创建了一个简单的 PDF 页面,它真的非常简单。

using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;Document.Create(container =>
{container.Page(page =>{page.Size(PageSizes.A4);page.Margin(2, Unit.Centimetre);page.PageColor(Colors.White);page.DefaultTextStyle(x => x.FontSize(20));page.Header().Text("Hello PDF!").SemiBold().FontSize(36).FontColor(Colors.Blue.Medium);page.Content().PaddingVertical(1, Unit.Centimetre).Column(x =>{x.Spacing(20);x.Item().Text(Placeholders.LoremIpsum());x.Item().Image(Placeholders.Image(200, 100));});page.Footer().AlignCenter().Text(x =>{x.Span("Page ");x.CurrentPageNumber();});});
})
.GeneratePdf("hello.pdf");

生成的 PDF 文件如下:

79b248448b1cffedeb9c754d1d110f64.png

QuestPDF 的 Fluent API 扩展性非常好。即使是复杂的文档也可以轻松创建和维护,你可以在官网找到更多生成复杂文档的示例。

QuestPDF Previewer

QuestPDF Previewer 是一个可以简化和加速开发生命周期的工具,它可以对 PDF 文档进行预览。但真正的魔法在于热重载功能!代码更新后,预览也会同步地实时更新,无需重新编译代码即可获得实时结果,充分释放生产力。

0dd751a5c7ba6a5fba761cf520bded4b.gif


项目地址

在 Dotnet工具箱 公众号内,回复 219‍‍,即可获取项目地址。

a99b08ed8a9b495cdd5fe9bd345dcf0f.jpeg

Dotnet 工具箱

扫码关注我们

435a85c23ab0f3f452cd8c3edb3bd81b.png

分享

a9558f1b7516757e8ba0f9ff77d0871c.png

点收藏

f3037a12de1efc412f1380fcc0511dea.png

点点赞

fd3381eb7096bd8e8b8f8444133a3e91.png

点在看‍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序调用阿里云身份证识别OCR(附带七牛云上传图片)

写在前面&#xff1a;实现的逻辑是拍照上传调用后端封装好的身份证接口&#xff0c;然后同时调用七牛云接口把照片传过去以便后台管理系统审核看1:首选需要这么一张页面接下来就写我是怎么做的首先是布局&#xff08;以下是wxml&#xff09; <view><view classidcard&…

windows 安装yaml支持和pytest支持等

打开cmd 输入pip install pyyaml #yaml文件支持 输入pip install pytest #pytest框架支持 输入pip install requests #requests接口测试支持 输入pip install pyopenssl #openssl支持 前提是电脑上的python已经配置好了转载于:https://www.cnblogs.com/mghhzAnne/p/92…

史上最好记的神经网络结构速记表(上)

本文讲的是史上最好记的神经网络结构速记表&#xff08;上&#xff09;&#xff0c;新的神经网络结构不断涌现&#xff0c;我们很难一一掌握。哪怕一开始只是记住所有的简称&#xff08; DCIGN&#xff0c;BiLSTM&#xff0c;DCGAN &#xff09;&#xff0c;也会让同学们吃不消…

厚积薄发,微软OFFICE云时代宏脚本来临,Excel Srcipt已经推进到桌面端可用

前一阵子&#xff0c;已经发现微软在Excel上发布了Office Script For Excel&#xff0c;当时只能在网页端的Excel上使用&#xff0c;今天打开桌面端的Excel&#xff0c;发现多了一个【自动执行】选项卡。再一次看了下&#xff0c;比起以前的Office Addin&#xff0c;要先进得多…

如何使用Amazon Echo控制您的Eero Wi-Fi网络

Thanks to the power of Alexa and its open API, you’re able to control a vast number of devices using just your voice. If you have an Eero Wi-Fi system, you can even control your home network with the Amazon Echo. 得益于Alexa的强大功能及其开放的API&#xf…

H5在WebView上开发小结

背景 来自我司业务方要求&#xff0c;需开发一款APP。但由于时间限制&#xff0c;只能采取套壳app方式&#xff0c;即原生app内嵌webview展示前端页面。本文主要记述JavaScript与原生app间通信&#xff0c;以及内嵌webview开发时&#xff0c;前端方面可能踩的一些坑。 技术架构…

C#的?和??

1.&#xff1f;&#xff1f; 为了实现Nullable数据类型转换成non-Nullable类型数据&#xff0c;才有的一个操作符&#xff1b; 意义&#xff1a;一变量取值&#xff0c;取符号左边的值&#xff0c;若左边为null&#xff0c;那么取赋值&#xff1f;&#xff1f;右边的&#xff1…

odoo 自定义视图_如何使用Windows的五个模板自定义文件夹视图

odoo 自定义视图If you’re particular about how Windows displays the contents of your folders, you can cut your customization time down considerably by taking advantage of File Explorer’s five built-in folder templates. 如果您特别想知道Windows如何显示文件夹…

C#之ILC和C++的CLR前者更快?

楔子ILC是C#写的&#xff0c;CLR是C。.Net 7中&#xff0c;为何微软执意用一个托管的模型去尝试取代非托管框架呢&#xff1f;至少native code方面它是这么做的这个问题一直萦绕脑海。非托管和托管十年前出版的那本久负盛名的《CLR via C#》至今都是不可或缺的存在&#xff0c;…

历史

python的历史 kfsaldkfsdf fdskfdsa fdsjkafsjda fdshkfjsdja View Codefjdskaffdsjkaffdsjakflsad;fjdsklaf 转载于:https://www.cnblogs.com/jin-xin/articles/10448286.html

typescript+react+antd基础环境搭建

typescriptreactantd基础环境搭建&#xff08;包含样式定制&#xff09; tsconfig.json 配置 // 具体配置可以看上面的链接 这里module moduleResolution的配置都会影响到antd的显示 // allowSyntheticDefaultImports 是antd官网给的配置 必须加上 {"compilerOptions&quo…

最小生成树Prim算法和Kruskal算法

https://www.cnblogs.com/JoshuaMK/p/prim_kruskal.html 转载于:https://www.cnblogs.com/DixinFan/p/9225105.html

如何重新打开Windows防火墙提示?

If you are setting up a new program that needs network access, but are not paying close enough attention, you might end up accidentally causing Windows firewall to block the program. How do you fix such a mistake? Today’s SuperUser Q&A post helps a f…

判断字符串出现次数最多的字符 及 次数

分析 题目的意思大致就是找出每个字符出现的次数&#xff0c;然后比较大小。那么每个字符都应该对应它出现的次数。既然是一一对应的&#xff0c;那我们就想到用对象的key和value来储存字符和其出现的次数。具体做法 新建一个空对象obj 遍历给定的字符串接下来就是最重要的 把字…

AI x 量化:华尔街老司机解密智能投资正确姿势

随着中国经济的腾飞&#xff0c;中产阶级的崛起&#xff0c;投资管理逐渐步入寻常百姓家。 值得注意的是&#xff0c;在十年前“无财可理”问题解决后&#xff0c;另一个矛盾愈发凸显——层次不齐的投资素质。据wind数据统计&#xff0c;2004年至2015年12年间&#xff0c;只有3…

如何远程调试 MAUI blazor / Blazor Hybrid

我们知道浏览器模式下 Blazor 可以使用 F12 打开开发工具,调试js查看页面元素,那当 Maui Blazor 提示烦人的 an unhandled error has occurred 该怎么进行调试呢?1. VS 运行工程于 Debug 模式下,只要 BlazorWebview 控件处于焦点,直接按F12就可以打开开发工具了. 没有焦点就鼠…

笔记本触摸键盘驱动自动禁用_如何为iPad的蓝牙键盘禁用自动更正

笔记本触摸键盘驱动自动禁用The take-for-granted features we enjoy when using an on-screen keyboard—like auto-corrections and auto-capitalization–quickly become a hindrance if you’re using a physical keyboard with your iOS device. Let’s look at how to qu…

发票的作用

目录 发票上的两个章&#xff1a;税种&#xff1a;发票的作用&#xff1a;征税方式&#xff1a;发票限额&#xff1a;参考链接发票上的两个章&#xff1a; 税务局的发票监制章商家的发票专用章税种&#xff1a; 增值税&#xff1a;商家在卖东西时为获利&#xff0c;而提高价格的…

opencv-原图基础上添加指定颜色

前言 项目中需要将某些区域使用不同的颜色表示出来&#xff0c;同时能够看到原图作为底色。 代码 #include "opencv2/highgui/highgui.hpp" #include <opencv2/imgproc.hpp> #include <iostream> using namespace cv;int main() {Mat image imread( &q…

微软发布Azure Application Insights for Node.js 1.0版本

在北美举行的Node.js交互大会上&#xff0c;微软发布了用于Node.js的Application Insights SDK。\\来自微软JavaScript平台和工具部门的高级经理Arunesh Chandra在博客上发布了这一消息&#xff0c;他说&#xff0c;微软“希望能够提升开发者在Azure上构建和运行Node.js应用程序…