Magicodes.IE基础教程之导出Pdf

说明

本教程主要说明如何使用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 = 18},new Student{Name = "MR.B",Age = 19},new Student{Name = "MR.B",Age = 20}});}

导出内容如下所示:

上述代码导出了一个简单的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: #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>

如上述代码所示,为了便于模板的编写,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 = "19071800001"}, 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: #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);}

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

注意事项

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

  • Pdf导出支持全平台,包括Windows和Linux,x86以及x64

  • Pdf导出底层基于wkhtmltopdf库的封装,已包含wkhtmltopdf各平台的包,无需再次安装

  • 在Linux容器中,Pdf导出需要安装相关字体文件,具体见容器教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层如何执行吗?

作者&#xff1a;不才陈某前言在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求&#xff0c;但是你真的理解order by在 Mysql 底层是如何执行的吗&#xff1f;假设你要查询城市是苏州的所有人名字&#xff0c;并且按照姓名进行排序返回前 1000 个人的姓名、年龄…

排序-总结

排序 排序:重点在于对于记录的关键字进行排序,得到按关键字有序记录序列 分为: A.内部排序: 排序过程在内存中进行 B.外部排序: 待排序记录数据量过大,需要借助外部存储设备 排序的稳定性:排序后有相同关键字的记录顺序不变就是稳定的排序 插入类排序: 1.直接插入排…

.NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记

10 | 环境变量配置提供程序&#xff1a;容器环境下配置注入的最佳途径环境变量的配置提供程序主要适应场景&#xff1a;1、在 Docker 中运行时2、在 Kubernetes 中运行时3、需要设置 ASP.NET Core 的一些内置特殊配置时环境变量和命令行这两个提供程序在早期是没有容器化的&…

dotnetcore3.1 WPF 实现多语言

dotnetcore3.1 WPF 实现多语言Intro最近把 DbTool 从 WinForm 迁移到了 WPF&#xff0c;并更新到了 dotnet core 3.1&#xff0c;并实现了基于 Microsoft.Extensions.Localization 实现了基本的多语言支持。下面来分享一下如何来实现服务注册如果不熟悉如何在 WPF 中使用依赖注…

卸载chrome_Chrome 浏览器必备“扩展管理工具”,一键管理 Chrome 扩展

前言丰富的扩展插件可以说是 Chrome 浏览器的灵魂了&#xff0c;但是扩展安装的多了&#xff0c;难免会引起卡顿&#xff0c;而且每次打开/关闭扩展都要进入扩展程序页面&#xff0c;切换起来很不方便。下面分享的三款 Chrome 扩展管理工具&#xff0c;可以让我们更便捷地管理 …

面试官:你连HTTP请求Post和Get都不了解?

IT界知名的程序员曾说&#xff1a;对于那些月薪三万以下&#xff0c;自称IT工程师的码农们&#xff0c;其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居&#xff0c;但只是他们一厢情愿罢了。此话一出&#xff0c;不知激起了多少(码农)程序员的愤怒…

运维进化论:微盟“删库跑路”给我们的启示

作者&#xff1a;茹炳晟&#xff0c;软件质量和研发工程效能专家事件背景微盟是国内移动互联网营销引领者&#xff0c;中国最大的微信公众智能服务平台&#xff0c;基于微信为企业提供开发、运营、培训、推广一体化解决方案&#xff0c;帮助企业实现线上线下互通&#xff0c;社…

拦截器如何获取@requestbody_分布式系统中如何优雅地追踪日志(原理篇)

分布式系统中日志追踪需要考虑的几个点&#xff1f;需要一个全服务唯一的id&#xff0c;即traceId&#xff0c;如何保证&#xff1f;traceId如何在服务间传递&#xff1f;traceId如何在服务内部传递&#xff1f;traceId如何在多线程中传递&#xff1f;我们一一来解答&#xff1…

.NET Core开发实战(第11课:文件配置提供程序)--学习笔记

