该页面可以包含自动翻译的文本。

在 C# 和 VB.NET 中创建 PDF 文档

作为 .NET 开发人员,您是否需要生成 PDF 报告、发票、收据或其他文档? 使用 Docotic.Pdf 库 在 .NET Core、.NET Standard 或 .NET Framework 项目中生成 PDF 文档。 您可以轻松 完成此操作,而无需了解 PDF 格式。

使用 C# 和 VB.NET 创建 PDF 文档

用于 PDF 生成的 .NET API

Docotic.Pdf 是 100% 托管代码库,无需外部依赖。 您可以使用它在 Windows、Linux、Amazon 和 Azure 云环 境中创建 PDF 文档。 macOS、iOS、Android 和其他云环境也很好。

该库提供了生成 PDF 文档的不同方法。 首先,您可以使用高级布局 API 添加页眉和页脚、表格、段落,并自动 将内容分解到页面。 布局 API 可在 免费的 Docotic.Pdf.Layout 附加组件 中 找到。

或者,您可以使用 HTML to PDF 插件(也是免费的)基于 HTML 模板创建 PDF 文档。 阅读将 HTML 转换为 PDF 文章了解更多详细信息。

您还可以使用核心库 API 生成 PDF 文档。 它支持任何 PDF 内容 - 文本图 像矢量图形表 单注释书签图 层 和 其他的。 但是,核心 API 不支持高级布局组件,例如标题、表格、部分。 使用核心库, 您将需要自己测量内容并将其分割到 PDF 页面之间。

Docotic.Pdf 库 9.3.17014-dev 布局附加组件 9.3.17014-dev HTML 转 PDF 插件 9.3.17014-dev
回归测试 14,645 通过 NuGet 总下载量 4,172,488

您还可以将附加组件与核心库一起使用。 例如,使用布局 API 生成 PDF 文档,然后使用核心库添加更多内容。 请注意,布局插件支持 .NET Standard 2.1、.NET Core、.NET 5 和更新的框架。 核心库和 HTML 到 PDF 附加 组件支持 .NET Standard 2.0、.NET 4.7.2+、.NET Core、.NET 5 及更高版本。

Docotic.Pdf 附加组件可在 NuGet 上使用,并包含在库的 zip with binaries 中。 要尝 试不受评估模式限制的库,您可以在此处 获取免费的限时许可证密钥。

使用布局 API 创建 PDF 文档

此 C# 示例展示了如何使用布局 API 在 C# 中生成 PDF 文档:

PdfDocumentBuilder
    .Create()
    .Generate("long-text.pdf", doc => doc.Pages(page =>
    {
        string text = File.ReadAllText(@"C# in Depth, Fourth Edition.txt");
        page.Content().Text(text);

        page.Footer().AlignCenter().Text(t => t.CurrentPageNumber());
    }));

该代码将文本文件转换为 PDF。 它将长文本拆分为页面,并在页脚区域绘制页码。 您不需要计算文本高度或计 算页数 - 该库会处理这些日常任务。

布局 API 是一个流畅的 API。 大多数调用都可以链接在一起,因此您可以编写比“声明式”框架更紧凑的代码。 让我们更详细地回顾一下该 API。

设置PDF文档属性

PDF 生成从 PdfDocumentBuilder 类 开始。 它允许您指定 生成的 PDF 文档的属性。 例如,您可以设置元数据、加密、PDF 版本或启用快速 Web 查看。 这是基本的 C# 示例:

PdfDocumentBuilder
    .Create()
    .Encryption(new PdfStandardEncryptionHandler("owner", "user"))
    .Info(info =>
    {
        info.Author = "Docotic.Pdf library";
        info.Title = "How to create PDF in .NET";
        info.Keywords = "C#, VB.NET";
    })
    .Version(PdfVersion.Pdf16)
    .Generate("result.pdf", doc => doc.Pages(_ => {}));

此示例使用自定义元数据创建一个空的受密码保护的 PDF 文档,并将其保存到文件中。 您还可以将文档保存到 流中,只需使用 PdfDocumentBuilder.Generate(Stream, ..) 重 载

当您设置“PdfDocumentBuilder”时,就可以用内容填充 PDF 文档了。 布局 API 提供了一个 Document 对象,用于注册公共资源(排版、图像)和定义 PDF 页面内 容。 您可以在“PdfDocumentBuilder.Generate”方法的第二个参数中配置“Document”。 让我们学习如何设置 PDF 页面。

定义 PDF 页面布局

此 C# 示例展示了如何创建横向 A3 页面的 PDF 文档:

