1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/magicodes-Magicodes.IE

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
3.Basic tutorial of export Pdf receipts.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 03.03.2025 03:18 5e09f6d

Базовое руководство по экспорту PDF чеков

Описание

Это руководство подробно объясняет использование Magicodes.

Основные моменты

  • Экспорт данных в 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 = "Мистер А",
            Age = 18
        },
        new Student
        {
            Name = "Мистер Б",
            Age = 19
        },
        new Student
        {
            Name = "Мистер Б",
            Age = 20
        }
    });
}

Экспорт PDF также поддерживает передачу классов с параметрами, как показано ниже:

/// <summary>
/// Экспорт PDF
/// </summary>
/// <param name="data">Данные</param>
/// <param name="pdfExporterAttribute">Параметры экспорта PDF</param>
/// <param name="template">Шаблон</param>
/// <returns></returns>
Task<byte[]> ExportListBytesByTemplate<T>(ICollection<T> data, PdfExporterAttribute pdfExporterAttribute,
    string template) where T : class;

/// <summary>
/// Экспорт PDF
/// </summary>
/// <param name="data">Данные</param>
/// <param name="pdfExporterAttribute">Параметры экспорта PDF</param>
/// <param name="template">Шаблон</param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
Task<byte[]> ExportBytesByTemplate<T>(T data, PdfExporterAttribute pdfExporterAttribute, string template)
    where T : class;

Экспортированный контент представлен ниже.

3.Базовое руководство по экспорту PDF чеков-1

Вышеуказанный код экспортирует простую таблицу PDF, используя встроенный шаблон таблицы в Magicodes. Если требуется настраивать заголовок, можно использовать функцию [ExporterHeader].

[PdfExporter(Name = "Студенты")]
public class Student
{
    /// <summary>
    ///     Имя
    /// </summary>
    [ExporterHeader(DisplayName = "Имя")]
    [Display(Name = "Отображение имени")]
    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 чеков-2

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>Номер: @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>

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; }
}
```1. Вы можете указывать название в шаблоне через функцию Exporter, и вы также можете работать без этого атрибута, так как этот шаблон полностью настраиваемый.


- Как использовать кастомный шаблон для экспорта? Код представлен ниже.

```csharp
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 = "Оплата WeChat",
            Profession = "Обучение тренировкам",
            Remark = "Учебные сборы",
            TradeStatus = "Завершено",
            TradeTime = DateTime.Now,
            UppercaseAmount = "Двадцать две тысячи двести девяносто три рубля сорок три цента",
            Code = "19071800001"
        }, tpl);
}

С помощью вышеуказанного кода нам нужно указать передачу содержимого шаблона, и конечный эффект экспорта следующий.

3.Основной учебник по экспорту PDF-чеков-3

4. Экспорт PDF-чеков в пакетном режиме

В некоторых случаях нам требуется экспортировать несколько данных в PDF, например, банк предоставляет пакетные чеки. То есть с помощью Magicodes можно очень просто реализовать аналогичные требования. Основные шаги показаны ниже:

  • Создание шаблона

    <!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>НОМЕР: @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>
        ///     Данные для пакетного экспорта
        /// </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
  • Под底层基于wkhtmltopdf库包,已为每个平台包含wkhtmltopdf包,无需再次安装
  • В Linux контейнерах PDF-экспорт требует установки соответствующих шрифтов, подробнее см. раздел о контейнерах

Примечание: В последнем абзаце было заменено "под底层基于wkhtmltopdf库包" на более понятное описание на русском языке.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/magicodes-Magicodes.IE.git
git@api.gitlife.ru:oschina-mirror/magicodes-Magicodes.IE.git
oschina-mirror
magicodes-Magicodes.IE
magicodes-Magicodes.IE
master