ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程

简介:

基础教程之导出Pdf收据

说明

本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出

要点

  • 导出PDF数据
  • 自定义PDF模板
  • 导出单据
  • 如何批量导出单据

导出特性

PdfExporterAttribute

  • Orientation: 方向(横向或纵向)
  • PaperKind: 纸张类型(默认A4)
  • IsWriteHtml: 是否输出HTML模板

ExporterHeaderAttribute

DisplayName: 显示名称

主要步骤

1.安装包Magicodes.IE.Pdf

Install-Package Magicodes.IE.Pdf

2.导出PDF数据

  • 创建Dto类
        public class Student
        {
            /// <summary>
            ///     姓名
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            ///     年龄
            /// </summary>
            public int Age { get; set; }
        }
       public async Task ExportPdf()
        {
            var exporter = new PdfExporter();
            var result = await exporter.ExportListByTemplate("test.pdf", new List<Student>()
            {
                new Student
                {
                    Name = "MR.A",
                    Age = 18
                },
                new Student
                {
                    Name = "MR.B",
                    Age = 19
                },
                new Student
                {
                    Name = "MR.B",
                    Age = 20
                }
            });
        }

导出内容如下所示:

通过上述代码我们实现了一个简单的Pdf文件导出,也许这样无法达到我们的要求,我们需要自定义标题,那么请看如下代码

        [PdfExporter(Name = "学生信息")]
        public class Student
        {
            /// <summary>
            ///     姓名
            /// </summary>
            [ExporterHeader(DisplayName = "姓名")]
            [Display(Name = "Display姓名")]
            public string Name { get; set; }
            /// <summary>
            ///     年龄
            /// </summary>
            [ExporterHeader(DisplayName = "年龄")]
            public int Age { get; set; }
        }
  1. PdfExporter 通过Name属性来定义文档标题
  2. ExporterHeader DisplayName用来定义属性名称
  3. Display同样定义属性名称,但是优先级小于ExporterHeader

通过修改上述代码执行结果如下所示:

3.导出PDF收据

  • 创建导出模板
@using DocumentFormat.OpenXml.EMMA
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta charset="utf-8"/>
    <title></title>
    <style type="text/css">
        body { font-family: SimSun !important; }

        p { margin: 0px; }

        footer {
            color: #333;
            font-size: 1.2rem;
            margin-bottom: 1.5rem;
            margin-right: 5%;
            margin-top: 1.2rem;
            text-align: right;
        }

        table,
        td {
            border: 1px solid #444;
            border-collapse: collapse;
            /* text-align: center; */
            height: 2rem;
            padding: 5px;
        }
    </style>
</head>

<body>
<p style="color: #000; font-size: 1.8rem; height: 32px; text-align: center;">
    @Model.Title
</p>
<p style="color: #333; font-size: 1.2rem; margin-left: 5%; margin-top: 1%;">
    <text>NO:@Model.Data.Code</text>
    <text style="padding-left: 52%; text-align: right;">交易时间:@Model.Data.TradeTime.ToString("yyyy-MM-dd HH:mm:ss")</text>
</p>

<table width="90%" style="margin-left: 5%; margin-top: 1%;">
    <tr style="font-size: 1rem;">
        <td style="text-align: center; width: 11%;">交款姓名</td>
        <td colspan="2">@Model.Data.Name</td>
        <td style="text-align: center; width: 13%;">身份证号码</td>
        <td colspan="3">@Model.Data.IdNo</td>
    </tr>
    <tr style="font-size: 1rem;">
        <td style="text-align: center">交易金额</td>
        <td colspan="6">
            <span>¥:@Model.Data.Amount</span>
            <span style="padding: 0 2% 0 2%;">人民币(大写):</span>
            <span>@Model.Data.UppercaseAmount</span>
        </td>
    </tr>
    <tr style="font-size: 1rem;">
        <td style="text-align: center">收款方式</td>
        <td colspan="2">@Model.Data.PaymentMethod</td>
        <td style="text-align: center; width: 13%;">交易状态</td>
        <td colspan="3">@Model.Data.TradeStatus</td>
    </tr>

    <tr style="font-size: 1rem;">
        <td style="text-align: center">收款事由</td>
        <td style="width: 22.3%;">@Model.Data.Remark</td>
        <td style="text-align: center; width: 11%;">入学年级</td>
        <td style="width: 22.3%;" colspan="2">@Model.Data.Grade</td>
        <td style="text-align: center; width: 11%;">专业</td>
        <td style="width: 22.3%;">@Model.Data.Profession</td>
    </tr>


