该页面可以包含自动翻译的文本。
建筑文件
当然,您需要使用您的数据生成 PDF 文档。 但通常,您还想使用密码加密 PDF 文件。 您通常希望将 PDF 元数 据添加到输出文件中。
继续阅读以了解如何指示生成器加密 PDF 文件。 如何指定文档作者和关键字。
本文是有关用于 PDF 生成的 Layout API 的系列文章的一部分。 如果您是 API 新手,请先阅读 Layout API入 门 部分。
Create & Generate
Layout API 的入口点是 PdfDocumentBuilder 类。
首先使用 Create
方法创建类的实例。 要生成 PDF,您可以调用该类的
Generate 方法。
Generate
可以将输出保存到文件或流中。 该方法的任一版本都需要
Action
<Document> 类型的委托作为第二个参数。 在委托中,
您描述您想要获取的文档。 图书馆将根据描述生成 PDF。
14,820 通过 NuGet 总下载量 4,998,853
加密
要加密输出 PDF,请在 Generate 方法之 前调用 Encryption 方法。
您需要创建并提供一个加密处理程序。 要使用密码加密 PDF,请使用 PdfStandardEncryptionHandler 类型的处理程 序。
PdfDocumentBuilder.Create()
.Encryption(new PdfStandardEncryptionHandler("owner", "user"))
.Generate("encrypted-with-password.pdf", doc => doc.Pages(_ => { }));
您还可以使用证书加密 PDF。 查看加密PDF文档文章。 它包含有关加密处理程序和 PDF 权限的详细信息。
PDF 文件元数据
在某些工作流程中,在输出 PDF 中指定正确的 PDF 关键字和 PDF 作者非常重要。 Layout API 为此提供了一种 简单的方法。 在 Generate 方法之前调用 Info 方法,并在委托中提供元数据值。
PdfDocumentBuilder.Create()
.Info(info =>
{
info.Author = $"{Environment.UserName}";
info.Title = "Generate encrypted PDF with custom metadata";
info.Keywords = "Metadata keywords encryption";
})
.Generate("metadata.pdf", doc => doc.Pages(_ => { }));
选项
对于相同的内容,图书馆可以创建具有不同内部结构的PDF文件。 这些选项将影响输出的 PDF。
版本
使用 Version 方法设置输出 PDF 的最低 PDF 格式版本。
PdfDocumentBuilder.Create()
.Version(PdfVersion.Pdf17)
.Generate("version.pdf", doc => doc.Pages(_ => { }));
请注意,图书馆可以创建比指定版本更大的 PDF。 当文档内容需要更新版本时会发生这种情况。 换句话说:当 文档使用指定版本的 PDF 标准中不可用的功能时。
对象流
默认情况下,该库在生成的 PDF 中使用对象流。 这有助于生成更小、更好的压缩文件。
您可以使用 ObjectStreams 方法指 示 API 创建没有对象流的 PDF 文件。
PdfDocumentBuilder.Create()
.ObjectStreams(false)
.Generate("no-object-streams.pdf", doc => doc.Pages(_ => { }));
我建议您继续使用对象流,除非有一些法规要求。 或者当工作流程的某些其他部分无法使用对象流处理文档时。
流媒体提供商
该库使用流作为中间存储。 生成 PDF 时,它会针对图像和其他大型对象执行此操作。 库通过流提供者获取流。 始终有一个与当前 PdfDocumentBuilder 实例关联。
该库默认使用 PdfMixedStorageStreamProvider。 此流提供程 序实现提供将数据保存在内存中的流。 当数据太多时,这些流将其内容刷新到临时文件中。 这可以减少内存消 耗并避免 LOH 碎片。
生成 PDF 文件时,您可以使用自己的 IPdfStreamProvider 接口实现。 更改的原因之一可能是磁盘操作缓慢和/或昂贵。 云环境可能适合此描述。
此代码展示了如何完全在内存中生成 PDF,无需临时文件。 请注意,这将比默认选项需要更多的内存。
using (var memoryOnlyProvider = new PdfMemoryStreamProvider())
{
PdfDocumentBuilder.Create()
.StreamProvider(memoryOnlyProvider)
.Generate("created-without-temp-files.pdf", doc => doc.Pages(_ => { }));
}
该库最终会对通过流提供者获取的每个流调用 Dispose
。 您必须自行处理流提供程序实例。