說明
本教程主要說明如何使用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; }
}
-
PdfExporter 通過Name屬性來定義文檔標題
-
ExporterHeader DisplayName用來定義屬性名稱
-
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導出需要安裝相關字體文件,具體見容器教程
轉載是一種動力 分享是一種美德
作者:hueifeng
如果喜歡作者的文章,請關注【麥扣聊技術】訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
文檔官網:docs.xin-lai.com
編程交流群<85318032>
產品交流群<897857351>