</table>
</body>
</html>
  • 创建Dto类

        [Exporter(Name = "湖南心莱信息科技有限公司电子收款凭证")]
        public class ReceiptInfo
        {
            /// <summary>
            ///     交易时间
            /// </summary>
            public DateTime TradeTime { get; set; }
    
            /// <summary>
            ///     姓名
            /// </summary>
            public string Name { get; set; }
    
            /// <summary>
            ///     身份证
            /// </summary>
            public string IdNo { get; set; }
    
            /// <summary>
            ///     金额
            /// </summary>
            public decimal Amount { get; set; }
    
            /// <summary>
            ///     支付方式
            /// </summary>
            public string PaymentMethod { get; set; }
    
            /// <summary>
            ///     交易状态
            /// </summary>
            public string TradeStatus { get; set; }
    
            /// <summary>
            ///     备注
            /// </summary>
            public string Remark { get; set; }
    
            /// <summary>
            ///     年级
            /// </summary>
            public string Grade { get; set; }
    
            /// <summary>
            ///     专业
            /// </summary>
            public string Profession { get; set; }
    
            /// <summary>
            ///     收款人
            /// </summary>
            public string Payee { get; set; }
    
            /// <summary>
            ///     大写金额
            /// </summary>
            public string UppercaseAmount { get; set; }
    
            /// <summary>
            ///     编号
            /// </summary>
            public string Code { get; set; }
        }
    1. 如上代码片段通过Exporter 特性去指定模板中的Title,当然在我们实际开发中也可以不通过该属性去做指定,毕竟我们这一块也是完全自定义的
  • 怎么使用?

            public async Task ExportReceipt()
            {
                var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates",
                    "receipt.cshtml");
                var tpl = File.ReadAllText(tplPath);
                var exporter = new PdfExporter();
                //此处使用默认模板导出
                var result = await exporter.ExportByTemplate("test.pdf",
                    new ReceiptInfo
                    {
                        Amount = 22939.43M,
                        Grade = "2019秋",
                        IdNo = "43062619890622xxxx",
                        Name = "张三",
                        Payee = "湖南心莱信息科技有限公司",
                        PaymentMethod = "微信支付",
                        Profession = "运动训练",
                        Remark = "学费",
                        TradeStatus = "已完成",
                        TradeTime = DateTime.Now,
                        UppercaseAmount = "贰万贰仟玖佰叁拾玖圆肆角叁分",
                        Code = "19071800001"
                    }, tpl);
            }

通过上述代码我们需要进行指定传递我们模板路径及模板内容,最终导出效果如下:

