该页面可以包含自动翻译的文本。
在 C# 和 VB.NET 中创建 PDF 文档
作为 .NET 开发人员,您是否需要生成 PDF 报告、发票、收据或其他文档? 使用 Docotic.Pdf 库 在 .NET Core、.NET Standard 或 .NET Framework 项目中生成 PDF 文档。 您可以轻松 完成此操作,而无需了解 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 页面之间。
9.5.17664-dev 9.5.17664-dev 9.5.17664-dev14,820 通过 NuGet 总下载量 4,998,853
您还可以将附加组件与核心库一起使用。 例如,使用布局 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 中。在 下载 C# .NET PDF 库 页面上获取库、附加组件和免费的限时许可证密钥。
使用布局 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 类 提供了绘制文本、链接、页码的方法。 使用
Span
和Line
方法将文本添加到当前行。 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.Component
和 LayoutContainer.Container
方法允许您重用自定义
组件。 布局组件 示例展示了如何使用ILayoutComponent
接口实现自定义组件。
结论
Docotic.Pdf 库 提供了在 C# 和 VB.NET 中创建 PDF 文档的不同方法。 您可以使用或不 使用布局插件从头开始生成PDF文档。 或者,您可以使用 HTML 到 PDF 插 件 从 HTML 创建 PDF。
如果您对 PDF 生成有任何疑问,请联系我们。