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

使用 C# 和 VB.NET 壓縮 PDF 文檔

在許多情況下,壓縮和優化 PDF 文件是一種普遍的願望。 較小的 PDF 文件更容易透過網路傳輸且儲存成本更 低。 減小 PDF 檔案大小對於歸檔目的尤其重要。

在 C# 和 VB.NET 中最佳化 PDF 文檔

用於優化 PDF 文件的 .NET 程式庫

使用 Docotic.Pdf 函式庫 在 .NET Framework 和 .NET Core 應用程式中壓縮 PDF 文件。 您可以下載該庫的 binaries 或使用其 NuGet 套件。 要在沒有 評估模式限制的情況下試用該程式庫,您可以使用此處的表格 取得免費的限時 許可證金鑰。

Docotic.Pdf 函式庫 9.3.17036-dev 回歸測試 14,665 已通過 NuGet 總下載量 4,191,515

Docotic.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 中的影像

對於具有光柵圖像的文檔,優化 P​​DF 圖像通常是最有效的壓縮方法。

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 中刪除私人申請數據

由 Adob​​e 軟體產生的 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 文件實現最佳壓縮比。