4.批量导出PDF收据

  • 创建模板

    <!DOCTYPE html>
    
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
    <meta charset="utf-8"/>
    <title></title>
    <style type="text/css">
      body { font-family: SimSun !important; }
    
      p { margin: 0px; }
    
      footer {
          color: #333;
          font-size: 1.2rem;
          margin-bottom: 1.5rem;
          margin-right: 5%;
          margin-top: 1.2rem;
          text-align: right;
      }
    
      table,
      td {
          border: 1px solid #444;
          border-collapse: collapse;
          height: 2rem;
          padding: 5px;
      }
    
      .evenNum {
          margin-bottom: 8%;
          padding-top: 10%;
      }
    </style>
    </head>
    
    <body>
    @for (var i = 0; i < Model.Data.ReceiptInfoInputs.Count; i++)
    {
    <div style="height: 41%; width: 100%;" class="@(i % 2 == 0 ? "" : "evenNum")">
      <p style="color: #000; font-size: 1.8rem; height: 32px; text-align: center;">
          @Model.Data.Title
      </p>
      <p style="color: #333; font-size: 1.2rem; margin-left: 5%; margin-top: 1%;">
          <text>NO:@Model.Data.ReceiptInfoInputs[i].Code</text>
          <text style="padding-left: 52%; text-align: right;">交易时间:@Model.Data.ReceiptInfoInputs[i].TradeTime.ToString("yyyy-MM-dd HH:mm:ss")</text>
      </p>
    
      <table width="90%" style="margin-left: 5%; margin-top: 1%;">
          <tr style="font-size: 1rem;">
              <td style="text-align: center; width: 11%;">交款姓名</td>
              <td colspan="2">@Model.Data.ReceiptInfoInputs[i].Name</td>
              <td style="text-align: center; width: 13%;">身份证号码</td>
              <td colspan="3">@Model.Data.ReceiptInfoInputs[i].IdNo</td>
          </tr>
          <tr style="font-size: 1rem;">
              <td style="text-align: center">交易金额</td>
              <td colspan="6">
                  <span>¥:@Model.Data.ReceiptInfoInputs[i].Amount</span>
                  <span style="padding: 0 2% 0 2%;">人民币(大写):</span>
                  <span>@Model.Data.ReceiptInfoInputs[i].UppercaseAmount</span>
              </td>
          </tr>
          <tr style="font-size: 1rem;">
              <td style="text-align: center">收款方式</td>
              <td colspan="2">@Model.Data.ReceiptInfoInputs[i].PaymentMethod</td>
              <td style="text-align: center; width: 13%;">交易状态</td>
              <td colspan="3">@Model.Data.ReceiptInfoInputs[i].TradeStatus</td>
          </tr>
    
          <tr style="font-size: 1rem;">
              <td style="text-align: center">收款事由</td>
              <td style="width: 22.3%;">@Model.Data.ReceiptInfoInputs[i].Remark</td>
              <td style="text-align: center; width: 11%;">入学年级</td>
              <td style="width: 22.3%;" colspan="2">@Model.Data.ReceiptInfoInputs[i].Grade</td>
              <td style="text-align: center; width: 11%;">专业</td>
              <td style="width: 22.3%;">@Model.Data.ReceiptInfoInputs[i].Profession</td>
          </tr>
    
    
      </table>
    </div>
    }
    </body>
    </html>
  • 创建Dto类

    /// <summary>
    ///     批量导出Dto
    /// </summary>
    [PdfExporter(Orientation = Orientation.Portrait, PaperKind = PaperKind.A5)]
    public class BatchReceiptInfoDto
    {
      /// <summary>
      ///     交易时间
      /// </summary>
      public DateTime TradeTime { get; set; }
    
      /// <summary>
      ///     姓名
      /// </summary>
      public string Name { get; set; }
    
      /// <summary>
      ///     身份证
      /// </summary>
      public string IdNo { get; set; }
    
      /// <summary>
      ///     金额
      /// </summary>
      public decimal Amount { get; set; }
    
      /// <summary>
      ///     支付方式
      /// </summary>
      public string PaymentMethod { get; set; }
    
      /// <summary>
      ///     交易状态
      /// </summary>
      public string TradeStatus { get; set; }
    
      /// <summary>
      ///     备注
      /// </summary>
      public string Remark { get; set; }
    
      /// <summary>
      ///     年级
      /// </summary>
      public string Grade { get; set; }
    
      /// <summary>
      ///     专业
      /// </summary>
      public string Profession { get; set; }
    
      /// <summary>
      ///     大写金额
      /// </summary>
      public string UppercaseAmount { get; set; }
    
      /// <summary>
      ///     编号
      /// </summary>
      public string Code { get; set; }
    }
  • 如何使用

      public async Task BathExportReceipt()
      {
          var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates",
              "batchReceipt.cshtml");
          var tpl = File.ReadAllText(tplPath);
          var exporter = new PdfExporter();
    
          var input = new BatchReceiptInfoInput
          {
              Payee = "湖南心莱信息科技有限公司",
              ReceiptInfoInputs = new List<BatchReceiptInfoDto>()
          };
    
          for (var i = 0; i < 20; i++)
              input.ReceiptInfoInputs.Add(new BatchReceiptInfoDto
              {
                  Amount = 22939.43M,
                  Grade = "2019秋",
                  IdNo = "43062619890622xxxx",
                  Name = "张三",
                  PaymentMethod = "微信支付",
                  Profession = "运动训练",
                  Remark = "学费",
                  TradeStatus = "已完成",
                  TradeTime = DateTime.Now,
                  UppercaseAmount = "贰万贰仟玖佰叁拾玖圆肆角叁分",
                  Code = "1907180000" + i
              });
    
          //此处使用默认模板导出
          var result = await exporter.ExportByTemplate("test.pdf", input, tpl);
      }

