在 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. 检索所有匹配的文本片段。
  5. 打印找到的匹配数量。
  6. 遍历并显示每个匹配及其页码。

以下代码示例实现了这些步骤。

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

// 创建一个文本吸收器,使用搜索关键字
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("invoice");

// 将吸收器应用于所有页面
pdfDocument.Pages.Accept(textFragmentAbsorber);

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

// 打印关键字被找到的次数
Console.WriteLine($"Found {textFragments.Count} instance(s) of the keyword.");

// 遍历并打印每个找到的文本
foreach (TextFragment fragment in textFragments)
{
    Console.WriteLine($"Text: {fragment.Text} | Page: {fragment.Page.Number}");
}

输出示例

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

这个示例演示了一个简单的关键字搜索,它可以跨所有页面在 PDF 中工作。您将看到匹配的文本及其页码。

理解PDF搜索中使用的关键类

为了更好地理解代码中发生的事情,以下是涉及的关键类和方法的快速分解:

  • 文档:表示整个 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;

// 输出找到的比赛数量
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;

// 输出找到的匹配数量
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
------------

您现在确切知道`invoice”一词出现的位置以及它的样式。这种细节级别为高级处理打开了大门,例如注释、工具提示或动态高亮。

突出显示或替换找到的文本

一旦您在 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 操作——节省您的时间,同时实现强大的自动化。

如果您有任何问题或需要进一步的帮助,请随时通过我们的 免费支持论坛 联系我们。

见也