該頁面可以包含自動翻譯的文字。
建構 PDF 文檔
當然,您需要使用您的資料來產生 PDF 文件。 但通常,您還想使用密碼加密 PDF 檔案。 您通常希望將 PDF 元 資料新增至輸出檔案。
繼續閱讀以了解如何指示生成器加密 PDF 文件。 如何指定文檔作者和關鍵字。
本文是用於 PDF 產生的 Layout API 的系列文章的一部分。 如果您是 API 新手,請先閱讀 Layout API 入 門 部分。
Create & Generate
Layout API 的入口點是 PdfDocumentBuilder 類
別。 首先使用 Create
方法建立類別的實例。 要產生PDF,您可以呼叫該類別的
Generate 方法。
Generate
可以將輸出儲存到檔案或流中。 此方法的任一版本都需要
Action
<Document> 類型的委託作為第二個參數。 在委託中,
您描述您想要取得的文件。 圖書館將根據描述產生 PDF。
14,813 已通過 NuGet 總下載量 4,924,084
加密
若要加密輸出 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
。 您必須自行處理流程提供者實例。