通过上述代码我们需要进行指定传递我们模板路径及模板内容,最终导出效果如下:

  1. PdfExporterAttribute Orientation进行方向如横向或纵向
  2. PaperKind 纸张类型(默认A4)

Reference

https://github.com/dotnetcore/Magicodes.IE

目录
相关文章
|
人工智能 自然语言处理 算法
科研论文翻译神器!BabelDOC:开源AI工具让PDF论文秒变双语对照,公式图表全保留
BabelDOC 是一款专为科学论文设计的开源AI翻译工具,采用先进的无损解析技术和智能布局识别算法,能完美保留原文格式并生成双语对照翻译。
3294 67
科研论文翻译神器!BabelDOC:开源AI工具让PDF论文秒变双语对照,公式图表全保留
|
存储 人工智能 API
PDF to Podcast:英伟达开源黑科技!PDF 秒转播客/有声书,告别阅读疲劳轻松学习!
NVIDIA推出的PDF to Podcast工具,基于大型语言模型和文本到语音技术,将PDF文档转换为生动的音频内容。
1121 14
PDF to Podcast:英伟达开源黑科技!PDF 秒转播客/有声书,告别阅读疲劳轻松学习!
|
程序员 开发者
开源项目:一行代码,批量 PDF 转 Word 轻松搞定!
程序员晚枫分享了 `popdf` 的新功能:支持批量 PDF 转 Word!只需简单代码,即可轻松实现单文件或批量转换。`input_path` 和 `output_path` 参数让操作更便捷,适合处理大量 PDF 文件。作为开发者,晚枫致力于解决技术小痛点,欢迎体验并反馈。项目地址:[https://github.com/CoderWanFeng/popdf](https://github.com/CoderWanFeng/popdf)
1217 6
|
人工智能 文字识别 自然语言处理
Vision Parse:开源的 PDF 转 Markdown 工具,结合视觉语言模型和 OCR,识别文本和表格并保持原格式
Vision Parse 是一款开源的 PDF 转 Markdown 工具,基于视觉语言模型,能够智能识别和提取 PDF 中的文本和表格,并保持原有格式和结构。
2380 19
Vision Parse:开源的 PDF 转 Markdown 工具,结合视觉语言模型和 OCR,识别文本和表格并保持原格式
|
人工智能 文字识别 自然语言处理
1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!
Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。
1931 1
|
人工智能 文字识别 数据挖掘
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
MarkItDown 是微软开源的多功能文档转换工具,支持将 PDF、PPT、Word、Excel、图像、音频等多种格式的文件转换为 Markdown 格式,具备 OCR 文字识别、语音转文字和元数据提取等功能。
5360 9
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
|
人工智能 JSON 搜索推荐
猫步简历 - 开源免费AI简历生成器 | 一键导出PDF/JSON
猫步简历是一款免费开源的AI简历生成器,帮助用户轻松创建独特、专业的简历。支持导出超高清PDF、图片、JSON等多种格式,并提供AI智能创作、润色和多语种切换等功能。拥有海量模板、高度定制化模块及完善的后台管理系统,助力求职者脱颖而出。官网:https://maobucv.com,GitHub开源地址:https://github.com/Hacker233/resume-design。
4615 10
|
文字识别 BI API
3.4K star!全能PDF处理神器开源!文档转换/OCR识别一键搞定
PDF-Guru 是一款开箱即用的全能型PDF处理工具,支持跨平台文档转换、智能OCR识别、多格式解析等核心功能。项目采用模块化架构设计,提供简洁的Web界面和API接口,开发者可快速集成到现有系统中。
1357 1
|
XML C# 数据格式
一个.NET开源、免费、功能强大的 PDF 处理工具
一个.NET开源、免费、功能强大的 PDF 处理工具
695 8
|
数据挖掘 BI
.net8 Syncfusion生成pdf/doc/xls/ppt最新版本
通过使用 Syncfusion,您可以高效地生成各种文档,满足不同的业务需求。这些工具不仅易于使用,还具有高性能和高度可扩展性,是处理文档的理想选择。
739 16