首页 > 编程语言 >C#使用 QuestPDF 制作并生成PDF

C#使用 QuestPDF 制作并生成PDF

时间:2024-07-12 17:30:52浏览次数:11  
标签:C# SetText Element Cell header table QuestPDF PDF

一款开源社区版免费的PDF制作工具,QuestPDF:Introduction | QuestPDF

  • 可自定义页眉、页脚、分页信息
  • 可嵌入表格、图片等
  • .net6 及其后续平台支持实时预览(基于热更新)debug 预览(需单独安装 QuestPDF Previewer Document previewer | QuestPDF

 

demo 代码

  1 public async Task<(string, Stream)> ExportPDFByQuestPDFDemo()
  2 {
  3     // 准备导出测试数据
  4     var dataList = new string[][]
  5     {
  6         ["code1", "name1",  "name2", "name3"],
  7         ["code2", "name1",  "name2", "name3"],
  8         ["code3", "name1",  "name2", "name3"],
  9         ["code4", "name1",  "name2", "name3"],
 10         ["code5", "name1",  "name2", "name3"],
 11     };
 12 
 13     // 电子签名图片
 14     var nodeUserSignImgMaps = new Dictionary<string, byte[]>()
 15     {
 16         { "applyUser", File.ReadAllBytes("C:\\Users\\hp\\Desktop\\sign.png") }
 17     };
 18 
 19     // 设置 License & 使用字体
 20     QuestPDF.Settings.License = LicenseType.Community;
 21     var fontPath = HttpServerUtilityHelper.MapPath("/Resources/Fonts/simsun.ttc");
 22     FontManager.RegisterFontWithCustomName("simsun", File.OpenRead(fontPath));
 23 
 24     var document = Document
 25         .Create(container =>
 26         {
 27             container
 28                 .Page(page =>
 29                 {
 30                     // 页面配置
 31                     page.Size(PageSizes.A4);
 32                     page.MarginHorizontal(30);
 33                     page.MarginVertical(30);
 34                     page.DefaultTextStyle(x => x.FontFamily("simsun"));
 35 
 36                     // 背景文字
 37                     page.Background()
 38                         .AlignCenter()
 39                         .AlignMiddle()
 40                         .Width(PageSizes.A4.Width)
 41                         .TranslateX(PageSizes.A4.Width / 6)
 42                         .TranslateY(PageSizes.A4.Height / 4)
 43                         .Rotate(-45)
 44                         .Text("这是水印")
 45                         .AlignCenter()
 46                         .FontSize(35)
 47                         .Bold()
 48                         .FontColor(QuestPDF.Infrastructure.Color.FromHex("D3D3D3"));
 49 
 50                     // 页眉
 51                     page.Header()
 52                         .Height(35)
 53                         .AlignCenter()
 54                         .AlignMiddle()
 55                         .SetText("XX申请单")
 56                         .Bold()
 57                         .FontSize(18);
 58 
 59                     page.Content().Element(TableContent);
 60 
 61                     // 页脚:分页信息
 62                     page.Footer()
 63                     .AlignCenter()
 64                     .AlignBottom()
 65                     .Text(text =>
 66                     {
 67                         text.DefaultTextStyle(x => x.Size(10));
 68                         text.CurrentPageNumber();
 69                         text.Span("/");
 70                         text.TotalPages();
 71                     });
 72 
 73                     void TableContent(IContainer container)
 74                     {
 75                         container.Table(table =>
 76                         {
 77                             #region 设置列总数及宽度
 78                             table.ColumnsDefinition(columns =>
 79                             {
 80                                 columns.ConstantColumn(25); // 固定宽度
 81                                 columns.RelativeColumn();
 82                                 columns.RelativeColumn();
 83                                 columns.RelativeColumn();
 84                                 columns.RelativeColumn();
 85                             });
 86                             #endregion
 87 
 88                             #region 固定列头
 89                             table.Header(header =>
 90                             {
 91                                 // please be sure to call the 'header' handler!
 92                                 header.Cell().ColumnSpan(3).PaddingVertical(5).SetText($"申请单号:20240712");
 93                                 header.Cell().ColumnSpan(2).PaddingVertical(5).SetText($"申请日期:{DateTime.Now.ToShortTimeString()}");
 94 
 95                                 #region 标题 (CellStyleForSign 为自定义样式)
 96                                 header.Cell().Element(CellStyleForSign).SetText("序号");
 97                                 header.Cell().Element(CellStyleForSign).SetText("编码");
 98                                 header.Cell().Element(CellStyleForSign).SetText("名称1");
 99                                 header.Cell().Element(CellStyleForSign).SetText("名称2");
100                                 header.Cell().Element(CellStyleForSign).SetText("名称3");
101                                 #endregion
102                             });
103                             #endregion
104 
105                             #region 数据列表
106                             if (!dataList.IsNullOrEmpty())
107                             {
108                                 for (int i = 0; i < dataList.Length; i++)
109                                 {
110                                     // 序号列
111                                     table.Cell().Element(CellStyle).ShowEntire().SetText($"{i + 1}");
112 
113                                     // 当前行其他数据
114                                     var rowData = dataList[i];
115                                     for (int j = 0; j < rowData.Length; j++)
116                                     {
117                                         table.Cell().Element(CellStyle).ShowEntire().SetText(rowData[j]);
118                                     }
119                                 }
120                             }
121                             else
122                             {
123                                 for (int i = 0; i < 5; i++)
124                                 {
125                                     table.Cell().Element(CellStyleForSign).SetText("");
126                                 }
127                             }
128                             #endregion
129 
130                             #region 添加电子签名图片到PDF某行(示例)
131                             table.Cell().ColumnSpan(2).Element(CellStyleForSign).PaddingVertical(5).SetText($"申请人");
132                             if (nodeUserSignImgMaps.ContainsKey("applyUser"))
133                             {
134                                 table.Cell().ColumnSpan(3).SetImage(nodeUserSignImgMaps["applyUser"]);
135                             }
136                             else
137                             {
138                                 table.Cell().ColumnSpan(3).Element(CellStyleForSign).SetText($"");
139                             }
140                             #endregion
141 
142                         });
143                     }
144 
145                 });
146         });
147 
148     // debug 预览(需单独安装 QuestPDF Previewer https://www.questpdf.com/document-previewer.html#installation)
149     //document.ShowInPreviewer();
150 
151     var ms = new MemoryStream();
152     document.GeneratePdf(ms);
153     ms.Seek(0, SeekOrigin.Begin);
154 
155     var fileName = $"领用申请单({DateTime.Now.ToString("yyyyMMdd")}).pdf";
156     return new(fileName, ms);
157 }

 

标签:C#,SetText,Element,Cell,header,table,QuestPDF,PDF
From: https://www.cnblogs.com/pengxx/p/18293763

相关文章

  • 51单片机:实现CSGO中C4下包功能(附功能实现视频和代码详解)
    目录一、功能实现二、功能简介1.矩阵键盘输入密码2.S11确认输入密码3.启用蜂鸣器三、模块化代码1.Buzzer.h2.Buzzer.c3.MatrixKey.h4.MatrixKey.c5.LCD1602.h6.LCD1602.c7.Delay.h8.Delay.c四、主函数五、Keil5界面一、功能实现51单片机实现CSGO中C4下包......
  • C语言函数详解
    文章目录函数的概念库函数库函数的使⽤⽅法⾃定义函数形参和实参基本的传参类型嵌套调⽤链式访问多个⽂件函数的概念数学中我们其实就⻅过函数的概念,⽐如:⼀次函数y=kx+b,k和b都是常数,给⼀个任意的x,就得到⼀个y值。其实在C语⾔也引⼊函数(function)的概念,有些翻译为......
  • vue-print-nb 打印 clickMounted 回调为何不触发
    <template><div><divid="printMe"><el-table:data="tableData"style="width:100%;"><el-table-columnprop="date"label="Date"width=&quo......
  • Visual Studio 2013俄语环境基石:‘mfc120rus.dll’解析与丢失修复全案
    mfc120rus.dll是一个动态链接库(DLL)文件,与MicrosoftFoundationClasses(MFC)相关。MFC是一个广泛使用的C++类库,用于简化Windows应用程序的开发。mfc120rus.dll特别地,是MFC库的俄语版本,用于支持俄语字符集和语言环境,它是MFC12.0版本的一部分,常用于VisualStudio2013中编译的......
  • Neuralink 将启动第二例人类脑机芯片植入;多项 Claude 3.5 Sonnet AI 工具发布丨RTE 开
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,......
  • 在ubantu系统中部署ChatGLM-6B
    ChatGLM-6B介绍ChatGLM-6B是一个开源的、支持中英双语的对话语言模型,基于GeneralLanguageModel(GLM)架构,具有62亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4量化级别下最低只需6GB显存)。ChatGLM-6B使用了和ChatGPT相似的技术,针对中文问答......
  • ThreadPoolExector
    JavaThreadPool使用线程池的好处:减少资源的浪费:创建、销毁、切换线程需要消耗系统资源,通过使用线程池可以降低消耗。增加可管理度:通过线程池的同一管理,能够实现线程的更好的管理。提高相应速度:当任务到来时,无需在创建线程,直接就能对任务进行反馈Java线程池的使用线程池......
  • then catch 简易写法
    为了捕获上一步then中的promise结果,必须在上一步return;关闭遮罩层,放在finally中,即无论成功或失败都要执行;archiveAction(actionType,row){constids=row&&row.id?row.id:this.ids;consttip=row&&row.id?`“${row.projectName}”`:......
  • Rocky Linux/Redhat8运行Calibre2022报错:Software tree is for environment VCO=aoj
    运行出现了错误:virserver.tclerror:ERROR:CurrentexecutionenvironmentisVCO=aok.SoftwaretreeisforenvironmentVCO=aoj。即calibre软件版本为aoj,但当前的环境是aok。从官网查询calibre的roadmap:http://calibre.mentorcloudservices.com/docs/Calibre_OS_Roadmap.......
  • C. Tree Infection
    https://codeforces.com/problemset/problem/1665/C题目解析很显然,树的节点感染只会在兄弟节点之间,每层独立的兄弟节点都得感染至少一个,然后让他自由扩展(时间差),那么很显然第一遍就是每层都得感染。感染的次序就是按照兄弟节点的数量降序,并且要加上1的单独节点。然后如果vis-(i......