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

在 C# 中編輯 PDF

使用 Docotic.Pdf 修改您的 PDF 文件。它是 C# 和 VB.NET 的 PDF 編輯庫,結合了強大的功能和直覺的 API。

Docotic.Pdf 函式庫 9.5.17573-dev 回歸測試 14,726 已通過 NuGet 總下載量 4,765,230
PDF 編輯器圖標

Docotic.Pdf 提供了許多編輯 PDF 文件的方法。以下是該程式庫用於 PDF 編輯的一些主要功能:

  • 將多個 PDF 合併為一個或將單一 PDF 拆分為多個文件。
  • 減少 PDF 檔案大小。
  • 重新排列、刪除、旋轉或擷取頁面。
  • 讀取、變更或刪除 PDF 元資料。
  • 使用數位簽章對 PDF 進行簽章。
  • 加密文件或刪除 PDF 中的密碼。
  • 新增、編輯或刪除註釋和附件。
  • 填寫AcroForms,新增或刪除表單控制項。
  • 扁平化表單欄位和註釋,使它們成為 PDF 內容的一部分。
  • 新增、刪除或取代 PDF 中的文字。
  • 插入、取代影像和調整影像大小。
  • 添加浮水印和背景。
  • 將掃描文件轉換為可編輯和可搜尋的文字。

在接下來的部分中,我將更詳細地描述 PDF 編輯功能。這些部分還包含程式碼片段和相關資源的連結。

合併和拆分 PDF

本節介紹兩個具有相反目標的功能。

在 C# 和 VB.NET 中拆分和合併 PDF

合併PDF

合併 PDF 文件時,您會建立一個 PDF 文件。合併的 PDF 通常包含多個現有 PDF 檔案的相關資訊。

以下程式碼片段展示如何使用 Docotic.Pdf 合併 PDF 檔案。

using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.Save("merged.pdf");

程式碼非常簡單,因為它展示了最基本的情況。我們有一篇文章描述了更複雜的合併情況。例如,它展示瞭如何組合加密文件。

分割PDF

拆分是指從原始 PDF 中提取選定的頁面以建立一個或多個新的 PDF 檔案。當您只想共用文件的一部分時,此過程非常有用。

以下程式碼片段展示如何從 PDF 的每個頁面建立新文件。

using var pdf = new PdfDocument("compound.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
    using PdfDocument copy = pdf.CopyPages(i, 1);

    // Helps to reduce file size when the copied pages reference
    // unused resources such as fonts, images, patterns.
    copy.RemoveUnusedResources();
    copy.Save(i + ".pdf");
}

在專門的文章中了解實作 PDF 分割器 的其他方法。

PDF壓縮

壓縮 PDF 時有兩種主要方法。第一個是僅套用不更改文件內容的操作,僅更改其形式。第二種方法還包括可能導致細節遺失或文件品質下降的更改,以實現更好的壓縮。

無損 PDF 壓縮

預設情況下,該庫保存 PDF 對象,以便它們佔用更少的位元組。為此,它排除未使用的對象,寫入不帶格式的對象,並儘可能使用較短的形式。

為了進一步改善壓縮,Docotic.Pdf 還在輸出 PDF 中產生物件流。這是用最緊湊的表示方式編寫物件的另一種形式。物件流使用 Flate 演算法進行壓縮。

您可以使用儲存選項影響庫保存物件的方式。

某些文件包含重複的字體、圖像、顏色設定檔和其他物件。增量更新的文件和透過合併多個文件建立的文件通常就是這種情況。使用PdfDocument.ReplaceDuplicateObjects方法對這些物件進行重複資料刪除可以大幅減少輸出大小。

文件的頁面可以引用未使用的資源。例如,以前在頁面上可見但現在不再可見的圖像。使用PdfDocument.RemoveUnusedResources方法刪除此類資源。

對 PDF 進行的所有這些操作都可以減小檔案大小而不損失品質。

有損變換

對於具有圖像的文件,縮小 PDF 大小最有效的方法之一是更改圖像的壓縮方案。例如,對影像使用 JPEG 之類的有損壓縮會減少尺寸。作為副作用,在影像上可以看到壓縮偽影和細節損失。

如果 PDF 中的圖像比需要的圖像大,您可以調整它們的大小。這可以提供更好的壓縮。另一種選擇是將影像轉換為黑白(黑白)。

您可以扁平化表單欄位和註解以節省一些空間。當您不再需要文件中的可編輯註釋和表單欄位時,這是有意義的。

字體可能會佔用文件中的大量空間。 PdfDocument.RemoveUnusedFontGlyphs 方法可以從字體中刪除未使用的字形以最佳化輸出大小。字體子集化是此過程的另一個名稱。您甚至可以從文件中完全刪除字體位元組(取消嵌入字體)。當文件包含 Arial 等流行字體的位元組時,這可能有意義。

其他轉換直接從文件中刪除資訊。您可以刪除元資料、結構資訊和私有應用程式資料。此資料不可見,但僅當它對文件的使用者不重要時才將其刪除。

若要了解更多詳細資訊並查看一些程式碼範例,請閱讀有關如何減小 PDF 檔案大小 的文章。

