基础教程之导出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

ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程的更多相关文章

  1. 开源导入导出库Magicodes.IE 导出教程

    要点 导出特性 如何导出Excel表头 如何导出数据.如何进行数据的切割.如何使用筛选器 导出特性 ExporterAttribute Name: 名称(当前Sheet 名称) HeaderFontS ...

  2. ASP.NET 开源导入导出库Magicodes.IE 完成Excel图片导入导出

    Magicodes.IE Excel图片导入导出 为了更好的根据实际功能来迭代,从2.2的里程碑规划开始,我们将结合社区的建议和意见来进行迭代,您可以点此链接来提交您的意见和建议: https://g ...

  3. ASP.NET 开源导入导出库Magicodes.IE 完成Csv导入导出

    Magicodes.IE Csv导入导出 说明 本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出. 主要步骤 1.安装包Magicodes.IE.Csv Install-Pack ...

  4. ASP.NET 开源导入导出库Magicodes.IE 多Sheet导入教程

    多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导入 多个不同格式的Sheet数据导入 ...

  5. .NET 开源导入导出库 Magicodes.IE 2.5发布

    今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...

  6. 开源导入导出库Magicodes.IE 多sheet导入教程

    原文作者:tanyongzheng 多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导 ...

  7. .NET Core开源导入导出库 Magicodes.IE 2.3发布

    在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...

  8. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  9. 开源导入导出通用库Magicodes.ExporterAndImporter发布

    导入导出通用库 Magicodes.ExporterAndImporter为心莱团队封装的导入导出通用库,并且仍在跟随项目不断地打磨. GitHub地址: https://github.com/xin ...

随机推荐

  1. 查看laravel版本

    方法1: 使用php artisan --version ,只要能看懂这个命令的人一定已经具有初步的Laravel知识.再介绍一种不需要命令,直接去文件中去查看的方法. 方法2: 在项目文件中找ven ...

  2. zeppelin开启多个

    conf/zeppelin-env.sh 添加行: export ZEPPELIN_PID_DIR=/xx/zeppelin/run_2

  3. dotnet 使用 GC.GetAllocatedBytesForCurrentThread 获取当前线程分配过的内存大小

    在 dotnet framework 4.8 的时候支持调用 GC.GetAllocatedBytesForCurrentThread 获取当前线程分配过的内存大小 创建一个简单的控制台程序,在调用 ...

  4. mysql(8.0.16)安装及使用注意事项

    1.安装地址:https://dev.mysql.com/downloads/mysql/ 2.在安装路径:D:\mysql\mysql-8.0.16-winx64(安装时的路径,可自己选择)下面新建 ...

  5. dotnet core 发布只带必要的依赖文件

    在使用 dotnet core 发布独立项目的时候,会带上大量依赖的库,但是通过微软提供的工具可以去掉一些在代码没有用到的库. 本文介绍的工具是 Microsoft.Packaging.Tools.T ...

  6. 【35.53%】【POJ 2912】Rochambeau

    Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2837 Accepted: 1008 Description N childre ...

  7. easypermissions拒绝权限后闪退。 java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class Landroid/support/v4/app/FragmentManager

    Process: com.tazan.cd.streetlight, PID: 18825 java.lang.NoSuchMethodError: No virtual method isState ...

  8. C. 【UNR #3】配对树

    题解: 首先可以贪心 于是问题可以等价成一条边被算当且仅当子树中个数为奇数个 题解的做法比较简单 考虑每条边,加入其子树内的点 然后为了保证区间长度为偶数 分成f0,0 f0,1 f1,0 f1,1即 ...

  9. spring-redis-session 自定义 key 和过期时间

    对于分布式应用来说,最开始遇到的问题就是 session 的存储了,解决方案大致有如下几种 使用 spring-session 它可以把 session 存储到你想存储的位置,如 redis,mysq ...

  10. Firefox about:config

    about:config Pocket.enabled Pocket  启用 true 打开 false 关闭