Как я могу выполнить полнотекстовый поиск PDF-файлов из Perl?

StackOverflow https://stackoverflow.com/questions/139015

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

где $string — это текст, который нужно искать.Однако для большинства 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`;
Это было полезно?

Решение

Тема PerlMonks здесь рассказывает об этой проблеме.

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

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

Другие советы

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

Моя библиотека, КАМ::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;
}

Возможно, вы захотите посмотреть PDF::Ядро.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top