對 PDF 中的頁面重新排序

有足夠的理由更改 PDF 中的頁面順序。例如,您可能需要將相關資訊分組在一起,或透過確保文件的邏輯流動來提高文件的可讀性。

重新排列 PDF 中的頁面

除了合併和分割頁面 的功能之外,Docotic.Pdf 還提供了一組廣泛的其他方法來重新排列 PDF 中的頁面。我將使用 C# 程式碼片段和 Docotic.Pdf API 來展示如何組織 PDF 頁面。

您可以在 頁面和導航 範例程式碼群組中找到本節範例的完整測試項目。我在片段中使用 ten-pages.pdf 。這是一個簡單的測試文檔,每頁上都有一個Page N標題。

行動 PDF 頁面

以下程式碼片段顯示如何移動連續範圍的頁面。程式碼將頁面的前半部分移動到文件的末尾。

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.MovePages(0, 5, pdf.PageCount);

pdf.Save("continuous-move.pdf");

可以移動任意頁面集。以下程式碼將奇數頁移到文件結尾。

using var pdf = new PdfDocument("ten-pages.pdf");

int[] indexes = [0, 2, 4, 6, 8];
pdf.MovePages(indexes, pdf.PageCount);

pdf.Save("arbitrary-move.pdf");

若要僅移動一頁,請使用PdfDocument.MovePage方法。

交換 PDF 頁面

若要交換兩個頁面,請使用以下程式碼片段中的程式碼。

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.SwapPages(9, 0);
pdf.SwapPages(8, 1);

pdf.Save("swapped.pdf");

PdfDocument.SwapPages 方法接受應該佔據彼此位置的兩個頁面的索引。當頁數不等於 2 時,請使用 MovePages 方法 之一。

新增和插入頁面

任何PdfDocument至少包含一頁。當您建立新文件時,庫會隱式地新增一頁。

以下是如何使用 Docotic.Pdf API 在 PDF 中插入空白頁。您可以在索引從0PageCount(含)的位置插入頁面。

using var pdf = new PdfDocument();

var newPage = pdf.InsertPage(0);
newPage.Canvas.DrawString("This is the new first page");

pdf.Save("two-pages.pdf");

若要為 PDF 新增空白頁,請使用PdfDocument.AddPage方法。該方法將新頁面新增至文件末尾。它的作用與pdf.InsertPage(pdf.PageCount)呼叫相同。

若要從另一個文件新增或插入頁面,請使用 前置 PDF 部分所述的呼叫組合。您可以使用呼叫組合將封面新增至 PDF。

重複的 PDF 頁面

使用庫 API,您可以將重複操作作為兩個連續操作來執行。第一個是複製頁面操作。請參閱拆分 PDF 部分 中的程式碼範例。

第二個是貼上頁面操作。對於此操作,請使用PdfDocument.Append方法。然後將附加頁移到所需位置。

提取頁面

以下程式碼片段展示如何從 PDF 中提取頁面。它從來源文檔中提取前三頁。

using var pdf = new PdfDocument("ten-pages.pdf");

using (var extracted = pdf.ExtractPages(0, 3))
{
    extracted.RemoveUnusedResources();
    extracted.Save("three-pages.pdf");
}

pdf.Save("seven-pages.pdf");

ExtractPages 方法從文件中刪除頁面。因此,在來源文件中只剩下七頁。該庫不允許從僅包含一頁的文件中提取頁面。

我們建議從包含提取頁面的文件中刪除未使用的資源。

從 PDF 中刪除頁面

查看顯示如何刪除 PDF 文件中的頁面的程式碼片段。它實際上使用RemovePage方法的不同重載刪除了兩個頁面。第一個重載接受頁面索引作為其參數。第二個重載接受一個頁面物件。

using var pdf = new PdfDocument("ten-pages.pdf");
pdf.RemovePage(0);
pdf.RemovePage(pdf.Pages[0]);
pdf.Save("without-first-two-pages.pdf");

若要一次刪除多頁,請使用PdfDocument.RemovePages方法。此方法重載了頁面索引或頁面物件陣列的工作。

數位簽名

Docotic.Pdf 實現了 PDF 中數位簽章的許多操作,可以幫助您維護 PDF 文件的可信度和法律有效性。以下是該程式庫可以執行的操作的一些範例:

使用憑證簽署 PDF。在 PDF 中加入數位簽章是確認簽章者身分並確保簽章後沒有人更改文件的方法。

證明簽名。若要為 PDF 新增其他限制,您可以使用認證簽名對其進行簽名。您可以在簽名後完全鎖定 PDF 或允許進行幾種類型的變更。

驗證 PDF 中的簽名。檢查數位簽名的有效性以確認文件的簽名部分沒有更改。

允許多個簽名。合約、協議和表格通常需要多方簽署一份文件。在PDF中新增多個簽章需要文件以增量方式儲存

嵌入簽名時間戳。可以在簽章選項中指定時間戳頒發機構 URL 及其憑證(選用)。庫會將收到的時間戳記嵌入簽名中。

嵌入證書。該庫自動將簽名證書嵌入數位簽章中。

