¿Cómo buscar contenidos de múltiples archivos pdf?

227

¿Cómo podría buscar el contenido de los archivos PDF en un directorio / subdirectorio? Estoy buscando algunas herramientas de línea de comandos. Parece que grepno puede buscar archivos PDF.

Jestin Joy
fuente
55
Grep no funcionará ya que PDF es un formato binario y el texto a menudo se comprime o codifica de varias maneras.
Mark Stephen el
44
Aquí hay una solución GUI: Adobe Reader, ver wikispaces.psu.edu/display/training/…
Martin Thoma
3
Adobe Reader funciona bien, pero no indexa; así que si tienes muchos archivos, será lento. ¿Alguna solución de indexación?
Ruby

Respuestas:

211

Su distribución debe proporcionar una utilidad llamada pdftotext:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

El "-" es necesario para tener salida de pdftotext a stdout, no a archivos. Las opciones --with-filenamey --label=colocarán el nombre del archivo en la salida de grep. La --colorbandera opcional es agradable y le dice a grep que salga usando colores en la terminal.

(En Ubuntu, pdftotextes proporcionado por el paquete xpdf-utilso poppler-utils.)

Este método, el uso de pdftotexty grep, tiene una ventaja sobre pdfgrepsi desea utilizar características de GNU grepque pdfgrepno son compatibles. Nota : pdfgrep-1.3.x admite la -Copción para imprimir la línea de contexto.

sjr
fuente
1
@Kurt Pfeifle La edición "(Editar por -kp-)" que realizó no funciona, ya que grepfiltra los nombres de los archivos impresos.
Raphael Ahrens
@sjr no, aunque la pdfgrepsolución es buena para búsquedas realmente rápidas y simples, a menudo quiero obtener algo de contexto, ya que una sola línea no será lo suficientemente útil, por lo que agregué a esta respuesta: por ejemplo, puede agregar la opción -C5 antes de "su patrón" para incluir 5 líneas de contexto a la salida - pdfgrep no lo admite
Colin D Bennett
Oh, eso es genial, me alegra saber que hay ventajas en esto a pesar de que es mucho menos obvio para la mayoría de las personas lo que está haciendo
sjr
2
@sjr Solo para el registro: estoy usando Ubuntu 12.10 y pdfgrepes inútil, informa una gran cantidad de basura en los archivos que no puede manejar. Su solución, por otro lado, ayudó. Por lo tanto, no lo elimine, ¡incluso después de 3 años sigue siendo útil!
Ali
Pude usarlo también en cygwin, aunque para que fuera una función con el parámetro tuve que hacer que "your_pattern" se convirtiera en '$ 1'
Koshmaar
215

Hay pdfgrep , que hace exactamente lo que sugiere su nombre.

pdfgrep -R 'a pattern to search recursively from path' /some/path

Lo he usado para búsquedas simples y funcionó bien.

(Hay paquetes en Debian, Ubuntu y Fedora).

Desde la versión 1.3.0, pdfgrep admite la búsqueda recursiva. Esta versión está disponible en Ubuntu desde Ubuntu 12.10 (Quantal).

Graeme
fuente
1
De Natty (Ubuntu 11.04) en adelante (Ver paquetes.ubuntu.com/… )
Martin Thoma
2
@pavon pdfgrepahora tiene esa opción de recursión, que incluye -Rtambién seguir enlaces simbólicos
Tobias Kienzler
30

Recoll es una fantástica aplicación de búsqueda de GUI de texto completo para Unix / Linux que admite docenas de formatos diferentes, incluido PDF. Incluso puede pasar el número de página exacto y el término de búsqueda de una consulta al visor de documentos y, por lo tanto, le permite saltar directamente al resultado desde su GUI.

Recoll también viene con una interfaz de línea de comandos viable y una interfaz de navegador web .

Glutanimato
fuente
1
@Glutanimate Sería útil (para mí y posiblemente para otros también) si pudiera agregar un ejemplo relacionado con la pregunta original (herramienta de línea de comandos para la búsqueda de múltiples archivos PDF): también me gustaría ver cómo realizar una búsqueda con comodines y cómo buscar el directorio actual que incluye todos los subdirectorios . ¿Cómo se vería eso recoll / xapianen la línea de comandos (sin GUI)? ¡Gracias!
loco por natty
@ LeszekŻarna ¿Quizás podría publicar el ejemplo que probó?
loco por natty
El recoll manual del usuario podría contener algunas indicaciones, pero ofrece un lugar técnica y "fuera de tema" leer ...
nuez sobre Natty
1
@nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow se comió los backticks alrededor de pwd.
medoc
13