PdfDocumentBuilder.Create().Generate("pages.pdf", doc =>
{
    doc.Pages((PageLayout page) =>
    {
        page.Size(PdfPaperSize.A3, PdfPaperOrientation.Landscape)
            .MarginVertical(50)
            .MarginHorizontal(40);

        page.Header().PaddingBottom(30).AlignRight().Text("Hello PDF");

        page.Content().Column(c =>
        {
            c.Item().Text("Page 1");
            c.Item().PageBreak();
            c.Item().Text("Page 2");
        });

        page.Footer().Text(t => t.CurrentPageNumber());
    });
});

Document.Pages() 方法 定义一页或多页的布局。 首先,示例代 码为所有页面设置通用设置 - 大小、方向、边距。 您还可以指定内容方向、默认文本样式或背景颜色。

然后,该示例生成页面布局和内容。 PageLayout 类 提供了将页面内 容放置在以下槽中的方法:

  • Background() - 被其他内容覆盖的背景层
  • Header() - 所有页面的公共标题
  • Content() - 主页内容
  • Footer() - 所有页面的通用页脚
  • Foreground() - 覆盖其他内容的前景层

布局引擎根据添加到PageLayout.Content()槽的内容生成页面。 其他插槽在每个页面上重复。 您可以使用 LayoutContainer 类 将内容添加到插槽。 这是布局 API 的关 键构建块,它允许您生成任意布局、表格、文本或图像。

前面的示例使用垂直堆叠内容的LayoutContainer.Column方法。 该列包含 3 个项目 - 第一页的文本块、显式 分页符和第二页的文本块。

还有LayoutContainer.Row方法。 查看如何同时使用行和列创建多列 PDF 文档

您可以在 PDF 文档中混合不同的页面布局。 只需多次调用Document.Pages方法即可。 有关示例,请参阅 GitHub 上的 PDF 页面布局设置 示例。

将文本添加到 PDF 文档

文本是PDF文档的重要组成部分。 您可以使用 LayoutContainer.Text 方 法 添加文本。 之前,您看到了 LayoutContainer.Text(string)重载的用例。 让我们看看这个方法的另一个重载:

PdfDocumentBuilder.Create().Generate("text.pdf", doc =>
{
    doc.Pages(p => p.Content().Text(text =>
    {
        text.Span("VB.NET").Style(t => t.Strong);
        text.Span(" is a multi-paradigm, object-oriented programming language, implemented on.NET, Mono, and the ");
        text.Hyperlink(".NET Framework", new Uri("https://dotnet.microsoft.com/en-us/download/dotnet-framework"));
        text.Line(".");

        text.Line("Microsoft launched VB.NET in 2002 as the successor to its original Visual Basic language.");
    }));
});

TextContainer 类 提供了绘制文本、链接、页码的方法。 使用 SpanLine方法将文本添加到当前行。 Line 方法还完成当前行。 此示例还使用Hyperlink方法添加外 部资源链接。

这是另一个示例,显示如何在页脚中使用动态页码:

PdfDocumentBuilder.Create().Generate("footer.pdf", doc =>
{
    doc.Pages(p => p.Footer().AlignRight().Text(text =>
    {
        text.Style(t => t.Parent.FontColor(new PdfRgbColor(255, 0, 0)));

        text.CurrentPageNumber();
        text.Span(" / ");
        text.PageCount();
    }));
});

布局 API 提供了一种设置页码格式的方法。 例如,您可以像这样绘制十六进制页码:

text.CurrentPageNumber().Format(p => "0x" + p?.ToString("x2"));

在 C# 和 VB.NET 中向 PDF 文档添加页眉和页脚示例 演示了如何将页码格式设置为罗马 数字。

您可能会看到上面的示例使用Style方法。 让我们更详细地研究文本样式的概念。

版式

文本样式允许您自定义文本外观。 TextStyle 类 提供更改字体大小、 字母间距、颜色和其他文本属性的方法。 TextStyle 对象是不可变的,因此每个方法调用都会产生新的文本样 式。 您可以在不同的布局级别应用文本样式:

PdfDocumentBuilder.Create().Generate("text-styles.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.TextStyle(TextStyle.Parent.FontSize(30));

        page.Content()
            .TextStyle(TextStyle.Parent.FontColor(new PdfRgbColor(0, 0, 255)))
            .Text(t =>
            {
                t.Style(TextStyle.Parent.Underline());

                t.Span("Hello PDF").Style(TextStyle.Parent.DirectionRightToLeft());
            });
    });
});