數位簽章頁面 包含範例程式碼以及有關每個操作的更多資訊。

保護PDF

您可以使用三個功能來確保 PDF 安全。 Docotic.Pdf 可以在兩個方向上使用它們:該程式庫可以保護 PDF 並解鎖受保護的 PDF。

PDF安全性

密碼保護

此功能可讓您設定密碼以限制對 PDF 的存取。根據密碼類型,PDF 將需要正確的密碼才能開啟或修改文件。

PDF 中有兩種類型的密碼:

  • 開啟密碼(使用者密碼)。開啟和查看 PDF 需要此類密碼。如果沒有正確的密碼,合格的 PDF 檢視器將無法開啟該文件。
  • 權限密碼(所有者密碼)。需要此密碼才能刪除 PDF 的權限。使用所有者密碼開啟 PDF 允許執行所有操作,即使權限限制某些操作,例如列印、複製或編輯 PDF。

您可以為同一個 PDF 文件設定兩個密碼。閱讀解密 PDF 檔案 以了解如何從 PDF 文件中刪除密碼。

加密

PDF 加密和 PDF 密碼共同確保 PDF 中的敏感資訊僅可供合法使用者使用。只有擁有正確解密金鑰或密碼的使用者才能查看內容。

Docotic.Pdf 可以使用 RC4 40 位元、RC4 128 位元、AES 128 位元和 AES 256 位元加密 演算法加密 PDF 檔案。

權限和限制

您可以對PDF設定各種權限,例如限製列印、複製文字、編輯文件等。這些權限僅影響有人使用使用者密碼開啟 PDF 時的體驗。使用所有者密碼開啟 PDF 的使用者不受任何限制。

要刪除 PDF 的權限,您需要先刪除 PDF 安全密碼。閱讀如何使用 C# 和 Docotic.Pdf API 執行此操作

若要了解除了 PDF 安全性之外如何確保 PDF 完整性,請閱讀有關數位簽章的部分。

PDF 中的元數據

PDF 元資料是嵌入在 PDF 文件中的信息,提供有關文件的詳細資訊。元資料有兩個主要來源:PDF 文件屬性和 XMP 元資料。

文件屬性通常也稱為文件資訊字典、文件資訊、元資料欄位、文件屬性和文件屬性。

XMP(可擴充元資料平台)元資料基本上是嵌入 PDF 中的 XML 檔案。 XMP 使用靈活的資料模型,可以儲存任何元資料屬性集。此元資料使用命名空間對相關屬性進行分組。一些常見的命名空間包括 XMP Core/XMP Basic 和 Dublin Core。

Docotic.Pdf 完全支援 XMP 元資料和文件屬性。請注意,PDF 2.0 標準將大多數文件資訊字典屬性標記為已棄用。唯一的例外是建立日期和修改日期。

您可以在範例程式碼的元資料組中找到本節範例的完整測試項目。

文件屬性

了解如何使用 Docotic.Pdf 編輯文件屬性。

using var pdf = new PdfDocument("file.pdf");
pdf.Info.Author = "An example code";
pdf.Info.Subject = "Showing how to access and change document metadata";
pdf.Info.Title = "Custom title goes here";
pdf.Info.Keywords = "pdf Docotic.Pdf";

pdf.Save("updated-file.pdf");

您可以變更每個屬性的值,但請注意,預設情況下,程式庫會在儲存 PDF 之前自動更新某些屬性。您可以在儲存選項中變更此設定。

若要刪除文檔屬性中指定的所有元數據,請使用PdfInfo.Clear方法。如果您願意,該方法只能刪除自訂屬性。

XMP元數據

此程式碼片段展示如何變更 PDF 文件中 XMP 元資料的屬性。

using var pdf = new PdfDocument("file.pdf");

pdf.Metadata.DublinCore.Creators = new XmpArray(XmpArrayType.Ordered);
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("me"));
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("Docotic.Pdf"));
pdf.Metadata.DublinCore.Format = new XmpString("application/pdf");

pdf.Metadata.Pdf.Producer = new XmpString("me too!");

pdf.Save("updated-file.pdf");

該程式碼變更 Dublin Core 和 Adob​​e PDF 架構中的屬性。請注意,由於預設儲存選項,Producer 屬性會被覆寫。

您可以使用XmpMetatada.Save方法之一來提取原始 XMP 元資料。此方法將產生包含所有屬性的 XML。

若要從文件中刪除所有 XMP 元數據,請使用XmpMetadata.Unembed方法。

同步元數據

最好確保 XMP 元資料和文件資訊屬性的相應屬性具有相同的值。如果您在同一文件中編輯兩個元資料來源,則尤其如此。

使用PdfDocument.SyncMetadata方法同步 XMP 元資料和文件資訊中的值。當兩個來源中的屬性發生變更時,該方法將使用一個來源中的值覆寫另一個來源中的值。閱讀該方法的文檔 以了解更多詳細資訊。

PDF書籤

PDF 文件可以包含特殊的快捷方式或鏈接,幫助讀者快速導航到特定部分或頁面。 PDF 大綱是書籤的別稱。

PDF大綱

