Поиск в PDF с использованием C#

Поиск конкретного текста в PDF документах является распространенной задачей в системах управления документами, инструментах юридического обзора, обработчиках счетов и других корпоративных приложениях. Независимо от того, пытаетесь ли вы найти ключевое слово, извлечь определенные значения или скрыть конфиденциальную информацию, автоматизация поиска в PDF может сэкономить много времени и усилий.

В этом блоге вы узнаете, как программно искать текст в PDF-файлах с помощью C#. Мы проведем вас через ключевые функции шаг за шагом с практическими примерами кода на C#.

Эта статья охватывает следующие темы:

C# Библиотека для Поиска в PDF Документах

Aspose.PDF for .NET упрощает процесс поиска текста в PDF-файлах с использованием C#. Он позволяет находить точные слова, сопоставлять шаблоны с использованием регулярных выражений и даже выделять или заменять найденный текст — всё это всего за несколько строк кода. Эта мощная библиотека предоставляет надежные функции для манипуляции PDF-документами. Она позволяет разработчикам легко реализовывать функции поиска. С Aspose.PDF вы можете быстро находить слова в PDF, что делает его незаменимым инструментом для разработчиков программного обеспечения.

Прежде чем погрузиться в поиск текста в PDF, вам нужно настроить свою среду разработки. Следуйте этим шагам, чтобы начать работу с Aspose.PDF for .NET:

1. Установите Aspose.PDF for .NET.

Скачайте его с releases или установите через NuGet.Откройте свой .NET проект в Visual Studio и выполните следующую команду в консоли диспетчера пакетов NuGet:

PM> Install-Package Aspose.PDF

Эта команда добавляет библиотеку Aspose.PDF в ваш проект, чтобы вы могли получить доступ к её мощным функциям обработки PDF.

2. Импортируйте необходимые пространства имен

В начале вашего C# файла добавьте эти директивы using:

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

Теперь вы готовы начать поиск текста в ваших PDF-файлах, используя API Aspose.PDF.

Поиск текста в PDF с использованием C#

С помощью Aspose.PDF for .NET вы можете легко искать определенные слова или фразы в PDF, находить все их экземпляры и выполнять такие действия, как их выделение или извлечение их деталей.

Следуйте этим шагам, чтобы выполнить базовый текстовый поиск:

  1. Загрузите целевой PDF-файл с помощью класса Document.
  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 не должен совпадать с care или scar.

// Загрузить 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
------------

Теперь вы точно знаете, где появляется слово “счет”, а также как оно оформлено. Этот уровень детализации открывает двери для продвинутой обработки, такой как аннотации, подсказки или динамическое выделение.

Выделение или Замена Найденного Текста

Как только вы нашли конкретный текст в 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);
}

Этот подход дает вам полный контроль над производительностью и точностью, что особенно полезно для отсканированных или секционированных документов.

Расширенный случай использования: Поиск и редактирование конфиденциальной информации

В юридических, кадровых или финансовых документах часто скрывают конфиденциальный контент — например, имена, идентификаторы или номера счетов — перед передачей. 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, делая его невосстанавливаемым из файла.

Получите бесплатную лицензию

Теперь, когда вы узнали, как искать, извлекать, выделять и редактировать текст в PDF-файлах с помощью Aspose.PDF for .NET, пришло время применить эти знания на практике.

Попробуйте сами: скачайте бесплатную временную лицензию и начните создавать собственные умные PDF-инструменты.

Поиск в PDF: Бесплатные ресурсы

Хотите выйти за рамки простого поиска текста в PDF-файлах? Исследуйте все возможности Aspose.PDF for .NET с этими бесплатными, удобными для разработчиков ресурсами:

  • Руководство для разработчиков Узнайте, как создавать, изменять, конвертировать и защищать файлы PDF программным образом. Aspose.PDF for .NET Documentation

  • Бесплатные онлайн инструменты Конвертируйте, объединяйте, разделяйте и редактируйте PDF файлы прямо в вашем браузере. Aspose Free PDF Tools

  • API Справочник Узнайте больше о классах, свойствах и методах, доступных в Aspose.PDF for .NET, чтобы ускорить вашу разработку. Aspose.PDF API Reference

  • Форум поддержки Задавайте вопросы, сообщайте о проблемах и получайте ответы непосредственно от экспертов Aspose. Aspose Support Forum

Эти ресурсы бесплатны и доступны, чтобы помочь вам извлечь максимальную пользу из вашего пути разработки PDF.

Заключение

Поиск текста в PDF-файлах является важной функцией для многих приложений, основанных на документах — будь то извлечение данных, аудит контента или подготовка файлов к редактированию. С помощью Aspose.PDF for .NET вы можете легко выполнять поиск по ключевым словам, использовать регулярные выражения, выделять результаты и даже точно и контролируемо редактировать конфиденциальную информацию. Aspose.PDF предлагает удобный для разработчиков API, который упрощает сложные операции с PDF — экономя ваше время и позволяя использовать мощную автоматизацию.

Если у вас есть какие-либо вопросы или вам нужна дополнительная помощь, пожалуйста, не стесняйтесь обращаться на наш free support forum.

См. также