2008-09-26 10 views
8

Tengo un montón de archivos PDF y mi programa Perl necesita hacer una búsqueda de texto completo de ellos para devolver los que contienen una cadena específica. Hasta la fecha he estado usando este:¿Cómo puedo hacer una búsqueda de texto completo de archivos PDF desde Perl?

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

donde $ cadena es el texto a buscar. Sin embargo, esto falla para la mayoría de los pdf porque el formato de archivo obviamente no es ASCII.

¿Qué puedo hacer es más fácil?

aclaración: Hay aproximadamente 300 pdf cuyo nombre no sé de antemano. PDF :: Core es probablemente excesivo. Estoy intentando que pdftotext y grep se jueguen bien, dado que no conozco los nombres de los pdf, todavía no puedo encontrar la sintaxis correcta.

solución final mediante la sugerencia de Adam Bellaire a continuación:

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

es posible que desee cambiar el nombre de la pregunta a "búsqueda de texto completo PDF desde Perl" –

Respuesta

9

El PerlMonks hilo here habla de este problema.

Parece que para su situación, podría ser más sencilla de obtener pdftotext (la herramienta de línea de comandos), entonces usted puede hacer algo como: Me segunda solución

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

Adam Bellaire. Utilicé la utilidad pdftotext para crear un índice de texto completo de mi biblioteca de libros electrónicos. Es algo lento pero hace su trabajo. En cuanto al texto completo, prueba PLucene o KinoSearch para almacenar el índice de texto completo.

1

El índice/búsqueda de texto completo más fácil que he usado es mysql. Simplemente inserta en la tabla con el índice apropiado. Necesitas dedicar algo de tiempo a calcular las ponderaciones relativas de los campos (una coincidencia en el título podría tener una puntuación más alta que una coincidencia en el cuerpo), pero todo esto es posible, aunque con algunos sql peludos.

Plucene está en desuso (no ha habido ningún trabajo activo en él en los últimos dos años afaik) a favor de KinoSearch. KinoSearch creció, en parte, sin entender las limitaciones arquitectónicas de Plucene.

Si tiene ~ 300 pdfs, una vez que haya extraído el texto del PDF (suponiendo que el PDF tenga texto y no solo imágenes de texto) y según los volúmenes de su consulta, puede encontrar que grep es suficiente.

Sin embargo, recomiendo encarecidamente la ruta mysql/kinosearch, ya que han cubierto una gran cantidad de terreno (stemming, palabras vacías, ponderación de términos, análisis de tokens) que no se benefician al empantanarse.

KinoSearch es probablemente más rápido que la ruta mysql, pero la ruta mysql le proporciona software/herramientas/experiencia de desarrollador más ampliamente utilizados. Y obtiene la capacidad de utilizar el poder de sql para mejorar sus consultas de búsqueda de texto libre.

Así que, a menos que esté hablando de GRANDES conjuntos de datos y volúmenes de consultas locos, mi dinero estaría en mysql.

2

Mi biblioteca, CAM::PDF, tiene soporte para extraer texto, pero es un problema inherentemente difícil dada la orientación gráfica de la sintaxis de PDF. Entonces, el resultado a veces es un galimatías.CAM :: PDF lía un programa getpdftext.pl, o se puede invocar la funcionalidad de este modo:

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

usted podría intentar Lucene (el puerto de Perl se llama Plucene). Las búsquedas son increíblemente rápidas y sé que PDFBox ya sabe cómo indexar archivos PDF con Lucene. PDFBox es Java, pero es probable que haya algo muy similar en algún lugar de CPAN. Incluso si no puede encontrar algo que ya agregue archivos PDF a un índice de Lucene, no debe haber más de unas pocas líneas de código para hacerlo usted mismo. Lucene le dará bastantes más opciones de búsqueda que simplemente buscar una cadena en un archivo.

También hay una manera muy rápida y sucia. El texto en un archivo PDF se almacena en realidad como texto sin formato. Si abre un PDF en un editor de texto o usa 'cadenas', puede ver el texto allí. La basura binaria generalmente está integrada en fuentes, imágenes, etc.

Cuestiones relacionadas