11 | 文件配置提供程序&#xff1a;自由选择配置的格式文件配置提供程序Microsoft.Extensions.Configuration.IniMicrosoft.Extensions.Configuration.JsonMicrosoft.Extensions.Configuration.NewtonsoftJsonMicrosoft.Extensions.Configuration.XmlMicrosoft.Extensions.Conf…

前端demo_【前端3分钟】Script Error产生的原因和解法

Script Error对于前端开发者相信都不陌生&#xff0c;而且由于没有具体错误堆栈和代码行列号&#xff0c;成为可能是最神秘的错误之一。下面介绍Script Error产生的原理和解决办法。1、Script Error是如何产生的跨域资源引用假如&#xff1a;abc.com 下的页面引用了属于 http:/…

基于Abp VNext框架设计 - Masstransit分布式消息

abp 通过IDistributedEventBus接口集成自IEventBus实现分布式事件消息的发布订阅。IEventBus在什么时机触发PublishAsync?当前UnitOfWork完成时&#xff0c;触发IEventBus的PublishAsync在没有事务环境下&#xff0c;同步调用IEventBus的PublishAsyncabp 默认实现基于RabbitMq…

16进制数用空格分开 tcp_面试时,你是否被问到过TCP/IP协议?

点击蓝字关注我们看到这句话&#xff0c;有没有感到很熟悉呀&#xff1f;相信很多人在面试的时候都被要求&#xff0c;很多人会觉得我们在实际开发中一般用不到这些知识&#xff0c;所以对这些东西不屑一顾。但是小编认为想要成为一个完美的网工,那么对这些基础知识必须要有一定…

直接使用汇编编写 .NET Standard 库

前言Common Language Runtime&#xff08;CLR&#xff09;是一个很强大的运行时&#xff0c;它接收 Common Intermediate Language&#xff08;CIL&#xff09; 的输入并最终产生机器代码并执行。CIL 在 CLR 上相当于 ASM 汇编代码的存在。CLR 之上的语言 C#、F#、VB.NET 等语言…

[蓝桥杯2016决赛]七星填数-next_permutation枚举

题目描述 如下图所示&#xff1a; 在七角星的14个节点上填入1~14 的数字&#xff0c;不重复&#xff0c;不遗漏。要求每条直线上的四个数字之和必须相等。 图中已经给出了3个数字。请计算其它位置要填充的数字&#xff0c;答案唯一。 填好后&#xff0c;请提交绿色节点的4个数…

系统蓝屏的几种姿势,确定不了解下么?

前言在 蓝屏&#xff08;BSOD&#xff09;转储设置&#xff0c;看本文就够了&#xff01;这篇文章里比较详细的介绍了蓝屏转储设置。做好设置后&#xff0c;我们就可以在需要的时候使系统蓝屏了。本文介绍几种使系统蓝屏的办法&#xff0c;当然肯定还有其它办法&#xff0c;如果…

最长公共子串-dp

题目: 给定两个字符串&#xff0c;求出它们之间最长的相同子字符串的长度。 公共子串和公共子序列不同&#xff0c;公共子序列不要求连续&#xff0c;但公共子串必须是连续的。如: A “helloworld” B “loop” A和B的最长公共子序列是"loo",但最长公共子串是&quo…

智能对话引擎:两天快速打造疫情问答机器人

01微软AI技术开源知识库疫情机器人近一个月来&#xff0c;“新冠肺炎疫情”成了所有人的热点话题&#xff0c;抗击疫情的战役在全国紧张有序地进行着。随着全国各地的企业陆续复工&#xff0c;怎样防范、保护自己和家人成了当下每个人的焦点。为了配合奋战在一线的医护人员打赢…

数码管

题目背景 小明的单片机上面的LED显示屏坏掉了&#xff0c;于是他请你来为他修显示屏。 屏幕上可以显示0~9的数字&#xff0c;其中每个数字由7个小二极管组成&#xff0c;各个数字对应的表示方式如图所示&#xff1a; 题目描述 为了排除电路故障&#xff0c;现在你需要计算&am…