Mi versión real de pdfgrep (1.3.0) permite lo siguiente:

pdfgrep -HiR 'pattern' /path

Al hacer pdfgrep --help:

  • H: Imprima el nombre del archivo para cada coincidencia.
  • i: Ignorar las distinciones de casos.
  • R: Buscar directorios de forma recursiva.

Funciona bien en mi Ubuntu.

arkhi
fuente
7

Hice este pequeño guión destructivo . Diviértete con eso.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}
phil
fuente
2
+1. Pero en lugar de $filename.eso, debes colocarlo grep.
Raphael Ahrens
3

Me gusta la respuesta de @ sjr, sin embargo, prefiero xargs vs -exec. Me parece que los xargs son más versátiles. Por ejemplo, con -P podemos aprovechar múltiples CPU cuando tenga sentido hacerlo.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
Deian
fuente
punto interesante sobre xargsla capacidad de procesamiento en paralelo. Tenga en cuenta que su --labelargumento de opción será literal {} , porque el grepcomando ya no se ejecuta en el contexto de find's exec.
mklement0
2

Tuve el mismo problema y, por lo tanto, escribí un script que busca una cadena en todos los archivos pdf en la carpeta especificada e imprime los archivos PDF que coinciden con la cadena de consulta.

Tal vez esto te sea útil.

Puedes descargarlo aquí

Paul Weibert
fuente
tal vez útil para poner el guión en el comentario?
baxx
probé su script y resultó mucho más lento que la pdfgrepsolución o la línea única de sjr, y me dejó con un proceso continuo que usa el 100% de un hilo de la CPU incluso después de presionar Ctrl-C para terminarlo.
Jason
2

Si desea ver los nombres de archivo con pdftotext, use el siguiente comando:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 
Aleksey Kontsevich
fuente
2

Hay otra utilidad llamada ripgrep-all , que se basa en ripgrep .

Puede manejar más que solo documentos PDF, como documentos de Office y películas, y el autor afirma que es más rápido que pdfgrep.

Sintaxis del comando para buscar de forma recursiva el directorio actual, y el segundo se limita a los archivos PDF solamente:

rga 'pattern' .
rga --type pdf 'pattern' .
Oschoudhury
fuente
1

Hay un recurso común de herramientas de código abierto grep crgrep el que las búsquedas dentro de los archivos PDF, sino también otros recursos como el contenido de anidar en los archivos de bases de datos, tablas, imagen meta-datos, dependencias de archivo POM y recursos web - y las combinaciones de éstos incluyendo la búsqueda recursiva.

La descripción completa en la pestaña Archivos cubre más o menos lo que la herramienta admite.

Desarrollé crgrep como una herramienta de código abierto.

Craig
fuente
Craig, ¿tienes alguna conexión con ese proyecto? Si es así, debe indicarlo en su respuesta. Digo esto porque acabas de publicar una respuesta prácticamente idéntica a otras dos preguntas antiguas ...
Stephen C
Publicación actualizada para aclarar que soy el autor de crgrep
Craig
1

Primero convierta todos sus archivos pdf a archivos de texto:

for file in *.pdf;do pdftotext "$file"; done

Luego utilícelo grepcomo de costumbre. Esto es especialmente bueno, ya que es rápido cuando tiene múltiples consultas y muchos archivos PDF.

Martin Thoma
fuente
Esto, cuando se hace en combinación con ag github.com/ggreer/the_silver_searcher . Capaz de analizar en psicodeliks Gb por microsegundos. Archivos planos para toda la vida
NVRM
0

Necesita algunas herramientas como pdf2text para convertir primero su pdf a un archivo de texto y luego buscar dentro del texto. (Probablemente perderá alguna información o símbolos).

Si está utilizando un lenguaje de programación, probablemente haya bibliotecas pdf escritas para este propósito. Por ejemplo, http://search.cpan.org/dist/CAM-PDF/ para Perl

Sonrisa de nylon
fuente
0

intente usar 'acroread' en un script simple como el anterior

acathur
fuente