Comment puis-je effectuer une recherche en texte intégral dans les fichiers PDF de Perl?

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

  •  02-07-2019
  •  | 
  •  

Question

J'ai plusieurs fichiers PDF et mon programme Perl doit effectuer une recherche en texte intégral pour déterminer ceux qui contiennent une chaîne spécifique. À ce jour, j'utilise ceci:

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

où $ string est le texte à rechercher. Cependant, cela échoue pour la plupart des pdf car le format de fichier n’est évidemment pas ASCII.

Que puis-je faire de plus facile?

Clarification: Il y a environ 300 pdf dont je ne connais pas le nom à l'avance. PDF :: Le noyau est probablement excessif. J'essaie de faire en sorte que pdftotext et grep se jouent bien, étant donné que je ne connais pas les noms des fichiers PDF, je ne trouve pas encore la bonne syntaxe.

Solution finale utilisant la suggestion d'Adam Bellaire ci-dessous:

@search_results = `for i in \$( ls ); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`;
Était-ce utile?

La solution

Le fil de discussion PerlMonks ici parle de ce problème.

Il semble que, dans votre cas, il serait peut-être plus simple d’obtenir pdftotext (l’outil en ligne de commande), vous pouvez alors faire quelque chose comme:

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

Autres conseils

Je deuxième solution Adam Bellaire. J'ai utilisé l'utilitaire pdftotext pour créer l'index de texte intégral de ma bibliothèque de livres électroniques. C'est un peu lent mais fait son travail. Pour le texte intégral, essayez PLucene ou KinoSearch pour stocker l’index de texte intégral.

Ma bibliothèque, CAM :: PDF , prend en charge l'extraction de texte, mais c'est un problème intrinsèquement difficile étant donné l'orientation graphique de la syntaxe PDF. Ainsi, la sortie est parfois du charabia. CAM :: PDF regroupe un programme getpdftext.pl , ou vous pouvez appeler la fonctionnalité comme suit:

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

Vous pouvez consulter PDF :: Core .

Le plus simple index / recherche de texte intégral que j'ai utilisé est mysql. Vous insérez simplement dans la table avec l'index approprié dessus. Vous devez passer un peu de temps à déterminer les pondérations relatives des champs (une correspondance dans le titre peut donner une note plus élevée qu’une correspondance dans le corps), mais cela est possible, même avec certains sql poilu.

Plucene est obsolète (il n’a pas travaillé autant au cours des deux dernières années) en faveur de KinoSearch. KinoSearch est en partie né de la compréhension des limites architecturales de Plucene.

Si vous avez environ 300 fichiers PDF, une fois que vous avez extrait le texte du fichier PDF (en supposant que le fichier PDF contienne du texte et pas uniquement des images de texte;), il peut être suffisant, en fonction des volumes de votre requête, de trouver Grep.

Cependant, je suggérerais fortement la route mysql / kinosearch, car ils ont couvert de nombreux domaines (mots-clés, mots vides, pondération de termes, analyse de jetons) avec lesquels il n'est pas avantageux de s'embourber.

KinoSearch est probablement plus rapide que la route mysql, mais la route mysql vous offre une expérience plus répandue des logiciels / outils / développeurs standard. Et vous avez la possibilité d'utiliser la puissance de SQL pour améliorer vos requêtes de recherche en texte libre.

Donc, à moins que vous ne parliez d'énormes ensembles de données et de volumes de requêtes insensés, mon argent serait sur mysql.

Vous pouvez essayer Lucene (le port Perl s'appelle Plucene). Les recherches sont incroyablement rapides et je sais que PDFBox sait déjà comment indexer des fichiers PDF avec Lucene. PDFBox, c'est Java, mais il y a des chances qu'il y ait quelque chose de très similaire quelque part dans CPAN. Même si vous ne trouvez pas quelque chose qui ajoute déjà des fichiers PDF à un index Lucene, il ne devrait pas y avoir plus que quelques lignes de code pour le faire vous-même. Lucene vous proposera beaucoup plus d'options de recherche que la simple recherche d'une chaîne dans un fichier.

Il y a aussi un moyen très rapide et sale. Le texte d'un fichier PDF est actuellement stocké sous forme de texte brut. Si vous ouvrez un fichier PDF dans un éditeur de texte ou utilisez des "chaînes", vous pouvez voir le texte qu'il contient. La corbeille binaire est généralement des polices, des images, etc. incorporées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top