ASP.NET 開源導入導出庫Magicodes.IE 導出Pdf教程

来源:https://www.cnblogs.com/yyfh/archive/2020/01/21/12222388.html
-Advertisement-
Play Games

基礎教程之導出Pdf收據 說明 本教程主要說明如何使用Magicodes.IE.Pdf完成Pdf收據導出 要點 導出PDF數據 自定義PDF模板 導出單據 如何批量導出單據 導出特性 PdfExporterAttribute + Orientation : 方向(橫向或縱向) + PaperKind ...


基礎教程之導出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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在IntelliJ Idea中HTML格式化時,預設head和body標簽以及body下的標簽都不會縮進,這就導致你每次寫好html時候格式化的時候所有標簽都是同一層級沒有縮進,一般我們寫html都會層級關係標簽嵌套,通過縮進看代碼結構就很清晰明朗 ...
  • 1.什麼是二維碼? ​ (百度百科):二維碼又稱二維條碼,常見的二維碼為QR Code,QR全稱Quick Response,是一個近幾年來移動設備上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的信息,也能表示更多的數據類型。 2.利用ZXING生成二維碼 ​ ·對應POM <de ...
  • 近期項目用到了緩存,我選用的是主流的google.guava作本地緩存,redis作分散式 緩存,先說說我對本地緩存和分散式緩存的理解吧,可能不太成熟的地方,大家指出,一起 學習.本地緩存的特點是速度快,不會受到網路阻塞的干擾,但由於是放在本地記憶體中,所 以容量較小,不能項目間共用比IO效率高比re ...
  • a.php <?phpheader("Content-type: text/html; charset=utf-8");date_default_timezone_set("Asia/Shanghai"); $start = microtime(true); function fsockopen_g ...
  • ©Copyright 蕃薯耀 2020-01-21 https://www.cnblogs.com/fanshuyao/ 一、第一步,引用依賴類,在Pom.xml加入依賴 <dependencies> <dependency> <groupId>org.springframework</groupI ...
  • 前言 只有光頭才能變強。 文本已收錄至我的GitHub精選文章,歡迎Star : "https://github.com/ZhongFuCheng3y/3y" 不知道大家的公司用Elasticsearch多不多,反正我公司的是有在用的。平時聽同事們聊天肯定避免不了不認識的技術棧,例如說:把數據放在引 ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 .NET CORE(C ) WPF 重新設計Instagram 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 老外的一個界 ...
  • 這是該系列的第二篇文章: "在ASP.NET Core 3.0中使用Serilog.AspNetCore" 。 1. "第1部分 使用Serilog RequestLogging來簡化ASP.NET Core的日誌輸出" 2. "第2部分 用Serilog記錄所選終結點的附加屬性" (本文) 3. ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...