2008-09-26 6 views
8

У меня есть куча PDF-файлов, и моей программе Perl необходимо выполнить полнотекстовый поиск, чтобы они возвращали те, которые содержат определенную строку. На сегодняшний день я использую это:Как я могу выполнить полнотекстовый поиск файлов PDF с Perl?

my @search_results = `grep -i -l \"$string\" *.pdf`; 

где $ строка текста для поиска. Однако это не подходит для большинства PDF-файлов, потому что формат файла, очевидно, не ASCII.

Что я могу сделать, это проще всего?

Уточнение: Существует около 300 pdf-файлов, чье имя я не знаю заранее. PDF :: Core, вероятно, перебор. Я пытаюсь получить pdftotext и grep, чтобы играть хорошо друг с другом, учитывая, что я не знаю имена файлов pdf, я пока не могу найти правильный синтаксис.

Окончательное решения с использованием предложений Адама Беллэйром в ниже:

@search_results = `for i in \$(ls); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`; 
+0

Возможно, вы захотите переименовать вопрос в «Полнотекстовый поиск в формате PDF с Perl» – 2008-09-28 10:54:05

ответ

9

PerlMonks нить here говорит об этой проблеме.

кажется, что в вашей ситуации, это может быть проще получить pdftotext (инструмент командной строки), то вы можете сделать что-то вроде:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`; 
2

I второй Адам Беллэйр решение. Я использовал утилиту pdftotext для создания полнотекстового индекса моей библиотеки электронных книг. Это несколько медленно, но делает свою работу. Что касается полного текста, попробуйте PLucene или KinoSearch для хранения полнотекстового индекса.

1

Самый простой полный текст/текст, который я использовал, - это mysql. Вы просто вставляете в таблицу соответствующий индекс. Вам нужно потратить некоторое время на разработку относительных весов для полей (совпадение в названии может набрать больше, чем совпадение в теле), но это все возможно, хотя и с некоторым волосатым sql.

Plucene устарел (за последние два года не было активной работы afaik) в пользу KinoSearch. KinoSearch частично вырос, не понимая архитектурных ограничений Plucene.

Если у вас есть ~ 300 pdf-файлов, то после того, как вы извлекли текст из PDF (при условии, что в PDF есть текст, а не только изображения текста;), и в зависимости от ваших томов запросов вы можете найти grep.

Тем не менее, я настоятельно рекомендую маршрут mysql/kinosearch, поскольку они покрыли много земли (стеблирование, стоп-слова, взвешивание термина, разбор маркера), которые вам не принесли.

KinoSearch, вероятно, быстрее, чем маршрут mysql, но маршрут mysql дает вам более широко используемое стандартное программное обеспечение/инструменты/опыт разработчика. И вы получаете возможность использовать мощь sql для поиска ваших запросов на freetext.

Так что, если вы не говорите ОГРОМНЫЕ наборы данных и безумные объемы запросов, мои деньги будут на mysql.

2

Моя библиотека, CAM::PDF, имеет поддержку для извлечения текста, но это неотложная проблема, учитывая графическую ориентацию синтаксиса PDF. Таким образом, выход иногда является тарабарщиной.CAM :: PDF связывает программу getpdftext.pl, или вы можете вызвать функции следующим образом:

my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n"; 
for my $pagenum (1 .. $doc->numPages()) { 
    my $text = $doc->getPageText($pagenum); 
    print $text; 
} 
0

Вы можете попробовать Lucene (порт Perl называется Plucene). Поиски невероятно быстры, и я знаю, что PDFBox уже знает, как индексировать PDF-файлы с Lucene. PDFBox - это Java, но, скорее всего, есть что-то очень похожее в CPAN. Даже если вы не можете найти то, что уже добавляет файлы PDF в индекс Lucene, это не должно быть больше нескольких строк кода, чтобы сделать это самостоятельно. Lucene предоставит вам еще несколько вариантов поиска, чем просто поиск строки в файле.

Существует также очень быстрый и грязный способ. Текст в PDF-файле фактически сохраняется как обычный текст. Если вы открываете PDF-файл в текстовом редакторе или используете «строки», вы можете видеть текст там. Бинарный мусор обычно является встроенным шрифтом, изображениями и т. Д.

Смежные вопросы