Извлечь текст PDF

Формат файла PDF популярен, потому что содержимое файла не может быть легко изменено по сравнению с другими форматами файлов для обработки текстов. Однако вы можете извлекать текст из PDF-документов с помощью Aspose.PDF для .NET API. В этой статье давайте рассмотрим некоторые из многих возможностей поиска и извлечения текста из PDF-файлов с помощью C#. Ниже приведен список функций, которые мы будем обсуждать в этом блоге:

Извлечение текста из всего документа PDF с помощью C#

Чтение текстового содержимого из документа PDF является часто используемой функцией. Вы можете извлечь весь текст со всех страниц документа, выполнив следующие действия:

  1. Загрузить PDF-документ
  2. Создать объект TextAbsorber
  3. Принять поглотитель для всех страниц
  4. Запишите извлеченный текст в файл и сохраните его

Приведенный ниже фрагмент кода следует этим шагам и показывает, как извлечь текст из всего PDF-документа с помощью C#:

// Открыть PDF-документ
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Создайте объект TextAbsorber для извлечения текста
TextAbsorber textAbsorber = new TextAbsorber();
// Принять поглотитель для всех страниц
pdfDocument.Pages.Accept(textAbsorber);
// Получить извлеченный текст
string extractedText = textAbsorber.Text;
// Создайте писатель и откройте файл
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Записать строку текста в файл
tw.WriteLine(extractedText);
// Закрыть поток
tw.Close();

Поиск и извлечение текста с определенной страницы в PDF на С#

Изучив извлечение текста на уровне документа, давайте извлечем текст с определенной страницы документа PDF. Просто выполните следующие шаги для достижения ваших требований:

  1. Загрузить PDF-документ
  2. Создать объект TextAbsorber
  3. Принять поглотитель для конкретной страницы
  4. Запишите извлеченный текст в файл и сохраните его

Следующий фрагмент кода выполняет следующие действия для чтения текста с любой страницы PDF-файла с помощью C#:

// Открыть PDF-документ
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Доступ к необходимой странице в документе PDF
Page page = pdfDocument.Pages[1];
// Создайте объект TextAbsorber для извлечения текста
TextAbsorber textAbsorber = new TextAbsorber();
// Принять поглотитель для указанной страницы
page.Accept(textAbsorber);
// Получить извлеченный текст
string extractedText = textAbsorber.Text;
// Создайте писатель и откройте файл
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Записать строку текста в файл
tw.WriteLine(extractedText);
// Закрыть поток
tw.Close();

Поиск и извлечение текста из определенной области страницы PDF в С#

Давайте продвинемся в этом извлечении текста еще на один шаг вперед. Рассмотрите возможность поиска текста в определенной области страницы. Здесь важно понимать, что основной единицей измерения в Aspose.PDF для .NET является точка, где 72 точки равны 1 дюйму. Кроме того, левый нижний угол считается началом (0,0) страницы. Ниже приведены шаги для чтения текста из определенной области или раздела страницы в документе PDF:

  1. Загрузить исходный PDF-документ
  2. Создать объект TextAbsorber
  3. Установите TextSearchOptions и укажите прямоугольные координаты
  4. Принять поглотитель для конкретной страницы
  5. Записать извлеченный текст в файл

Фрагмент кода ниже демонстрирует эти шаги для извлечения текста из определенной области с помощью C#:

// Открыть документ
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Создайте объект TextAbsorber для извлечения текста
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Принять поглотитель для первой страницы
pdfDocument.Pages[1].Accept(absorber);
// Получить извлеченный текст
string extractedText = absorber.Text;
// Создайте писатель и откройте файл
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Записать строку текста в файл
tw.WriteLine(extractedText);
// Закрыть поток
tw.Close();

Поиск или извлечение определенного текста из файла PDF с помощью регулярных выражений с использованием С#

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

  • Загрузить входной PDF-документ
  • Создать объект TextAbsorber
  • Создайте и установите регулярное выражение для соответствия некоторому тексту
  • Перебрать каждый извлеченный текстовый фрагмент

В следующем фрагменте кода C# используется регулярное выражение, которое ищет текст, содержащий 4 цифры, например, 1999, 2000 и т. д. на всех страницах документа.

