原文作者:hueifeng

说明

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

要点

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

导出特性说明

PdfExporterAttribute

PdfExporterAttribute特性用于设置Pdf导出的总体设置,比如方向、纸张等。主要包含如下设置:

  • Name:文档标题
  • FontSize:字体大小
  • Orientation: 方向(横向或纵向)
  • PaperKind: 纸张类型(默认A4)
  • IsWriteHtml: 是否输出HTML模板
  • IsEnablePagesCount:是否启用分页数
  • Encoding:编码,默认utf-8
  • HeaderSettings:导出头部设置
  • FooterSettings:导出底部设置

ExporterHeaderAttribute

ExporterHeaderAttribute 特性用于设置列头信息,在Pdf表格中,可用于设置显示名称。
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 =
},
new Student
{
Name = "MR.B",
Age =
},
new Student
{
Name = "MR.B",
Age =
}
});
}

导出内容如下所示:

上述代码导出了一个简单的Pdf表格,使用的Magicodes.IE中内置的表格模板。如果我们需要自定义标题,可以通过【ExporterHeader】特性来设置:

 [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收据

  • 创建导出模板
<!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: #;
font-size: .2rem;
margin-bottom: .5rem;
margin-right: %;
margin-top: .2rem;
text-align: right;
} table,
td {
border: 1px solid #;
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="">@Model.Data.Name</td>
<td style="text-align: center; width: 13%;">身份证号码</td>
<td colspan="">@Model.Data.IdNo</td>
</tr>
<tr style="font-size: 1rem;">
<td style="text-align: center">交易金额</td>
<td colspan="">
<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="">@Model.Data.PaymentMethod</td>
<td style="text-align: center; width: 13%;">交易状态</td>
<td colspan="">@Model.Data.TradeStatus</td>
</tr> <tr style="font-size: 1rem;">
<td style="text-align: center">收款事由</td>
<tdstyle="width: 22.3%;">@Model.Data.Remark</td>
<tdstyle="text-align: center; width: 11%;">入学年级</td>
<tdstyle="width: 22.3%;" colspan="">@Model.Data.Grade</td>
<tdstyle="text-align: center; width: 11%;">专业</td>
<tdstyle="width: 22.3%;">@Model.Data.Profession</td>
</tr>
</table>
</body>
</html>

如上述代码所示,为了便于模板的编写,Magicodes.IE支持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; }
    }
  • 如上代码片段通过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 = ""
    }, tpl);
    }

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

4.批量导出PDF收据

在某些情况下,我们需要将多条数据导出到一个Pdf,就比如银行提供的批量收据。通过Magicodes.IE,也可以非常简单的实现类似的需求。主要步骤如下所示:

  • 创建模板

    <!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: #;
    font-size: .2rem;
    margin-bottom: .5rem;
    margin-right: %;
    margin-top: .2rem;
    text-align: right;
    } table,
    td {
    border: 1px solid #;
    border-collapse: collapse;
    height: 2rem;
    padding: 5px;
    } .evenNum {
    margin-bottom: %;
    padding-top: %;
    }
    </style>
    </head> <body>
    @for (var i = ; 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="">@Model.Data.ReceiptInfoInputs[i].Name</td>
    <td style="text-align: center; width: 13%;">身份证号码</td>
    <td colspan="">@Model.Data.ReceiptInfoInputs[i].IdNo</td>
    </tr>
    <tr style="font-size: 1rem;">
    <td style="text-align: center">交易金额</td>
    <td colspan="">
    <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="">@Model.Data.ReceiptInfoInputs[i].PaymentMethod</td>
    <td style="text-align: center; width: 13%;">交易状态</td>
    <td colspan="">@Model.Data.ReceiptInfoInputs[i].TradeStatus</td>
    </tr> <tr style="font-size: 1rem;">
    <tdstyle="text-align: center">收款事由</td>
    <tdstyle="width: 22.3%;">@Model.Data.ReceiptInfoInputs[i].Remark</td>
    <tdstyle="text-align: center; width: 11%;">入学年级</td>
    <tdstyle="width: 22.3%;" colspan="">@Model.Data.ReceiptInfoInputs[i].Grade</td>
    <tdstyle="text-align: center; width: 11%;">专业</td>
    <tdstyle="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 = ; i < ; i++)
    input.ReceiptInfoInputs.Add(new BatchReceiptInfoDto
    {
    Amount = 22939.43M,
    Grade = "2019秋",
    IdNo = "43062619890622xxxx",
    Name = "张三",
    PaymentMethod = "微信支付",
    Profession = "运动训练",
    Remark = "学费",
    TradeStatus = "已完成",
    TradeTime = DateTime.Now,
    UppercaseAmount = "贰万贰仟玖佰叁拾玖圆肆角叁分",
    Code = "" + i
    }); //此处使用默认模板导出
    var result = await exporter.ExportByTemplate("test.pdf", input, tpl);
    }

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

注意事项

至此,整个教程到这里就结束了。不过还有以下事项需要注意:

  • Pdf导出支持全平台,包括Windows和Linux,x86以及x64
  • Pdf导出底层基于wkhtmltopdf库的封装,已包含wkhtmltopdf各平台的包,无需再次安装
  • 在Linux容器中,Pdf导出需要安装相关字体文件,具体见容器教程

