該頁面可以包含自動翻譯的文字。
使用 C# 和 VB.NET 壓縮 PDF 文檔
在許多情況下,壓縮和優化 PDF 文件是一種普遍的願望。 較小的 PDF 文件更容易透過網路傳輸且儲存成本更 低。 減小 PDF 檔案大小對於歸檔目的尤其重要。
用於優化 PDF 文件的 .NET 程式庫
使用 Docotic.Pdf 函式庫 壓縮 .NET Framework 和 .NET Core 應用程式中的 PDF 文件。該庫可在 NuGet 和我們的網站上找到。在 下載 C# .NET PDF 函式庫 頁面取得該資料庫和免費的限時許可證金鑰。
9.5.17615-dev 14,813 已通過 NuGet 總下載量 4,924,084Docotic.Pdf提供了不同的最佳化手段:
- 最佳化PDF對象
- 刪除重複的 PDF 物件(字體、圖像等)
- 壓縮影像
- 子集字體
- 刪除元數據
- 刪除結構訊息
- 刪除未使用的資源
- 刪除私有應用程式數據
- 扁平化表單欄位和註釋
- 取消嵌入字體
您可以使用以上所有方法來獲得 PDF 文件的最佳壓縮比。 請參閱 在 .NET 中壓縮 PDF 文 件 範例以了解所有這些技術的實際應用。
讓我們更詳細地回顧一下這些壓縮方法。
最佳化 PDF 對象
在內部,PDF 文件是低階 PDF 物件的集合:字典、流、陣列等。 儲存 PDF 檔案時,Docotic.Pdf 預設會套用以下無損優化:
- 使用 Flate 編碼壓縮 PDF 流
- 刪除未使用的 PDF 對象
- 內聯間接PDF對象
- 寫入 PDF 物件而不格式化
- 將 PDF 物件打包到壓縮物件流中
此範例展示如何在 C# 中最佳化 PDF 物件:
using BitMiracle.Docotic.Pdf;
using (var pdf = new PdfDocument("input.pdf"))
{
var saveOptions = new PdfSaveOptions();
// 這些選項預設為啟用並隱式應用:
//saveOptions.Compression = PdfCompression.Flate;
//saveOptions.RemoveUnusedObjects = true;
//saveOptions.OptimizeIndirectObjects = true;
//saveOptions.UseObjectStreams = true;
//saveOptions.WriteWithoutFormatting = true;
pdf.Save("compressed.pdf", saveOptions);
}
所有這些優化都不會影響 PDF 文件的可見內容(文字、圖像、書籤和其他任何內容)。 它們僅影響 PDF 物件在 輸出 PDF 檔案中的寫入和壓縮方式。
刪除未使用的 PDF 物件對於下面討論的其他技術很重要。 除非您有充分的理由保留未使用的對象,否則請勿將
PdfSaveOptions.RemoveUnusedObjects 屬性設為
false
。
刪除 PDF 文件中的重複對象
合併 PDF 文件時,產生的 PDF 通常包含重複的字體和圖像。 替換重複物件有助於減少產生的 PDF 檔案的大 小。 以下是此操作的 C# 範例:
using (var pdf = new PdfDocument("merged.pdf"))
{
pdf.ReplaceDuplicateObjects();
pdf.Save("compressed.pdf");
}
建議在壓縮圖像或取消嵌入字體之前刪除重複的物件。 否則,將需要做大量額外的工作來優化相同圖像或字體的副本。
PdfDocument.ReplaceDuplicateObjects 方法不
會取代內嵌影像。 如果您的文件包含內聯影像,請先使用
PdfCanvas.MoveInlineImagesToResources 方
法。 此方法會將內聯影像轉換為常規影像,然後 ReplaceDuplicateObjects
方法也將能夠對轉換後的影像進
行重複資料刪除。
壓縮 PDF 中的影像
對於具有光柵圖像的文檔,優化 PDF 圖像通常是最有效的壓縮方法。
Docotic.Pdf 函式庫提供了使用 JPEG、CCITT Group 3 和 4(傳真)、JPEG 2000 以及 zip/deflate 壓縮演算 法重新壓縮 PDF 影像的內建方法。 您也可以調整影像大小或縮小影像以進一步減小 PDF 檔案大小。 或者您可 以使用第三方工具自行最佳化影像,然後取代影像。
有關範例,請參閱 GitHub 上的 使用 C# 和 VB.NET 優化 PDF 文件中的圖像 範例。
字體子集
PDF 文件通常嵌入用於繪製文字的字體。 嵌入字體通常包含有關所有受支援字形的資訊。 刪除 PDF 文件中未使 用的字形可以顯著減小輸出檔案的大小。
此範例展示如何在 C# 中優化 PDF 字體:
using (var pdf = new PdfDocument("text.pdf"))
{
pdf.RemoveUnusedFontGlyphs();
pdf.Save("compressed.pdf");
}
子集化不會影響可變文字控制項(例如文字方塊或組合方塊)中使用的字體。
刪除元數據
PDF 文件可以包含未壓縮的 XMP 元數據,其中包含有關作者、關鍵字、創建時間等的資訊。 元資料不會影響 PDF 文件的可見內容。
此範例示範如何使用 C# 從 PDF 檔案中刪除元資料:
using (var pdf = new PdfDocument("metadata.pdf"))
{
XmpMetadata xmp = pdf.Metadata;
xmp.Unembed();
pdf.Info.Clear(false);
pdf.Save("compressed.pdf");
}
刪除結構訊息
PDF 文件可以包含有關其邏輯結構的資訊。 此資訊用於:
- 產生標籤的 PDF 文檔
- 使 PDF 文件可供輔助設備存取
刪除此類資訊有助於減少 PDF 文件大小。 但 PDF 將不再被標記或可供輔助設備存取。 此範例示範如何使用 C# 刪除 PDF 中的結構資訊:
using (var pdf = new PdfDocument("tagged.pdf"))
{
pdf.RemoveStructureInformation();
pdf.Save("compressed.pdf");
}
從 PDF 中刪除未使用的資源
PDF 頁面和 XObject 可以引用比它們使用的更多的字體、圖像或圖案。 您可以使用 PdfDocument.RemoveUnusedResources 方法從 PDF 中刪除未使用的資源。 這是 C# 範例:
using (var pdf = new PdfDocument("input.pdf"))
{
pdf.RemoveUnusedResources();
pdf.Save("compressed.pdf");
}
從 PDF 中刪除私人申請數據
由 Adobe 軟體產生的 PDF 文件可以包含私人應用程式資料。 此類應用程式資料儲存在頁片字典中。
此範例展示如何透過刪除頁片字典來在 C# 中清理和壓縮 PDF:
using (var pdf = new PdfDocument("input.pdf"))
{
pdf.RemovePieceInfo();
pdf.Save("compressed.pdf");
}
展平 PDF 表單欄位和註釋
您可以透過展平表單欄位來減少包含已完成表單的 PDF 文件的大小。 扁平化將用其視覺表示取代表單一欄位。 填寫的值將被保留。 此 C# 範例展示如何展平所有 PDF 表單欄位:
using (var pdf = new PdfDocument("form.pdf"))
{
pdf.FlattenControls();
pdf.Save("compressed.pdf");
}
或者,您可以使用 PdfDocument.FlattenWidgets 方法展平 所有註解和控制項。
此外, PdfWidget.Flatten 方法可讓您展平單一註解或控制項。
取消嵌入字體
嵌入 PDF 字體對於自訂或稀有字體非常有意義。 同時,Arial 或 Verdana 等廣泛使用的字體會毫無理由地增加 PDF 檔案的大小。 您可以取消嵌入目標平台上可用的流行字體。 C# 程式碼範例:
using (var pdf = new PdfDocument("input.pdf"))
{
unembedFonts(pdf);
pdf.Save("compressed.pdf");
}
/// <summary>
/// 此方法取消嵌入任何字型:
/// * 安裝在作業系統中
/// * 或其名稱包含在「始終不嵌入」清單中
/// * 且其名稱不包含在「始終保留」清單中。
/// </summary>
private static void unembedFonts(PdfDocument pdf)
{
string[] alwaysUnembedList = new string[] { "MyriadPro-Regular" };
string[] alwaysKeepList = new string[] { "ImportantFontName", "AnotherImportantFontName" };
foreach (PdfFont font in pdf.GetFonts())
{
if (!font.Embedded ||
font.EncodingName == "Built-In" ||
Array.Exists(alwaysKeepList, name => font.Name == name))
{
continue;
}
if (font.Format == PdfFontFormat.TrueType || font.Format == PdfFontFormat.CidType2)
{
SystemFontLoader loader = SystemFontLoader.Instance;
byte[] fontBytes = loader.Load(font.Name, font.Bold, font.Italic);
if (fontBytes != null)
{
font.Unembed();
continue;
}
}
if (Array.Exists(alwaysUnembedList, name => font.Name == name))
font.Unembed();
}
}
請勿將此技術用於 PDF/A 文件。 PDF/A 文件必須嵌入所有字體。
請務必在目標作業系統(Windows、Linux、macOS、iOS、Android)和 PDF 檢視器(Adobe、Foxit 等)中使用未 嵌入字體測試 PDF 文件。
其他減少 PDF 大小的方法
上面提到了很多優化方法。 但是,您可以透過刪除不重要的內容來進一步壓縮 PDF 文件。 Docotic.Pdf 允許您 從 PDF 文件中刪除這些物件:
- 註釋
- 附件
- 書籤
- 表單字段
- 頁數
- 腳本
- 透明度
您也可以從 PDF 頁面中刪除文字、圖像和向量圖形。 文字扁平化也是可能的。
結論
您可以使用 Docotic.Pdf 庫 在 C# 和 VB.NET 中壓縮 PDF。 Docotic.Pdf提供了許多有效 的最佳化手段。
從 GitHub 下載並嘗試完整的用 C# 和 VB.NET 壓縮 PDF 文件 範例。
聯絡我們,我們將建議如何為您的 PDF 文件實現最佳壓縮比。