在 C# 中搜索 PDF

PDF 文件中搜索特定文本是在文件管理系統、法律審查工具、發票處理器和其他企業應用程序中常見的任務。無論您是想定位關鍵字、提取特定值還是刪除敏感信息,自動化 PDF 搜索可以節省大量時間和精力。

在這篇部落格文章中,您將學習如何使用 C# 程式化地在 PDF 檔案中搜尋文字。我們將逐步帶您了解主要功能,並提供實際的 C# 程式碼範例。

這篇文章涵蓋以下主題:

C# 函式庫以搜尋 PDF 文件

Aspose.PDF for .NET 簡化了使用 C# 在 PDF 文件中搜尋文本的過程。它允許您找到精確的單詞、使用正則表達式匹配模式,甚至高亮或替換匹配的文本—這一切僅需幾行代碼。這個強大的庫提供了操作 PDF 文檔的強大功能。它允許開發者輕鬆實現搜尋功能。使用 Aspose.PDF,您可以快速地在 PDF 中找到單詞,這使其成為軟件開發者的寶貴工具。

在開始進行 PDF 文字搜尋之前,您需要設置開發環境。請按照以下步驟開始使用 Aspose.PDF for .NET:

1. 安裝 Aspose.PDF for .NET。

releases 下載它,或通過 NuGet 安裝它。在 Visual Studio 中打開您的 .NET 項目,並在 NuGet 套件管理器控制台中運行以下命令:

PM> Install-Package Aspose.PDF

這個命令將 Aspose.PDF 庫添加到您的項目中,以便您可以訪問其強大的 PDF 處理功能。

2. 匯入所需的命名空間

在您的 C# 檔案的頂部,添加這些 using 指令:

using Aspose.Pdf;
using Aspose.Pdf.Text;

現在您準備好使用 Aspose.PDF 的 API 在您的 PDF 文件中搜索文本了。

在 C# 中搜索 PDF 文本

使用 Aspose.PDF for .NET,您可以輕鬆地在 PDF 中搜尋特定的單詞或短語,定位它們的所有實例,並採取行動,例如突出顯示它們或提取它們的詳細資訊。

按照以下步驟執行基本文本搜索:

  1. 使用 Document 類別加載目標 PDF 文件。
  2. 建立一個 TextFragmentAbsorber 來定義搜尋關鍵字。
  3. 運行吸收器遍歷所有頁面,使用 Accept() 方法。
  4. Retrieve all matching text fragments.
  5. 打印找到的比賽數量。
  6. 循環顯示每個匹配項及其頁碼。

以下代碼範例實現了這些步驟。

// 加載 PDF 文件
Document pdfDocument = new Document("sample.pdf");

// 創建一個文本吸收器,使用搜索關鍵詞
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("invoice");

// 將吸收器應用於所有頁面
pdfDocument.Pages.Accept(textFragmentAbsorber);

// 獲取匹配的文本片段
TextFragmentCollection textFragments = textFragmentAbsorber.TextFragments;

// Print how many times the keyword was found
Console.WriteLine($"Found {textFragments.Count} instance(s) of the keyword.");

// 循環遍歷並打印每個找到的文本
foreach (TextFragment fragment in textFragments)
{
    Console.WriteLine($"Text: {fragment.Text} | Page: {fragment.Page.Number}");
}

Output Example

Found 3 instance(s) of the keyword.
Text: invoice | Page: 1
Text: invoice | Page: 2
Text: invoice | Page: 3

這個範例展示了一個簡單的關鍵字搜尋,可以在 PDF 的所有頁面中運作。您將看到匹配的文字及其頁碼。

理解 PDF 搜索中使用的主要類別

