該頁面可以包含自動翻譯的文字。
建立文件
當然,您需要以您的資料產生 PDF 文件。但通常您也會希望以密碼加密 PDF 檔案。而且您通常會想要將 PDF 中繼資料加入輸出檔案。
繼續閱讀,了解如何指示產生器加密 PDF 檔案,以及如何指定文件作者和關鍵字。
本文是關於 Layout API 的 PDF 產生系列文章之一。如果您是第一次接觸此 API,請先閱讀 開始使用 Layout API 部分。

Create & Generate
Layout API 的入口點是 PdfDocumentBuilder 類別。您先以 Create 方法建立此類別的執行個體。若要產生 PDF,則呼叫 Generate 方法。
Generate 可將輸出儲存到檔案或串流。此方法的任一版本都需要一個 Action<Document> 類型的委派作為第二個參數。在委派中,您描述想要取得的文件。程式庫會根據這些描述產生 PDF。
加密
若要加密輸出 PDF,請在 Encryption 方法之前呼叫 Generate 方法。
您需要建立並提供加密處理常式。若要使用密碼加密 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。您必須自行處置串流提供者執行個體。