ZetCode

C# QuestPDF

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何使用 QuestPDF 库创建 PDF 文档。

可移植文档格式 (PDF) 是一种由 Adobe 创建的通用文件格式,它为人们提供了一种简单可靠的方式来呈现和交换文档。

QuestPDF 是一个用于 PDF 生成的开源 .NET 库。该库使用 Skia 进行渲染。 QuestPDF 使用 Fluent API。

C# QuestPDF 简单示例

以下示例创建一个简单的 PDF 文件。

Program.cs
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

var doc = Document.Create(container => container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);
        page.DefaultTextStyle(x => x.FontSize(12));

        page.Content()
            .Column(x => x.Item().Text(Placeholders.Paragraph()));
    }));

doc.GeneratePdf("simple.pdf");

PDF 文档包含一段文本。

using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

我们导入 QuestPDF 类型。

var doc = Document.Create(container => container.Page(page =>

该文档使用 Document.Create 创建。 使用 Page 添加新页面。

page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.DefaultTextStyle(x => x.FontSize(12));

我们设置页面的基本属性:页面大小、边距和默认字体大小。

page.Content()
    .Column(x => x.Item().Text(Placeholders.Paragraph()));

内容使用 Content 添加。 它由一列文本组成。 在该列中,我们添加一个文本项。 Placeholders.Paragraph 创建一个 lorem impsum 文本段落。

doc.GeneratePdf("simple.pdf");

PDF 使用 GeneratePdf 生成。

C# QuestPDF 文本

在下一个示例中,我们将使用各种文本属性。

Program.cs
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

var doc = Document.Create(container => container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);

        page.Content()
            .Column(x =>
            {
                x.Item().Text(Placeholders.Sentence());
                x.Spacing(10);
                x.Item().Text(Placeholders.Sentence()).FontSize(15);
                x.Spacing(10);
                x.Item().Text(Placeholders.LoremIpsum());
                x.Spacing(10);
                x.Item().Text(Placeholders.Paragraph()).FontFamily("Georgia");
                x.Spacing(10);
                x.Item().Text(Placeholders.Sentence()).FontColor(Colors.Blue.Darken3);
                x.Spacing(10);
                x.Item().Text(txt =>
                {
                    txt.Span("C# ").Italic();
                    txt.Span("is a modern, object-oriented, and type-safe programming language.");
                });

            });
    }));

doc.GeneratePdf("text.pdf");

在该程序中,我们利用 SentenceParagraphLoremIpsum 辅助方法来生成一些填充文本。

x.Item().Text(Placeholders.Sentence());
x.Spacing(10);
x.Item().Text(Placeholders.Sentence()).FontSize(15);

我们添加两个句子。 使用 Spacing 在它们之间添加间距。 FontSize 设置句子的字体大小。

x.Item().Text(Placeholders.Paragraph()).FontFamily("Georgia");

对于此段落,我们选择 Georgia 字体。

x.Item().Text(Placeholders.Sentence()).FontColor(Colors.Blue.Darken3);

对于这个句子,我们选择深蓝色字体颜色。

x.Item().Text(txt =>
{
    txt.Span("C# ").Italic();
    txt.Span("is a modern, object-oriented, and type-safe programming language.");
});

使用 Span,我们可以更改文本项的属性。 我们为第一个文本跨度设置斜体样式。

C# QuestPDF 标题 & 页脚

对于下一个文档,我们添加标题和页脚。

Program.cs
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

var doc = Document.Create(container => container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);

        page.Header()
            .Text("My header")
            .SemiBold().FontSize(24).FontColor(Colors.Blue.Medium);

        page.Content()
            .PaddingVertical(1, Unit.Centimetre)
            .Column(x =>
            {

                x.Item().Text(Placeholders.LoremIpsum());
                x.Spacing(20);
                x.Item().Text(Placeholders.LoremIpsum());
            });

        page.Footer()
            .Text(x =>
            {
                x.Span("Page ");
                x.CurrentPageNumber();
            });
    }));

doc.GeneratePdf("headfoot.pdf");

文档包含三个部分:标题、内容和页脚。

page.Header()
    .Text("My header")
    .SemiBold().FontSize(24).FontColor(Colors.Blue.Medium);

使用 Header 添加标题。 我们使用 SemiBold 更改字体粗细,使用 FontSize 更改字体大小,并使用 FontColor 更改字体颜色。