檢視器應用程式通常會顯示書籤,例如書中的目錄,但是是互動的。當讀者點擊書籤時,檢視器應用程式會跳到文件的指定部分。使用 連結註解 可以實現類似的行為。

下面是一個 C# 程式碼片段,展示如何在 PDF 中加入書籤:

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
root.AddChild("Fifth page", 4);
root.AddChild("Seventh page", pdf.Pages[6]);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("simple-bookmarks.pdf");

PDF大綱可以有主書籤和子書籤,從而更容易建立大型文件。以下是在 PDF 中建立子書籤的方法:

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
var evenPages = root.AddChild("Even pages");

evenPages.AddChild("Second page", 1);
evenPages.AddChild("Fourth page", 3);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("even-pages-bookmarks.pdf");

您可以將字體和顏色套用至書籤項目。查看建立帶有樣式的輪廓 的完整範例。

若要從 PDF 中移除書籤,請使用RemoveChildRemoveChildAt方法。您可以透過呼叫根節點上的RemoveAllChildren方法來刪除所有書籤。

文件附件

PDF 附件是嵌入 PDF 文件中的外部文件。人們通常還將這些文件稱為嵌入式文件和文件附件。您可以附加任何文件:圖像、音訊/視訊檔案、另一個 PDF、Word 文件、Excel 電子表格或其他任何文件。

如果您想將 PDF 附加在一起,請建立一個合併的 PDF 文件,請查看有關合併 pdf 文件 的文章。

以下 C# 程式碼展示如何使用 Docotic.Pdf API 將附件新增至 PDF。

using var pdf = new PdfDocument();

var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.SharedAttachments.Add(excelFile);

pdf.Save("shared-attachment.pdf");

上面的程式碼將文件新增為共用附件。讀者可以在檢視器的「附件」面板中找到附件。

也可以為 PDF 頁面新增附件。此類附件像任何其他註釋一樣在頁面內容中可見。

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
page.Canvas.DrawString(20, 100, "Here is this year's figures document:");

var bounds = PdfRectangle.FromLTRB(155, 100, 165, 110);
var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.Pages[0].AddFileAnnotation(bounds, excelFile);

pdf.Save("page-attachment.pdf");

檢查範例程式碼的附件組以尋找本節範例的完整測試項目。

若要從 PDF 中刪除附件,您需要列舉共用附件和頁面註釋,並刪除不需要的項目。請參閱下面的枚舉程式碼範例。若要刪除所有共用註釋,您可以使用pdf.SharedAttachments.Clear()呼叫。

您還需要枚舉集合以從 PDF 中提取嵌入文件。這是一個範例程式碼:

using var pdf = new PdfDocument("file-with-attachments.pdf");