Magicodes.IE基础教程之导出Pdf的更多相关文章

  1. Spring Boot 系列教程18-itext导出pdf下载

    Java操作pdf框架 iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好 ...

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

    基础教程之导出Pdf收据 说明 本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出 要点 导出PDF数据 自定义PDF模板 导出单据 如何批量导出单据 导出特性 PdfExpor ...

  3. Android UI基础教程 目录

    从csdn下载了这本英文版的书之后,又去京东搞了一个中文目录下来.对照着看. 话说,这本书绝对超值.有money的童鞋看完英文版记得去买中文版的~~ Android UI基础教程完整英文版 pdf+源 ...

  4. java根据模板导出PDF详细教程

    原文:https://blog.csdn.net/pengyufight/article/details/75305128 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word ...

  5. HTML5与CSS3基础教程(第7版) 高清PDF扫描版​

    HTML5与CSS3基础教程(第7版)试读不仅介绍了文本.图像.链接.列表.表格.表单.多媒体等网页元素,也介绍了如何为网页设计结构.布局,添加动态效果.格式化等形式,此外还涉及调试和发布.聚合和吸引 ...

  6. HTML5与CSS3基础教程(第8版) PDF扫描版​

    <HTML5与CSS3基础教程(第8版)>自第1版至今,一直是讲解HTML和CSS入门知识的经典畅销书,全面系统地阐述HTML5和CSS3基础知识以及实际运用技术,通过大量实例深入浅出地分 ...

  7. 推荐《SQL基础教程(第2版)》中文PDF+源代码+习题答案

    我认为<SQL基础教程(第2版)>非常适合数据库学习的初学者.论述的角度是读者的角度,会换位思考到读者在看到这一段时候会发出怎样的疑问,非常难得:原始数据的例题只有一道,但是可以反复从不同 ...

  8. 学习参考《Python基础教程(第3版)》中文PDF+英文PDF+源代码

    python基础教程ed3: 基础知识 列表和元组 字符串 字典 流程控制 抽象(参数 作用域 递归) 异常 魔术方法/特性/迭代器 模块/标准库 文件 GUI DB 网络编程 测试 扩展python ...

  9. Python基础教程(第3版)PDF高清完整版免费下载|百度云盘

    百度云盘:Python基础教程(第3版)PDF高清完整版免费下载 提取码:gkiy 内容简介 本书包括Python程序设计的方方面面:首先从Python的安装开始,随后介绍了Python的基础知识和基 ...

随机推荐

  1. 若依框架. 仿ThymeLeaf前端SelectDictLable方法

    在framework项目下新增所需服务

  2. SSAS Tabular表格模型实现动态权限管理

    最近忽然对SSAS产生了浓厚兴趣,我看博客园上也米有写关于SSAS 2016下表格模型实现动态权限管理的文章,最近鼓捣了一下微软的样例,鼓捣好了,把过程中遇到的一些问题写出来,抛砖引玉,也算给自己一个 ...

  3. pyautogui介绍

    https://pyautogui.readthedocs.io/en/latest/introduction.html Introduction Purpose The purpose of PyA ...

  4. SpringBoot实现简单的CRUD

    CRUD-员工列表 实验要求: 1).RestfulCRUD:CRUD满足Rest风格: URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作 2).实验的请求架构; 3).员工列表 ...

  5. 谈谈 InnoDB引擎中的一些索引策略

    如果我们在工作能够更好的利用好索引,那将会极大的提升数据库的性能. 覆盖索引 覆盖索引是指在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索 建立如下这张表来演示覆盖索引: creat ...

  6. Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini和my.ini文件以及服务无法启动的解决办法以及修改初始密码的方法

    下载解压mysql文件之后,中间出现了一些问题,终于解决,希望能帮助到需要的朋友. mysql官网下载地址:https://dev.mysql.com/downloads/mysql/点击打开链接 以 ...

  7. echats 的使用

    第一步在我们的电脑上百度搜索echarts,点击进去,如下图所示: 2 第二步进去之后,点击下载,选择要下载的echarts版本,一般选择源代码,如下图所示: 3 第三步下载完成之后,我们也可以来使用 ...

  8. swift开发度假计划app

    用swift开发一个完整的度假地app,设计到布局.数据绑定.数据编辑.页面导航等:适合初学者: github:(git@github.com:Frankltf/ios-swift-app.git)

  9. 关于远程办公,微软MVP 15年研发团队的经验分享

    今天是2月5日,春节假期结束后的第三天了.为了能够应对来势汹汹的疫情,众多互联网企业纷纷开启了远程办公模式.不知道各团队前两天的远程办公效果如何,我们 Worktile 管理层在大年初四就开始讨论远程 ...

  10. 手把手教你用C#做疫情传播仿真

    手把手教你用C#做疫情传播仿真 在上篇文章中,我介绍了用C#做的疫情传播仿真程序的使用和配置,演示了其运行效果,但没有着重讲其中的代码. 今天我将抽丝剥茧,手把手分析程序的架构,以及妙趣横生的细节. ...