C#使用 QuestPDF 制作并导出PDF
1、QuestPDF 简介
一款开源社区版免费的PDF制作工具,QuestPDF:Introduction | QuestPDF- 可自定义页眉、页脚、分页信息
- 可嵌入表格、图片等
- .net6 及其后续平台支持实时预览(基于热更新)debug 预览(需单独安装 QuestPDF Previewer Document previewer | QuestPDF)
2、Demo 效果示例
3、Demo 代码
public async Task<(string, Stream)> ExportPDFByQuestPDFDemo() { // 准备导出测试数据 var dataList = new string[][] { ["code1", "name1", "name2", "name3"], ["code2", "name1", "name2", "name3"], ["code3", "name1", "name2", "name3"], ["code4", "name1", "name2", "name3"], ["code5", "name1", "name2", "name3"], }; // 电子签名图片 var nodeUserSignImgMaps = new Dictionary<string, byte[]>() { { "applyUser", File.ReadAllBytes("C:\\Users\\hp\\Desktop\\sign.png") } }; // 设置 License & 使用字体 QuestPDF.Settings.License = LicenseType.Community; var fontPath = HttpServerUtilityHelper.MapPath("/Resources/Fonts/simsun.ttc"); FontManager.RegisterFontWithCustomName("simsun", File.OpenRead(fontPath)); var document = Document .Create(container => { container .Page(page => { // 页面配置 page.Size(PageSizes.A4); page.MarginHorizontal(30); page.MarginVertical(30); page.DefaultTextStyle(x => x.FontFamily("simsun")); // 背景文字 page.Background() .AlignCenter() .AlignMiddle() .Width(PageSizes.A4.Width) .TranslateX(PageSizes.A4.Width / 6) .TranslateY(PageSizes.A4.Height / 4) .Rotate(-45) .Text("这是水印") .AlignCenter() .FontSize(35) .Bold() .FontColor(QuestPDF.Infrastructure.Color.FromHex("D3D3D3")); // 页眉 page.Header() .Height(35) .AlignCenter() .AlignMiddle() .SetText("XX申请单") .Bold() .FontSize(18); page.Content().Element(TableContent); // 页脚:分页信息 page.Footer() .AlignCenter() .AlignBottom() .Text(text => { text.DefaultTextStyle(x => x.Size(10)); text.CurrentPageNumber(); text.Span("/"); text.TotalPages(); }); void TableContent(IContainer container) { container.Table(table => { #region 设置列总数及宽度 table.ColumnsDefinition(columns => { columns.ConstantColumn(25); // 固定宽度 columns.RelativeColumn(); columns.RelativeColumn(); columns.RelativeColumn(); columns.RelativeColumn(); }); #endregion #region 固定列头 table.Header(header => { // please be sure to call the 'header' handler! header.Cell().ColumnSpan(3).PaddingVertical(5).SetText($"申请单号:20240712"); header.Cell().ColumnSpan(2).PaddingVertical(5).SetText($"申请日期:{DateTime.Now.ToShortTimeString()}"); #region 标题 (CellStyleForSign 为自定义样式) header.Cell().Element(CellStyleForSign).SetText("序号"); header.Cell().Element(CellStyleForSign).SetText("编码"); header.Cell().Element(CellStyleForSign).SetText("名称1"); header.Cell().Element(CellStyleForSign).SetText("名称2"); header.Cell().Element(CellStyleForSign).SetText("名称3"); #endregion }); #endregion #region 数据列表 if (!dataList.IsNullOrEmpty()) { for (int i = 0; i < dataList.Length; i++) { // 序号列 table.Cell().Element(CellStyle).ShowEntire().SetText($"{i + 1}"); // 当前行其他数据 var rowData = dataList[i]; for (int j = 0; j < rowData.Length; j++) { table.Cell().Element(CellStyle).ShowEntire().SetText(rowData[j]); } } } else { for (int i = 0; i < 5; i++) { table.Cell().Element(CellStyleForSign).SetText(""); } } #endregion #region 添加电子签名图片到PDF某行(示例) table.Cell().ColumnSpan(2).Element(CellStyleForSign).PaddingVertical(5).SetText($"申请人"); if (nodeUserSignImgMaps.ContainsKey("applyUser")) { table.Cell().ColumnSpan(3).SetImage(nodeUserSignImgMaps["applyUser"]); } else { table.Cell().ColumnSpan(3).Element(CellStyleForSign).SetText($""); } #endregion }); } }); }); // debug 预览(需单独安装 QuestPDF Previewer https://www.questpdf.com/document-previewer.html#installation) //document.ShowInPreviewer(); var ms = new MemoryStream(); document.GeneratePdf(ms); ms.Seek(0, SeekOrigin.Begin); var fileName = $"领用申请单({DateTime.Now.ToString("yyyyMMdd")}).pdf"; return new(fileName, ms); }
本文来自博客园,作者:Pengxx,转载请注明原文链接:https://www.cnblogs.com/pengxx/p/18293763
“先从0到1,再从1到100”