Magicodes.IE.Pdf 生成导出PDF文件 bytes Stream FileStreamResult 下载

1、ExporterAttribute:导出特性

Name:名称

HeaderFontSize:头部字体大小

FontSize:正文字体大小

MaxRowNumberOnASheet:一个Sheet最大允许的行数,设置了之后将输出多个Sheet

AutoFitAllColumn:自适应所有列

AutoFitMaxRows:数据超过此行之后不启用自适应,默认关闭

Author:作者

IsDisableAllFilter:是否禁用所有筛选器

2、ExporterHeaderAttribute:导出属性特性,设置列头特性信息

DisplayName:显示名称

FontSize:字体大小

IsBold:是否加粗

FORMAT:格式化(身份证'@',日期'yyyy-MM-dd'、'yyyy-MM-dd HH:mm:ss',数字'#,##0')

IsAutoFit:是否自适应

AutoCenterColumn:自动居中

IsIgnore:是否忽略

Width:宽度

ColumnIndex:排序

WrapText:自动换行

Hidden:隐藏

FontColor:字体颜色

3、导出PDF方法

ExportListByTemplate

ExportByTemplate

ExportBytesByTemplate

4、在wwwroot新建文件夹目录

pdf文件导出目录:\wwwroot\ExportPDF

Html模板目录:\wwwroot\HtmlTemplate

5、管理 NuGet 程序包

bash 复制代码
Magicodes.IE.Pdf

6、Html模板文件【\wwwroot\HtmlTemplate\receipt.html】

html 复制代码
<!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>

7、Controller

cs 复制代码
using Magicodes.ExporterAndImporter.Core.Models;
using Magicodes.ExporterAndImporter.Excel;
using Magicodes.ExporterAndImporter.Pdf;
using Microsoft.AspNetCore.Mvc;
using WebApplication2.Model;

namespace WebApplication2.Controllers
{
    [Route("api/Magicodes/[action]")]
    [ApiController]
    public class MagicodesController : ControllerBase
    {
        public MagicodesController() { }

        /// <summary>
        /// 1.根据模板导出列表
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task ExportListByTemplate()
        {
            //根目录
            var root = $"{Directory.GetCurrentDirectory()}\\wwwroot";

            //导出文件路径及名称
            string fileName = $"{root}\\ExportPDF\\{DateTime.Now.ToString("yyyyMMddHHmmss")}.pdf";

            var list = new List<StudentPdf>();
            for (int i = 0; i <= 10; i++)
            {
                list.Add(new StudentPdf
                {
                    Name = $"MR.{i}",
                    Age = i,
                    Birthday = DateTime.Now.AddDays(i)
                });
            }

            var exporter = new PdfExporter();
            var result = await exporter.ExportListByTemplate(fileName, list);
        }

        /// <summary>
        /// 2.根据模板导出
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task ExportByTemplate()
        {
            //根目录
            var root = $"{Directory.GetCurrentDirectory()}\\wwwroot";

            //pdf模板文件
            var templatePath = Path.Combine(root, "HtmlTemplate", "receipt.html");

            var template = System.IO.File.ReadAllText(templatePath);

            var exporter = new PdfExporter();

            //导出文件路径及名称
            string fileName = $"{root}\\ExportPDF\\{DateTime.Now.ToString("yyyyMMddHHmmss")}.pdf";

            //此处使用默认模板导出
            ExportFileInfo result = await exporter.ExportByTemplate(fileName, GetModel(), template);
        }

        /// <summary>
        /// 3.导出PDF Bytes 文件
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<ActionResult> ExportBytesByTemplate()
        {
            //根目录
            var root = $"{Directory.GetCurrentDirectory()}\\wwwroot";

            //pdf模板文件
            var templatePath = Path.Combine(root, "HtmlTemplate", "receipt.html");

            var template = System.IO.File.ReadAllText(templatePath);

            var exporter = new PdfExporter();

            //文件名称
            string fileName = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}.pdf";

            var bytes = await exporter.ExportBytesByTemplate(GetModel(), template);
            MemoryStream stream = new MemoryStream(bytes);
            return new FileStreamResult(stream, "application/octet-stream")
            {
                FileDownloadName = fileName
            };
        }

        /// <summary>
        /// 数据
        /// </summary>
        /// <returns></returns>
        private ReceiptInfoPdf GetModel()
        {
            var model = new ReceiptInfoPdf
            {
                Amount = 159873.66M,
                Grade = "2025",
                IdNo = "12345620000102xxxx",
                Name = "张三",
                Payee = "科技有限公司",
                PaymentMethod = "支付宝支付",
                Profession = "篮球",
                Remark = "学费",
                TradeStatus = "已完成",
                TradeTime = DateTime.Now,
                UppercaseAmount = "壹拾伍万玖仟捌佰柒拾叁元陆角陆分",
                Code = "219071800001"
            };
            return model;
        }
    }
}

8、ReceiptInfoPdf 实体类

cs 复制代码
using Magicodes.ExporterAndImporter.Core;

namespace WebApplication2.Model
{
    [Exporter(Name = "电子收款凭证")]
    public class ReceiptInfoPdf
    {
        /// <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; }
    }
}

9、StudentPdf 实体类

cs 复制代码
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Pdf;
using System.ComponentModel.DataAnnotations;

namespace WebApplication2.Model
{
    [PdfExporter(Name = "学生信息", HeaderFontSize = 20, FontSize = 20)]
    public class StudentPdf
    {
        /// <summary>
        /// 姓名
        /// </summary>
        [ExporterHeader(DisplayName = "姓名", FontSize = 10, IsBold = true, IsAutoFit = true)]
        [Display(Name = "Display姓名")]
        public string Name { get; set; }

        /// <summary>
        /// 年龄
        /// </summary>
        [ExporterHeader(DisplayName = "年龄")]
        public int Age { get; set; }

        /// <summary>
        /// 出生日期
        /// </summary>
        [ExporterHeader(DisplayName = "出生日期", Format = "yyyy-MM-dd")]
        public DateTime Birthday { get; set; }
    }
}

10、效果图

11、项目

E:\test\WebApplication2\WebApplication2\Controllers\MagicodesController.cs

*

*

*