為了更好地理解代碼中發生了什麼,這裡是涉及的主要類別和方法的快速概述:

  • Document: 代表整個PDF文件。它提供對頁面、內容和結構的訪問。
  • TextFragmentAbsorber:在 PDF 中找到給定字符串或模式的所有出現。您還可以啟用區分大小寫或基於正則表達式的搜索等功能。
  • Accept(): 將吸收器應用於每一頁。它掃描文檔並收集匹配的片段。
  • TextFragments: 吸收器返回的所有匹配文本片段的集合。
  • TextFragment: 每個單獨的匹配,包括內容、位置和頁碼等詳細信息。

在 C# 中進行不區分大小寫的完整單字搜索

當你搜尋 PDF 內容時,你需要控制系統如何找到符合的結果,以確保結果準確。有時候,你想要忽略字母大小寫("Invoice" 與 "invoice"),或者你想要僅匹配完整單字—而不是其他單字中的部分匹配。

Aspose.PDF for .NET 提供了讓您同時做到這兩點的工具。

不區分大小寫的搜索

根據預設,搜尋是區分大小寫的。要忽略字母大小寫,請使用 TextSearchOptions 並啟用 IgnoreCase

// 載入 PDF 文件
Document pdfDocument = new Document("sample.pdf");

// 創建一個大小寫不敏感的文本吸收器,使用正則表達式
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("(?i)INVOICE");

// 設置文本搜索選項以啟用正規表達式使用
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;

// 將吸收器應用於所有頁面
pdfDocument.Pages.Accept(textFragmentAbsorber);

// 檢索匹配的文本片段
TextFragmentCollection textFragments = textFragmentAbsorber.TextFragments;

// Output the number of matches found
Console.WriteLine($"Found {textFragments.Count} instance(s) of the keyword.");

// 循環遍歷並顯示每個找到的文本片段
foreach (TextFragment fragment in textFragments)
{
    Console.WriteLine($"Text: {fragment.Text} | Page: {fragment.Page.Number}");
}

這將找到 "Invoice"、"invoice"、"INVOICE" 以及其他變體。

僅匹配整個詞

你也可以防止部分匹配。例如,搜尋 car 不應該匹配 carescar

// 載入 PDF 檔案
Document pdfDocument = new Document("sample.pdf");

// 創建一個使用正則表達式模式的文本吸收器,以實現整個單字匹配。
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\bcar\b");

// 設置文本搜索選項以啟用正則表達式使用
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;

// 將吸收器應用於所有頁面
pdfDocument.Pages.Accept(textFragmentAbsorber);

// 檢索匹配的文本片段
TextFragmentCollection textFragments = textFragmentAbsorber.TextFragments;

// Output the number of matches found
Console.WriteLine($"Found {textFragments.Count} instance(s) of the keyword.");

// 循環並顯示每個找到的文本片段
foreach (TextFragment fragment in textFragments)
{
    Console.WriteLine($"Text: {fragment.Text} | Page: {fragment.Page.Number}");
}

