Magicodes.IE基礎教程之導出Pdf

心萊科技 發佈 2020-02-28T08:12:11+00:00

DisplayName:顯示名稱使用步驟1.安裝包Magicodes.IE.PdfInstall-Package Magicodes.IE.Pdf2.導出PDF數據創建Dto類public class Student { /// <summary> /// 姓名 /// </su

說明

本教程主要說明如何使用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導出需要安裝相關字體文件,具體見容器教程

轉載是一種動力 分享是一種美德

作者:hueifeng

如果喜歡作者的文章,請關注【麥扣聊技術】訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

文檔官網:docs.xin-lai.com

編程交流群<85318032>

產品交流群<897857351>

關鍵字: