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

建構 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.6.17807 佈局附加元件 9.6.17807
回歸測試 14,868 已通過 NuGet 總下載量 5,134,090

加密

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