page.Content()
    .PaddingVertical(1, Unit.Centimetre)
    .Column(x =>
    {
        x.Item().Text(Placeholders.LoremIpsum());
        x.Spacing(20);
        x.Item().Text(Placeholders.LoremIpsum());
    });

页面内容使用 Content 添加。 我们添加两个段落并在它们之间添加一个间距。

page.Footer()
    .Text(x =>
    {
        x.Span("Page ");
        x.CurrentPageNumber();
    });

最后,我们使用 Footer 添加页脚。 它包含当前页码。

C# QuestPDF 线条

在下一个示例中,我们向页面添加一些水平线。

Program.cs
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

var doc = Document.Create(container =>
{
    container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);

        page.Content()
            .Column(x =>
            {
                x.Item().Text(Placeholders.Paragraph());
                x.Item().PaddingVertical(5).LineHorizontal(1);
                x.Item().Text(Placeholders.Paragraph());
                x.Item().PaddingVertical(5).LineHorizontal(1).LineColor(Colors.LightBlue.Darken3);
                x.Item().Text(Placeholders.Paragraph());
                x.Item().PaddingVertical(5).LineHorizontal(2);
                x.Item().Text(Placeholders.Paragraph());
            });
    });
});

doc.GeneratePdf("lines.pdf");

在该程序中,我们在段落之间添加三行。

x.Item().PaddingVertical(5).LineHorizontal(1);

我们有一条宽度为 1 的水平线,带有一些垂直内边距。

x.Item().PaddingVertical(5).LineHorizontal(1).LineColor(Colors.LightBlue.Darken3);

我们可以使用 LineColor 更改线条的颜色。

x.Item().PaddingVertical(5).LineHorizontal(2);

在这里,我们使线条更粗。

C# QuestPDF 边框

在下一个示例中,我们添加一些边框。

Program.cs
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

Action<IDocumentContainer> container = (container) => container.Page(page =>
        {
            page.Size(PageSizes.A4);
            page.Margin(2, Unit.Centimetre);

            page.Content()
                .Column(x =>
                {
                    x.Item().Border(1).Padding(5).Text(Placeholders.Paragraph());
                    x.Item().Border(1).Padding(5).Text(Placeholders.Paragraph());
                    x.Item().Border(1).Padding(5).Text(Placeholders.Paragraph());
                });
        });


var doc = Document.Create(container);
doc.GeneratePdf("borders.pdf");

我们有三个文本段落。 我们在这些段落周围放置一些边框。

x.Item().Border(1).Padding(5).Text(Placeholders.Paragraph());

我们使用 Border 添加边框,并使用 Padding 添加一些内边距。

C# QuestPDF 表格

下一个示例在 PDF 文档中生成一个表格。

Program.cs
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

var fonts = new[]
{
    Fonts.Calibri,
    Fonts.Georgia,
    Fonts.Arial,
    Fonts.TimesNewRoman,
    Fonts.Consolas,
    Fonts.Tahoma,
    Fonts.Verdana,
    Fonts.Trebuchet,
    Fonts.ComicSans
};

var doc = Document.Create(container => container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);

        page.Content()
            .Column(x => x.Item().Table(table =>
                {
                    table.ColumnsDefinition(cols =>
                    {
                        cols.ConstantColumn(150);
                        cols.ConstantColumn(150);
                    });

                    table.ExtendLastCellsToTableBottom();

                    foreach (var font in fonts)
                    {
                        table.Cell().MinWidth(120).Border(1).Padding(5).Text(font).FontFamily(font);
                    }
                }));
    }));

doc.GeneratePdf("table.pdf");

该表有两列,并以各种字体系列显示文本。

page.Content()
    .Column(x => x.Item().Table(table =>
        {

使用 Table 添加表格。

table.ColumnsDefinition(cols =>
{
    cols.ConstantColumn(150);
    cols.ConstantColumn(150);
});

我们定义两个固定宽度的表格列。

table.ExtendLastCellsToTableBottom();

如果单元格不均匀,则最后一个单元格会放大到表格的底部。

foreach (var font in fonts)
{
    table.Cell().MinWidth(120).Border(1).Padding(5).Text(font).FontFamily(font);
}

在 foreach 循环中,我们将 fonts 数组的项添加到表格中。 使用 cell 添加一个新单元格。 我们设置其最小宽度、边框、内边距、内容和字体系列。

来源

QuestPDF 文档

在本文中,我们介绍了 QuestPDF 库。 我们展示了如何生成简单的 PDF 文档。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程