Вопрос:

Извлечение текста из PDF-файлов в C #

c# pdf text extract

50381 просмотра

6 ответа

769 Репутация автора

Проще говоря, мне нужно вырезать текст из нескольких PDF-файлов (на самом деле, довольно много), чтобы проанализировать содержимое, прежде чем поместить его в базу данных SQL.

Я нашел несколько довольно схематичных бесплатных библиотек C # такого рода работы (лучшая из которых использует iTextSharp), но есть множество ошибок форматирования, и некоторые символы зашифрованы, и во многих местах есть пробелы ('') ВЕЗДЕ - внутри слов, между каждой буквой, огромные блоки которых занимают несколько строк, все это кажется немного случайным.

Есть ли простой способ сделать это, что я полностью упускаю из виду (вполне вероятно!), Или это немного трудная задача, которая включает в себя надежное преобразование извлеченных байтовых значений в буквы?

Автор: Duncan Tait Источник Размещён: 22.01.2010 10:05

Ответы (6)


22 плюса

4457 Репутация автора

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

Механизм рендеринга PDF может выводить это как 2 отдельных вызова, как показано в этом псевдокоде:

moveto (x1, y); output ("T")
moveto (x2, y); output ("ap")

Это может быть сделано из-за того, что кернинг по умолчанию (межбуквенный интервал) между буквами T и a может быть неприемлемым для механизма рендеринга, или это может быть добавление или удаление некоторого микропространства между символами для получения полностью выровненной строки. В конечном итоге это приводит к тому, что фактические текстовые фрагменты, найденные в PDF, часто являются не полными словами, а частями их.

Автор: Tarydon Размещён: 22.01.2010 10:16

1 плюс

9067 Репутация автора

Вы можете попробовать библиотеку Docotic.Pdf (отказ от ответственности: я работаю на Bit Miracle) для извлечения текста из файлов PDF. Библиотека использует некоторую эвристику для извлечения красивого текста без лишних пробелов между буквами в словах.

Пожалуйста, посмотрите на пример, который показывает, как извлечь текст из PDF .

Автор: Bobrovsky Размещён: 22.05.2011 07:25

3 плюса

309 Репутация автора

Вы можете попробовать Toxy, структуру извлечения текста / данных в .NET. В Toxy 1.0 будет поддерживаться PDF. Для получения подробной информации, пожалуйста, посетите http://toxy.codeplex.com

Автор: Tony Qu Размещён: 14.01.2014 11:28

0 плюса

429 Репутация автора

Если вы ищете «бесплатную» альтернативу, посмотрите PDF Clown . Лично я использовал подход, основанный на iFilter, и, кажется, он работает нормально, если вам нужно будет легко поддерживать другие типы файлов. Пример кода здесь .

Автор: Jussi Palo Размещён: 23.02.2015 10:27

15 плюса

2991 Репутация автора

Посмотрите на Tika на DotNet, доступном через Nuget: https://www.nuget.org/packages/TikaOnDotnet.TextExtractor/

Это обертка вокруг очень хорошей Java-библиотеки Tika, использующей IKVM. Очень прост в использовании и обрабатывает самые разные типы файлов, кроме PDF, включая старые и новые офисные форматы. Он автоматически выберет парсер на основе расширения файла, так что это просто:

var text = new TextExtractor().Extract(file.FullName).Text;

Обновление: одно предупреждение с этим решением - то, что разработка на IKVM закончилась. Я не уверен, что это будет означать в долгосрочной перспективе. http://weblog.ikvm.net/2017/04/21/TheEndOfIKVMNET.aspx

Автор: David Hammond Размещён: 10.04.2015 01:21

2 плюса

2369 Репутация автора

Если вы обрабатываете PDF-файлы с целью импорта данных в базу данных, я предлагаю рассмотреть ByteScout PDF Extractor SDK . Некоторые полезные функции включены

  • обнаружение таблицы;
  • извлечение текста в формате CSV, XML или форматированного текста (с возможностью восстановления макета);
  • текстовый поиск с поддержкой регулярных выражений;
  • низкоуровневый API для доступа к текстовым объектам

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я связан с ByteScout

Автор: Eugene Размещён: 22.06.2015 09:44
Вопросы из категории :
32x32