TextStyle.Parent 属性返回一个特殊样式,所有文本属性均未定义。 前面的示例以相反的顺序(从右到左) 将“Hello PDF”绘制为蓝色、下划线、30 点字体大小。 请参阅自定义 PDF 文档中的文本外 观 示例,了解另一个文本样式继承示例。

TextStyle 类支持自定义除关联字体之外的所有内容。 当您需要为文本样式指定自定义字体时,请使用 Document.TextStyleWithFont方法。 此 C# 示例展示了如何使用系统字体:

PdfDocumentBuilder.Create().Generate("fonts.pdf", doc =>
{
    doc.Pages(page =>
    {
        TextStyle style = doc.TextStyleWithFont(SystemFont.Family("Arial").Bold());
        page.Content().Text("Bold text").Style(style);
    });
});

默认情况下,布局引擎会删除未使用的字体字形。 因此,即使对于大字体,生成的文档也可能具有较小的尺寸。 您还可以指定自定义字体加载器、后备字体、缺失字形的处理程序。 有关更多详细信息,请参阅在 PDF 文档中 使用不同字体 示例。

布局 API 提供了一组预定义样式。 您可以通过 Typography 类 使用 或自定义它们:

PdfDocumentBuilder.Create().Generate("typography.pdf", doc =>
{
    doc.Typography(t =>
    {
        var baseFont = new FileInfo("arial.ttf");
        t.Document = doc.TextStyleWithFont(baseFont);
        t.Header = t.Parent.FontSize(20).FontColor(new PdfGrayColor(20));
        t.Footer = t.Footnote;
    });

    doc.Pages(page =>
    {
        page.Header().AlignCenter().Text("Header");

        page.Content().Text(t =>
        {
            t.Line("Title").Style(t => t.Title);
            t.Line("Heading 1").Style(t => t.Heading1);
            t.Line("Regular");
        });

        page.Footer().Height(20).AlignCenter().Text(t => t.CurrentPageNumber());
    });
});

使用Typography类,您不需要使用变量来保留文本样式引用。 您可以使用 Document.Typography 方 法 注册必要的样式,然后从 Typography 对象加载它们。 了解如何在 Typography 示例中使用预定义和自定义样式。

图片

与文本和字体一样,图像是 PDF 文档的另一个基本部分。 布局 API 允许您添加这样的图像:

PdfDocumentBuilder.Create().Generate("image.pdf", doc =>
{
    var imageFile = new FileInfo("image.jpg");
    Image image = doc.Image(imageFile);
    doc.Pages(page => page.Content().MaxWidth(200).Image(image));
});

桌子

布局 API 允许您生成表格。 此 C# 示例展示了如何将表格添加到 PDF 文档:

PdfDocumentBuilder.Create().Generate("table.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Table(t =>
        {
            t.Columns(c =>
            {
                c.ConstantColumn(200);
                c.RelativeColumn(1);
            });

            t.Header(h =>
            {
                h.Cell().Text("Product");
                h.Cell().Text("Features");
            });

            t.Cell().Text("Docotic.Pdf");
            t.Cell().Text("Extract text, PDF to images, compress PDF");
            t.Cell().Text("Docotic.Pdf.Layout");
            t.Cell().Text("Create PDF");
        });
    });
});

您可以创建任何复杂程度的表。 此示例 展示了如何使用单元格边框、背景和跨度。

PDF 文档支持内部链接,允许您生成书签或目录。 此基本 C# 示例展示了如何使用布局 API 添加指向文档部分 的链接:

PdfDocumentBuilder.Create().Generate("link.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Column(c =>
        {
            const string SectionName = "Chapter 1";
            c.Item().SectionLink(SectionName).Text("Link");

            c.Item().PageBreak();

            c.Item().Section(SectionName).Text("Target");
        });
    });
});

您还可以从 GitHub 下载并尝试将目录添加到 PDF 文档 示例。

复杂布局

您可以组合不同的布局组件来生成复杂的 PDF 文档。 从 GitHub 下载并尝试生成具有复杂布局的 PDF 文 档 示例。

可以扩展布局 API。 LayoutContainer.ComponentLayoutContainer.Container 方法允许您重用自定义 组件。 布局组件 示例展示了如何使用ILayoutComponent接口实现自定义组件。

结论

Docotic.Pdf 库 提供了在 C# 和 VB.NET 中创建 PDF 文档的不同方法。 您可以使用或不 使用布局插件从头开始生成PDF文档。 或者,您可以使用 HTML 到 PDF 插 件 从 HTML 创建 PDF。

如果您对 PDF 生成有任何疑问,请联系我们