// открыть документ
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// создать объект TextAbsorber, чтобы найти все экземпляры входной поисковой фразы
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// принять абсорбер для всех страниц
pdfDocument.Pages.Accept(textFragmentAbsorber);
// получить извлеченные текстовые фрагменты
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// цикл по фрагментам
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

Извлечение текста из ячеек таблицы в документе PDF с использованием С#

Извлечение текста из таблиц на странице PDF немного отличается. Мы работали с классом TextAbsorber в предыдущих примерах, но извлечение текста из таблицы немного отличается. Поэтому вам необходимо выполнить следующие шаги, чтобы извлечь текст из объектов таблицы:

  1. Загрузить исходный PDF-файл
  2. Создайте объект класса TableAbsorber.
  3. Перебрать AbsorbedTable
  4. Перебрать каждую ячейку в каждой строке таблицы

Приведенный ниже фрагмент кода следует этим шагам и эффективно извлекает текст из ячеек таблицы в документе PDF с использованием C#:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Поиск и извлечение выделенного текста из документа PDF с использованием С#

Выделенный текст присутствует как аннотация в файлах PDF. Они содержат отмеченный текст, который отличает их от обычного текста в документе. Ниже описано, как читать выделенный текст с помощью C#:

  1. Загрузить исходный документ
  2. Перебрать все аннотации
  3. Фильтр Аннотация TextMarkup
  4. Получить выделенные фрагменты текста

Ниже приведен фрагмент кода, основанный на описанных выше шагах, его можно использовать для выделения текста из PDF-файлов:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Перебрать все аннотации
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // Фильтровать текстовые разметкиАннотации
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Получить выделенные фрагменты текста
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Показать выделенный текст
            Console.WriteLine(tf.Text);
        }
    }
}

Извлечение текста PDF с низким потреблением памяти с помощью C#

Ниже приведены два разных подхода к оптимизации потребления памяти при извлечении текста из PDF-документов с использованием языка C#.

i) Использование методов Reset() и FreeMemory()

Иногда извлечение текста может потреблять огромные ресурсы памяти и процессора. Возможно, когда входной файл огромен и содержит много текста. Потому что объект TextFragmentAbsorber сохраняет в памяти все найденные фрагменты текста.

Таким образом, решение, которое мы здесь рекомендуем, — вызывать метод поглотителя.Reset() после обработки каждой страницы. Более того, если вы выполняете только операции чтения, вы также можете освободить память, занимаемую объектами страницы, с помощью метода page.FreeMemory(). Поэтому вам нужно выполнить следующие шаги, чтобы использовать минимальные ресурсы:

  1. Загрузить исходный PDF-документ
  2. Укажите TextEditOptions
  3. Прочитать TextFragment
  4. Вызвать метод Reset().
  5. Вызвать метод FreeMemory().

Следующий фрагмент кода демонстрирует извлечение текста из PDF-документов с помощью C#:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Читать что-то из фрагментов
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Собрать();        
}

Мы протестировали этот фрагмент кода на огромном тестовом файле, содержащем 450 страниц, 24500 текстовых фрагментов и большое количество растровых и векторных изображений. Процесс потреблял всего 500 МБ памяти. Еще один совет здесь заключается в том, что вы можете поручить сборщику мусора .NET уменьшить максимальное потребление памяти примерно до 250 МБ с дополнительными затратами на 10 секунд времени обработки.

ii) Использование перечисления MemorySaving

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

  1. Загрузить исходный PDF-файл
  2. Создать объект TextDevice
  3. Установите TextExtractionOptions
  4. Извлечь текст и записать текст в файл

Ниже фрагмент кода демонстрирует подход к экономии памяти с использованием C#:

// Открыть документ
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// Строка для хранения извлеченного текста
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Создать текстовое устройство
        TextDevice textDevice = new TextDevice();

        // Установить параметры извлечения текста — установить режим извлечения текста (Raw или Pure).
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Преобразование определенной страницы и сохранение текста в поток
        textDevice.Process(pdfPage, textStream);
        // Преобразование определенной страницы и сохранение текста в поток
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Закрыть поток памяти
        textStream.Close();
        // Получить текст из потока памяти
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Сохраните извлеченный текст в текстовом файле
File.WriteAllText(dataDir, builder.ToString());

Вывод

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

Смотрите также