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

建筑文件

当然,您需要使用您的数据生成 PDF 文档。 但通常,您还想使用密码加密 PDF 文件。 您通常希望将 PDF 元数 据添加到输出文件中。

继续阅读以了解如何指示生成器加密 PDF 文件。 如何指定文档作者和关键字。

本文是有关用于 PDF 生成的 Layout API 的系列文章的一部分。 如果您是 API 新手,请先阅读 Layout API入 门 部分。

构建 PDF 文档

Create & Generate

Layout API 的入口点是 PdfDocumentBuilder 类。 首先使用 Create 方法创建类的实例。 要生成 PDF,您 可以调用该类的 Generate 方法。

Generate 可以将输出保存到文件或流中。 该方法的任一版本都需要 Action<Document> 类型的委托作为第 二个参数。 在委托中,您描述您想要获取的文档。 图书馆将根据描述生成 PDF。

Docotic.Pdf 库 9.4.17342 布局附加组件 9.4.17342
回归测试 14,727 通过 NuGet 总下载量 4,260,602

加密

要加密输出 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。 您必须自行处理流提供程序实例。