Loading

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);
}

 

posted @ 2024-07-12 17:27  Pengxx  阅读(26)  评论(0编辑  收藏  举报