一款开源社区版免费的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