該頁面可以包含自動翻譯的文字。

建構 PDF 文檔

當然,您需要使用您的資料來產生 PDF 文件。 但通常,您還想使用密碼加密 PDF 檔案。 您通常希望將 PDF 元 資料新增至輸出檔案。

繼續閱讀以了解如何指示生成器加密 PDF 文件。 如何指定文檔作者和關鍵字。

本文是用於 PDF 產生的 La​​yout API 的系列文章的一部分。 如果您是 API 新手,請先閱讀 Layout API 入 門 部分。

建立 PDF 文件

Create & Generate

Layout API 的入口點是 PdfDocumentBuilder 類別。 首先使用 Create 方法建立類別的實例。 要產生 PDF,您可以呼叫該類別的 Generate 方法。

Generate 可以將輸出儲存到檔案或流中。 此方法的任一版本都需要 Action<Document> 類型的委託作為第 二個參數。 在委託中,您描述您想要取得的文件。 圖書館將根據描述產生 PDF。

Docotic.Pdf 函式庫 9.3.17105-dev 佈局附加元件 9.3.17105-dev
回歸測試 14,681 已通過 NuGet 總下載量 4,234,061

加密

若要加密輸出 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。 您必須自行處理流程提供者實例。