int i = 0;
foreach (var attachment in pdf.SharedAttachments)
{
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

foreach (var widget in pdf.GetWidgets())
{
    var attachment = (widget as PdfFileAttachmentAnnotation)?.File;
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

頁面標籤

PDF 頁面標籤是指派給 PDF 文件中頁面的自訂名稱或編號。與標準頁碼不同,頁面標籤可以包含字母、數字甚至羅馬數字的混合。頁面標籤的其他名稱是頁面識別碼和頁面名稱。

以下是如何使用 Docotic.Pdf 將頁面標籤新增至 PDF:

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.PageLabels.AddRange(0, 3, PdfPageNumberingStyle.LowercaseRoman);
pdf.PageLabels.AddRange(4, PdfPageNumberingStyle.DecimalArabic, string.Empty, 5);
pdf.PageLabels.AddRange(7, PdfPageNumberingStyle.DecimalArabic, "Appendix page ", 1);

pdf.Save("page-labels.pdf");

前四頁將有標籤iiiiiiiv。接下來的三個標籤是567。對於其餘頁面,標籤將為Appendix page 1Appendix page 2Appendix page 3

OCR PDF

某些 PDF 文件包含掃描頁面,需要光學字元辨識 (OCR) 才能從中擷取文字。 OCR 的另一個用例是從使用自訂字形到 Unicode 映射的 PDF 中提取文字。

OCR 掃描 PDF 提取文本

我們有一篇部落格文章展示如何OCR 掃描 文件。這篇文章包含一個不可搜尋的 PDF 範例,並展示如何使用 Tesseract OCR、C# 程式碼和 Docotic.Pdf 識別純圖像 PDF 中的文字。您也可以使用 Docotic.Pdf 將 OCR 文字圖層新增至掃描的 PDF 檔案中。

編輯頁面

本節討論現有 PDF 頁面的更改,例如:

  • 如何旋轉PDF頁面
  • 如何改變頁面大小
  • 在頁面畫布上使用向量圖形
  • 新增HTML內容

閱讀該庫的佈局 API,了解如何透過頁首和頁尾、表格、圖像、文字段落等構建塊建立 PDF 文件

查看其他部分以取得以下資訊:

旋轉頁面

請參閱 C# 程式碼片段,以了解如何僅旋轉 PDF 中的一頁:

using var pdf = new PdfDocument("existing.pdf");

pdf.Pages[0].Rotation = PdfRotation.Rotate180;

pdf.Save("rotated.pdf");

該代碼將第一頁旋轉 180 度。您也可以將 PDF 頁面旋轉 0、90 和 270 度。

更改頁面大小

Docotic.Pdf 提供了不只一種更改 PDF 頁面大小的方法。在最簡單的情況下,您可以使用PdfPage物件的WidthHeight屬性來指定所需的大小。對於現有文檔,它不會調整文檔頁面內容的大小。並且它不會刪除任何內容。它只會隱藏指定大小的矩形之外的所有頁面內容。

類似的方法是裁剪頁面。您可以使用 C# 程式碼變更頁面的CropBox,如下所示:

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var cropBoxBefore = page.CropBox;
page.CropBox = new PdfBox(0, cropBoxBefore.Height - 256, 256, cropBoxBefore.Height);

pdf.Save("cropped.pdf");

如果您想將頁面的一部分另存為影像,則可以變更裁切框。

如果目標是使所有內容在不同大小的頁面上可見,則使用縮放方法。在下面的程式碼片段中,我從頁面建立一個 XObject。 XObject 就像一個向量圖像。您可以在多個頁面上繪製同一對象,根據需要縮放和旋轉它。

XObject準備好後,我清除之前的頁面內容,調整頁面大小,然後在調整大小的頁面上繪製物件。

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var pageXObject = pdf.CreateXObject(page);

page.Canvas.Clear();
page.Width /= 2;
page.Height /= 2;

page.Canvas.DrawXObject(pageXObject, 0, 0, page.Width, page.Height, 0);

pdf.Save("resized.pdf");

向量圖形

Docotic.Pdf 庫可以為 PDF 文件添加直線、曲線和形狀等向量圖形。您可以從圖形物件建構圖形路徑。然後,您可以使用不同色彩空間的色彩填滿或描邊路徑。

在範例程式碼的圖形組中尋找圖形相關功能的範例程式碼。

也可以從 PDF 中提取圖形。從呼叫GetObjects方法開始,然後從PdfPageObjectType.Path類型的物件中提取資訊。不要忘記 XObject 還可以包含巢狀路徑。

using var pdf = new PdfDocument("existing.pdf");

var options = new PdfObjectExtractionOptions();
var objects = pdf.Pages[0].GetObjects(options);
foreach (var obj in objects)
{
    if (obj.Type == PdfPageObjectType.Path)
    {
        var path = (PdfPath)obj;
        Console.WriteLine($"Found path {path}");
    }
    else if (obj.Type == PdfPageObjectType.XObject)
    {
        var paintedXObject = (PdfPaintedXObject)obj;
        var nestedObjects = paintedXObject.XObject.GetObjects(options);
        // ...
    }
}

將 HTML 新增到 PDF 頁面

將 HTML 內容疊加到 PDF 文件上對於向 PDF 添加動態元素(例如圖表或股票價格行情)非常有用。

了解如何在 PDF 中插入 HTML 以獲取更多詳細資訊並下載範例程式碼。

編輯PDF文本

本節介紹如何編輯 PDF 中的文字、如何變更 PDF 中的文字顏色以及如何新增文字。

PDF 編輯器更改文字

我們有一篇文章專門介紹如何從 PDF 中提取文本。查看有關該主題的更多資訊。

文本扁平化 也可以在 Docotic.Pdf 的幫助下實現。

尋找並替換

要修改 PDF 中的文本,您需要找到包含文字的區域,然後刪除該區域中的文字。最後一步是將新文字新增到文件的相同區域。

搜尋 PDF 可能會很棘手,因為文件內部可以包含任意順序的單字。文字也可以旋轉。幸運的是,我們有一個範例程式碼,展示了如何在 PDF 中搜尋單字或短語

當您有要刪除的文字座標時,就可以編輯包含的頁面內容了。該庫提供了枚舉和複製頁面物件的方法。因此,在複製物件時可以省略一些文字。這基本上會刪除文字。 編輯 PDF 頁面內容 範例的程式碼顯示了該過程的所有細節。您需要更新ShouldRemoveText方法才能使用找到的座標。

閱讀下一節以了解如何將新文字新增至文件。

如果您使用佔位符文字建立文檔,然後將佔位符替換為其他文本,則可以改用文字方塊。

這個想法是向文件添加一個無邊框的唯讀文字框,並將佔位符文字放入其中。稍後您可以開啟文檔,透過名稱找到文字框,然後用簡單的呼叫 box.Text = "new text"; 取代佔位符。如果您不想進行任何進一步的更改,請在替換後展平文字方塊。

新增文字

若要為文件新增一些文本,請使用PdfCanvas物件的DrawStringDrawText方法。這些方法使用目前的畫布字體。字體必須包含文字中所有字元的字形。使用PdfFont.ContainsGlyphsForText方法檢查字體是否符合此要求。

var canvas = pdf.Pages[0].Canvas;
canvas.Font = pdf.AddFont("NSimSun")
    ?? throw new ArgumentException("Font not found");

canvas.DrawString(10, 50, "Olá. 你好. Hello. This is some new text");

您可以新增使用 Type1、TrueType 和 OpenType 字型繪製的 Unicode 文字。該程式庫可以使用系統上安裝的字體、14 種內建 Type1 字體,或從檔案載入所需的字體。

變更文字顏色

若要變更 PDF 中文字的顏色,請使用與 刪除文字 相同的方法。您至少需要更改範例程式碼中的ReplaceColor方法。

圖片

Docotic.Pdf 提供編輯 PDF 影像所需的一切。以下是最常用操作的 C# 程式碼片段。

範例程式碼的圖像組 包含本節中範例的完整測試項目。

將圖像新增至 PDF

該庫可以匯入 GIF/TIFF/PNG/BMP/JPEG 格式的圖像。您也可以從System.Drawing.Image物件新增影像。

var canvas = pdf.Pages[0].Canvas;
var image = pdf.AddImage("image.jpg")
    ?? throw new ArgumentException("Cannot add image");

canvas.DrawImage(image, 10, 50);

您可以使用DrawImage方法的重載來指定旋轉角度和輸出大小。若要在多個頁面上繪製相同的影像,請新增一次影像,並在多次呼叫DrawImage方法時使用相同的PdfImage物件。

將圖像合併為 PDF

以下 C# 程式碼展示如何將多個影像合併到一個 PDF 中。

using var pdf = new PdfDocument();

var imagePaths = new string[] { "image.jpg", "another-image.png" };
foreach (var path in imagePaths)
{
    var image = pdf.AddImage(path)
        ?? throw new ArgumentException("Cannot add image");

    var page = pdf.AddPage();
    page.Width = image.Width;
    page.Height = image.Height;

    page.Canvas.DrawImage(image, 0, 0);
}

pdf.RemovePage(0);
pdf.Save("combined-images.pdf");

該程式碼將多個圖像添加到 PDF,更改每個頁面大小以匹配相應的圖像大小。在儲存結果之前,程式碼會刪除第一個隱式新增的空白頁。

提取 PDF 影像

我們設計 Docotic.Pdf 用於從 PDF 文件中提取圖像,而不影響圖像品質。該庫不會更改圖像大小或壓縮。您將獲得與 PDF 品質相同的圖像。

using var pdf = new PdfDocument("file-with-images.pdf");
int i = 0;
foreach (PdfImage image in pdf.GetImages())
{
    var path = image.Save($"image{i++}");
    Console.WriteLine($"Saved to {path}");
}

刪除和替換影像

使用PdfPage.RemovePaintedImages方法從 PDF 頁面中刪除所有或特定影像。您可以按位置、大小、變換或其他參數過濾影像。

using var pdf = new PdfDocument("file-with-images.pdf");
pdf.Pages[0].RemovePaintedImages(
    image =>
    {
        return image.Size.Width > 100;
    }
);

pdf.RemoveUnusedResources();
pdf.Save("no-wide-images.pdf");

上面的 C# 程式碼展示如何在 Docotic.Pdf 的幫助下刪除圖像。我建議您在更改或刪除圖像後刪除未使用的資源。

使用PdfImage.ReplaceWith方法取代 PDF 文件中所有出現的影像。

using var pdf = new PdfDocument("file-with-images.pdf");
var firstImage = pdf.GetImages(false).FirstOrDefault()
    ?? throw new ArgumentException("No images found");

firstImage.ReplaceWith("another-image.png");

pdf.RemoveUnusedResources();
pdf.Save("replaced-image.pdf");

改變壓縮方案

Docotic.Pdf 提供了更改 PDF 影像壓縮的方法。可以使用 JPEG、CCITT Group 3 和 4(傳真)、JPEG 2000 以及 zip/deflate 壓縮演算法重新打包影像。

根據初始壓縮和新壓縮,變更可能會導致細節遺失或影像品質下降。但有損轉換通常有助於減少文件大小

firstImage.RecompressWithJpeg2000(25);

還有其他方法可以重新打包影像。檢查名稱以RecompressWith開頭的PdfImage方法。您可以使用Uncompress方法從圖像中刪除任何壓縮。

調整影像大小

如果 PDF 文件中的某些圖像大於所需的大小,則庫可以為您調整或縮小它們。

firstImage.Scale(0.5, PdfImageCompression.Jpeg2000, 25);

上面的程式碼使第一個圖像在兩個方向上都縮小兩倍。該庫對生成的圖像使用 JPEG 2000 壓縮。

您可以使用ResizeTo方法之一來指定產生的寬度和高度的精確值。

調整影像大小通常比更改壓縮方式更能減少 PDF 檔案大小(請參閱上面的部分),但這是一個有損過程。

浮水印和背景

PDF 上的浮水印

PDF 浮水印涉及以下步驟:

  • 建立一個XObject,水印內容的容器
  • 以文字、圖像和向量圖形填滿對象
  • 以物件標記 PDF 頁面

以下是將 Confidential 浮水印新增至 PDF 的 C# 程式碼:

using var pdf = new PdfDocument("existing.pdf");

var watermark = pdf.CreateXObject();
watermark.DrawOnBackground = true;

var canvas = watermark.Canvas;
canvas.FontSize = 72;
canvas.Brush.Color = new PdfRgbColor(222, 35, 35);
canvas.Brush.Opacity = 45;
canvas.Pen.Color = canvas.Brush.Color;
canvas.Pen.Opacity = canvas.Brush.Opacity;
canvas.Pen.Width = 5;

var padding = 10;
var text = "CONFIDENTIAL";
canvas.DrawString(padding, padding, text);

var textSize = canvas.MeasureText(text);
var watermarkRect = new PdfRectangle(
    padding, padding, textSize.Width, textSize.Height);
canvas.DrawRoundedRectangle(watermarkRect, new PdfSize(padding, padding));

foreach (var page in pdf.Pages)
{
    page.Canvas.DrawXObject(
        watermark,
        (page.Width - watermarkRect.Width) / 2,
        (page.Height - watermarkRect.Height) / 2);
}

pdf.Save("watermarked.pdf");

此程式碼設定水印畫布的畫筆和筆屬性。畫筆用於繪製文字。為了找出文字大小,程式碼測量文字。然後它在文字周圍繪製一個帶有圓角的矩形。鋼筆用於描畫矩形。

水印內容準備好後,程式碼將其繪製在每個頁面的中央。

PDF 背景與浮水印非常相似。至少你可以用幾乎相同的方式創建它們。若要為 PDF 新增背景,請執行與上述程式碼相同的操作,但在 CreateXObject 呼叫之後新增 watermark.DrawOnBackground = true;。請注意,圖像等不透明內容可能會遮蔽背景。

註解

Docotic.Pdf 為 PDF 中的註釋提供了豐富的 API。您可以在 PDF 文件中建立、編輯和刪除註釋。也可以扁平化註釋

要註釋文本,有:

  • 便籤或文字註記。請參閱PdfPage類別的AddTextAnnotation方法。
  • 亮點。請參閱AddHighlightAnnotation方法。
  • 刪除線。請參閱AddStrikeoutAnnotation方法。
  • 底線。請參閱AddJaggedUnderlineAnnotationAddUnderlineAnnotation方法。

使用連結從一個頁面跳到另一個頁面或跳到外部資源。您可以使用墨跡註釋在 PDF 頁面上手繪圖。對於指定從文件中刪除的部分有修訂註釋。您也可以嵌入音訊、視訊或 3D 內容。

突出顯示文字

以下是如何突出顯示 PDF 文件中的文字:

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
var canvas = page.Canvas;
canvas.FontSize = 30;

var text = "Highlighted text.";
var position = new PdfPoint(10, 50);
canvas.DrawString(position, text);
canvas.DrawString(" Not highlighted.");

var size = canvas.MeasureText(text);
var bounds = new PdfRectangle(position, size);

var color = new PdfRgbColor(145, 209, 227);
var annotationText = "Please pay attention to this part.";
page.AddHighlightAnnotation(annotationText, bounds, color);

pdf.Save("highlighted.pdf");

若要連結到 PDF 中的特定頁面,請使用以下程式碼:

using var pdf = new PdfDocument();
var secondPage = pdf.AddPage();
secondPage.Canvas.DrawString(10, 50, "Welcome to the second page.");

var firstPage = pdf.Pages[0];
var canvas = firstPage.Canvas;
var linkRect = new PdfRectangle(10, 50, 100, 60);
canvas.DrawRectangle(linkRect, PdfDrawMode.Stroke);

var options = new PdfTextDrawingOptions(linkRect)
{
    HorizontalAlignment = PdfTextAlign.Center,
    VerticalAlignment = PdfVerticalAlign.Center
};
canvas.DrawText("Go to 2nd page", options);

firstPage.AddLinkToPage(linkRect, 1);

pdf.Save("linked.pdf");

在程式碼中,操作區域註解充當內部超連結。這些區域也可以導航到外部資源並執行非導航操作。

刪除註釋

若要從 PDF 中刪除註釋:

  1. 使用PdfPage.Widgets屬性或PdfDocument.GetWidgets方法存取小部件集合。
  2. 檢查類型、屬性或以其他方式決定不再需要哪些註釋。
  3. 使用PdfDocument.RemoveWidget方法或PdfWidgetCollection物件的方法刪除註解。

要從 PDF 中刪除附件,您需要刪除文件註釋和 共用附件

編輯 PDF

作為 PDF 修訂庫,Docotic.Pdf 提供了從 PDF 文件中永久刪除或快速刪除敏感資訊的方法。

塗黑 PDF 上的信息

編輯文字

以下是如何在不使用 Redact 工具的情況下僅使用 C# 和 Docotic.Pdf 來塗黑 PDF 中的文字。

int i = 0;
foreach (var page in pdf.Pages)
{
    foreach (var word in page.GetWords())
    {
        if (i % 3 == 0)
        {
            page.Canvas.AppendRectangle(word.Bounds);
            page.Canvas.FillPath(PdfFillMode.Winding);
        }

        i++;
    }
}

該程式碼在文件中的每個第三個單字上繪製一個黑色矩形。請注意,矩形後面的文字保留在文件中,稍後可以將其提取。若要永久刪除文本,請使用有關取代文本部分的方法。

編輯影像

您也可以使用黑色矩形來覆蓋影像。但更簡單的方法是將影像替換為 黑色 1 x 1 像素影像。這不僅會在視覺上突出顯示經過編輯的圖像,還會刪除原始圖像資料。

查看有關 刪除和替換圖像 的部分以取得程式碼範例。我還建議在替換後調用PdfDocument.ReplaceDuplicateObjects方法。

PDF 表格

Docotic.Pdf 可以使用各種互動元素(如按鈕、核取方塊、下拉清單、列錶框、單選按鈕和文字欄位)來建立 Acroform(這是 PDF 表單的另一個名稱)。

通常只需幾行程式碼即可新增和設定表單欄位。例如,您只需呼叫PdfPage.AddTextBox方法即可向 PDF 新增可編輯欄位。 表單和註釋組中的範例程式碼提供了有關建立和使用表單的更多資訊。

如何填寫 PDF 表格

使用PdfDocument.GetControl方法以完整或部分名稱尋找 PDF 控制項。另一種方法是使用GetControls方法來列舉文件控制項。無論哪種情況,您都需要將控制項轉換為預期的欄位類型。

using var pdf = new PdfDocument(@"example-form.pdf");

if (pdf.GetControl("txt-name") is PdfTextBox nameTextBox)
    nameTextBox.Text = "Bit Miracle team";

if (pdf.GetControl("txt-email") is PdfTextBox emailTextBox)
    emailTextBox.Text = "support@bitmiracle.com";

if (pdf.GetControl("check-agree") is PdfCheckBox agreeCheckBox)
    agreeCheckBox.Checked = true;

pdf.Save("filled-form.pdf");

程式碼使用此PDF 表單範例。在程式碼中,我為兩個文字欄位設定值並勾選複選框。

當您填寫完表格後,您可以展平其所有欄位

在表單中使用 JavaScript

您可以新增操作來控制事件。 PdfControl 類別提供對一組預定義事件的存取。事件的名稱以On開頭(例如OnMouseDown)。

以下是使用 JavaScript 處理 PDF 表單的範例:

using var pdf = new PdfDocument(@"example-form.pdf");
foreach (var field in pdf.GetControls())
    field.OnChange = pdf.CreateJavaScriptAction($"app.alert('{field.Name} changed!',3)");

pdf.Save("javascript-events.pdf");

表格資料格式

還有另一種電子填寫 PDF 的方法。使用庫的 FDF 到 PDF 功能從資料庫或其他來源自動填入 PDF 表單。

using var pdf = new PdfDocument(@"example-form.pdf");
pdf.ImportFdf("form-data.fdf");
pdf.Save("auto-populated.pdf");

我使用此 FDF 文件 一次填寫所有表單欄位。

拼合PDF

本節介紹如何拼合 PDF。

PDF 扁平化

當您拼合 PDF 時,您會將表單和註釋等互動式元素轉換為靜態內容,以防止進一步編輯。扁平化的 PDF 在看起來相同的情況下佔用的位元組數要少得多。

扁平化表單和註釋

若要拼合可填入的 PDF,請使用PdfDocument.FlattenControls方法。此方法在其父頁面上繪製所有表單欄位和其他控件,從文件中刪除來源控件。

當您拼合 PDF 表單時,拼合註解也很有意義。使用PdfDocument.FlattenWidgets方法同時展平控制項和註解。

如果您只想將某些控制項和/或註解轉換為其視覺表示形式,請使用PdfWidget.Flatten方法。您需要先找到所需的控制項 或註解。

展平文字

您可以藉助 Docotic.Pdf 將 PDF 文字轉換為輪廓。這樣做的通常原因是為了實現字體獨立性。無論是否安裝字體,拼合文字在任何裝置上看起來都是一樣的。

但是,將文字轉換為輪廓後,您將無法再將其作為文字進行編輯。此外,在展平過程中,該程式庫會將文字轉換為向量圖形。這會增加檔案大小。

要拼合 PDF 文本,您需要將文本提取為向量路徑並將其複製到新頁面或同一頁面上。為此有一個範例程式碼

儲存選項

在上面的程式碼片段中,我使用了PdfDocument.Save方法,沒有附加參數。在這種情況下,庫使用預設的儲存選項。我們精心挑選了預設值,以便在通常情況下它們可以完美運行。

儘管如此,在某些情況下您仍然需要覆蓋預設選項。為此,請建立一個PdfSaveOptions對象,設定選項,並將它們提供給其中一種儲存方法。此外,我將描述這些案例。

若要使用密碼或憑證保護 PDF,請建立加密處理程序並將其設定為EncryptionHandler屬性。

當您想要多次簽署同一個 PDF 時,請透過將WriteIncrementally屬性設為true來開啟增量更新模式。當您使用新註解或表單資料儲存先前簽署的檔案時,請執行相同的操作。

Linearize屬性設為true以產生線性化(或快速 Web 檢視最佳化)PDF 檔案。識別此優化的檢視器可以更快地顯示此類檔案。

為了防止在儲存時變更某些元資料欄位,請將UpdateProducerUpdateModifiedDate屬性設為false