這確保只有獨立實例的單詞 `car” 被匹配。

在 PDF 中使用正則表達式進行搜尋

在某些情況下,您需要找到的不僅僅是一個特定的單字—您想匹配像日期、電子郵件地址或參考號碼這樣的模式。這就是正則表達式(regex)派上用場的地方。

Aspose.PDF for .NET 允許您使用正則表達式在 PDF 文檔的任何部分進行高級文本搜索。

範例:在 PDF 中查找所有日期

讓我們假設你想要找到所有格式為 dd/mm/yyyy 的日期:

// 載入 PDF 並搜尋文本
Document pdfDocument = new Document("sample.pdf");

// 啟用正則表達式於搜尋選項
TextSearchOptions searchOptions = new TextSearchOptions(true)
{
    IsRegularExpressionUsed = true
};

// 創建吸收器,日期格式
TextFragmentAbsorber absorber = new TextFragmentAbsorber(@"\d{2}/\d{2}/\d{4}", searchOptions);

// 將吸收劑應用於頁面
pdfDocument.Pages.Accept(absorber);

// 迴圈並列印找到的模式
foreach (TextFragment fragment in absorber.TextFragments)
{
    Console.WriteLine($"Found date: {fragment.Text} on Page {fragment.Page.Number}");
}

其他有用的模式:

  • Emails: \b[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b
  • Phone Numbers: \d{3}[-.\s]??\d{3}[-.\s]??\d{4}
  • 發票號碼: INV-\d+

正則表達式擴展了您的搜尋能力,遠遠超出了靜態文本,幫助您從非結構化文件中提取結構化數據。

搜尋並提取文本及其位置信息

有時候,僅僅找到文本是不夠的—您可能需要知道它在 PDF 中確切出現的位置。Aspose.PDF 讓您提取每個匹配項的頁碼、坐標和格式詳細信息。

此功能對於建立索引、標記文件或創建可點擊的鏈接特別有用。

範例:獲取每個匹配的位置

// 載入 PDF 並搜索文本
Document pdfDocument = new Document("sample.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber("invoice");
pdfDocument.Pages.Accept(absorber);

// 獲取匹配的片段
TextFragmentCollection fragments = absorber.TextFragments;

// 列印每個匹配的位置信息和文本
foreach (TextFragment fragment in fragments)
{
    Console.WriteLine($"Text: {fragment.Text}");
    Console.WriteLine($"Page: {fragment.Page.Number}");
    Console.WriteLine($"Position - X: {fragment.Position.XIndent}, Y: {fragment.Position.YIndent}");
    Console.WriteLine($"Font: {fragment.TextState.Font.FontName}, Size: {fragment.TextState.FontSize}");
    Console.WriteLine("------------");
}

Sample Output

Text: invoice
Page: 1
Position - X: 33.482, Y: 708.246
Font: Helvetica, Size: 12
------------
Text: invoice
Page: 2
Position - X: 33.482, Y: 708.246
Font: Helvetica, Size: 12
------------
Text: invoice
Page: 3
Position - X: 33.482, Y: 708.246
Font: Helvetica, Size: 12
------------

您現在確切知道「發票」這個詞出現的位置,以及它的樣式。這種細節層級為高級處理開啟了大門,例如註解、工具提示或動態高亮顯示。

突出顯示或替換找到的文本

一旦你在 PDF 中找到了特定文本,你可以更进一步,通过高亮显示它甚至用新内容替换它。Aspose.PDF for .NET 让你可以轻松地使用 TextFragment 对象来样式化或修改匹配的文本。

在 PDF 中搜尋和標記文字

您可以通過改變文本的背景和字體顏色來直觀地突出顯示文本。

TextFragmentAbsorber absorber = new TextFragmentAbsorber("invoice");
pdfDocument.Pages.Accept(absorber);

foreach (TextFragment fragment in absorber.TextFragments)
{
    // Highlight by changing text appearance
    fragment.TextState.BackgroundColor = Color.Yellow;
    fragment.TextState.ForegroundColor = Color.Red;
    fragment.TextState.FontStyle = FontStyles.Bold;
}

這對於審查、標記或生成註解報告非常有用。

找到和替換文本

需要在文件中編輯或更新文本嗎?只需直接替換即可:

foreach (TextFragment fragment in absorber.TextFragments)
{
    fragment.Text = "REDACTED";
}

您甚至可以在替換時應用新的格式設定:

fragment.TextState.FontSize = 12;
fragment.TextState.Font = FontRepository.FindFont("Arial");
fragment.TextState.ForegroundColor = Color.Black;

以程式化的方式突出顯示和替換文本使您能夠自動化許多文檔處理任務,例如清理模板、更新過時內容或審查私人數據。

在所有頁面或特定頁面上搜尋

默認情況下,Aspose.PDF 會在 PDF 的所有頁面中進行搜尋。但有時,您可能希望將搜尋限制在特定頁面或頁面範圍內—特別是在處理大文件或當內容是可預測的時候。

Aspose.PDF 讓這兩件事變得簡單。

在所有頁面上搜尋(預設)

如果您不指定頁面,吸收器會自動搜索每一頁。

TextFragmentAbsorber absorber = new TextFragmentAbsorber("invoice");
pdfDocument.Pages.Accept(absorber); // Searches all pages

在特定頁面搜索

您也可以通過直接針對某個單一頁面進行搜索:

TextFragmentAbsorber absorber = new TextFragmentAbsorber("invoice");

// Search only on page 2
pdfDocument.Pages[2].Accept(absorber);

在多個頁面上搜尋

要搜尋自訂範圍(例如,第 2 頁到第 4 頁),只需遍歷該範圍:

TextFragmentAbsorber absorber = new TextFragmentAbsorber("invoice");

// Loop through selected pages
for (int i = 2; i <= 4; i++)
{
    pdfDocument.Pages[i].Accept(absorber);
}

這種方法讓你對性能和精確度擁有完全的控制,特別是在掃描或分割文件的情況下非常有用。

進階用例:搜尋及編輯敏感資訊

在法律、HR 或財務文件中,隱藏敏感內容(如姓名、身份證號碼或帳號)在分享之前是很常見的。Aspose.PDF for .NET 透過將搜索與遮蔽功能結合,使這一過程變得簡單。

您可以搜索術語,然後使用 RedactionAnnotation 應用黑色覆蓋層。

// 載入 PDF 並搜尋文字
Document pdfDocument = new Document("sample.pdf");

// 搜尋名稱 \"John Doe\"
TextFragmentAbsorber absorber = new TextFragmentAbsorber("John Doe");
pdfDocument.Pages.Accept(absorber);

// 循環遍歷找到的片段並刪除
foreach (TextFragment fragment in absorber.TextFragments)
{
    // 獲取位置和尺寸
    Aspose.Pdf.Rectangle rect = new Aspose.Pdf.Rectangle(
        fragment.Position.XIndent,
        fragment.Position.YIndent,
        fragment.Position.XIndent + fragment.Rectangle.Width,
        fragment.Position.YIndent + fragment.Rectangle.Height
    );

    // 創建一個刪除註解
    RedactionAnnotation redaction = new RedactionAnnotation(fragment.Page, rect)
    {
        FillColor = Color.Black,
        Color = Color.Black
    };

    // 添加並應用刪除處理
    fragment.Page.Annotations.Add(redaction);
    redaction.Redact();
}
// 保存修改過的文件
pdfDocument.Save("SearchAndRedact.pdf");

發生了什麼

  • 目標文本("John Doe")被找到並用黑色方框遮住。
  • 這不僅是視覺上的——它從 PDF 層中移除內容,使其無法從檔案中恢復。

獲取免費許可證

現在你已經學會了如何使用 Aspose.PDF for .NET 在 PDF 中搜索、提取、突出顯示和編輯文本,是時候將這些知識付諸實踐了。

嘗試一下:下載免費的臨時許可證,開始建立您自己的智慧 PDF 工具。

在 PDF 中搜尋:免費資源

想要超越僅僅在 PDF 中搜尋文字嗎?探索 Aspose.PDF for .NET 的全部功能,透過這些免費、對開發者友好的資源:

這些資源是免費的,旨在幫助您充分利用您的 PDF 開發之旅。

結論

在 PDF 文件中搜索文本是許多基於文檔的應用程序中的一個重要功能——無論您是在提取數據、審核內容還是准備文件以進行刪減。使用 Aspose.PDF for .NET,您可以輕鬆地進行關鍵字搜索、使用正則表達式、突出顯示結果,甚至精確控制地刪減敏感信息。Aspose.PDF 提供了一個開發者友好的 API,簡化了複雜的 PDF 操作——節省您的時間,同時實現強大的自動化。

如果您有任何問題或需要進一步的協助,請隨時透過我們的 free support forum 與我們聯繫。

見也