¿Hay alguna forma de buscar archivos PDF usando el poder de grep, sin convertir primero a texto en Ubuntu?

Comentarios

Respuesta

Instale el paquete pdfgrep, luego use el comando:

find /path -iname "*.pdf" -exec pdfgrep pattern {} + 

—— ————

La forma más sencilla de hacerlo:

pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf 

Comentarios

  • Esto también funciona en mac osx (Mavericks). Instálelo usando brebaje. Sencillo. Gracias.
  • Por curiosidad, verifiqué la fuente de pdfgrep y usa poppler para extraer cadenas del pdf. Casi exactamente como @wag ‘ s responde solo por página en lugar de, presumiblemente, todo el documento.
  • pdfgrep también tiene una bandera recursiva. Entonces, esta respuesta quizás podría reducirse a: pdfgrep -R pattern /path/. Aunque podría ser menos efectivo si revisa todos los archivos, incluso si no es ‘ t un PDF. Y noto que tiene problemas con caracteres internacionales como å, ä y ö .
  • En realidad, la opción -n es una ventaja para pdfgrep ya que permite incluir el número de página en la salida (podría ser útil para un procesamiento posterior).
  • Esta respuesta sería más fácil de usar si explicara qué partes del comando se deben copiar literalmente y cuáles son marcadores de posición. ¿Qué ‘ s pattern? ¿Qué ‘ s {}? ¿Qué ‘ pasa con el `+`? No tengo idea en la primera lectura … así que me dirijo a la página de manual, supongo.

Responder

Si tiene poppler-utils instalado (predeterminado en Ubuntu Desktop), puede «convertirlo» sobre la marcha y canalizarlo a grep :

pdftotext my.pdf - | grep "pattern" 

Esto no creará un archivo .txt.

Comentarios

  • entonces … extrae el texto antes de grep, lo que significa que la respuesta es » no «.
  • @akira El OP probablemente significaba » sin abrir el PDF en un visor y exportarlo a texto »
  • @akira ¿Dónde ves » grep solamente «?
  • @akira Bueno, ya dije lo que pienso probablemente quiso decir; no ‘ no quiere exportar a texto antes de procesarlo. Dudo mucho que tenga un problema con cualquier comando que co se convierte en texto de cualquier forma; no hay ‘ razón para no hacerlo
  • @sherrellbc El segundo argumento de pdftotext es el nombre de archivo en el que debe escribir . Sin embargo, por convención, las herramientas normalmente le permiten escribir en stdout en lugar de en un archivo especificando un - en su lugar. De manera similar, algunas herramientas escribirían en stdout de forma predeterminada si omite dicho argumento por completo (pero esto no siempre es posible sin crear ambigüedad).

Respuesta

pdfgrep fue escrito exactamente para este propósito y está disponible en Ubuntu.

Intenta ser mayoritariamente compatible con grep y por lo tanto proporciona «el poder de grep», solo especializado para PDF. Eso incluye opciones comunes de grep, como --recursive, --ignore-case o --color.

A diferencia de pdftotext | grep, pdfgrep puede generar el número de página de una coincidencia de una manera eficaz y generalmente es más rápido cuando no tiene que buscar en todo el documento (p. ej. --max-count o --quiet).

El uso básico es:

pdfgrep PATTERN FILE.. 

donde PATTERN es su cadena de búsqueda y FILE una lista de nombres de archivo (o comodines en un shell).

Consulte la página de manual para obtener más información.

Respuesta

No.

Un pdf consiste en fragmentos de datos, algunos de ellos texto, algunos de ellos imágenes y algunos de ellos XYZ realmente mágicos y elegantes (por ejemplo, archivos .u3d). La mayoría de las veces, los fragmentos están comprimidos (p. ej., planos, verifique http://www.verypdf.com/pdfinfoeditor/compression.htm ). Para «grep» un . pdf que tiene para revertir la compresión, es decir, extraer el texto.

Puede hacerlo por archivo con herramientas como pdf2text y grep del resultado, o ejecute un «indexador» (consulte xapian.org o lucene ) que crea un índice de búsqueda a partir de sus archivos .pdf y luego puede usar el herramientas de motor de búsqueda de ese indexador para obtener el contenido del pdf.

Pero no, no puede grep archivos pdf y esperar respuestas confiables sin extraer el texto primero.

Comentarios

  • Considerando que pdfgrep existe (ver arriba), un » no » es incorrecto.
  • @JonathanCross, considerando que la pregunta dice » usando el poder de grep, sin convertir a texto primero «, un » plano no » es correcto.

Responder

Recoll puede buscar archivos PDF. No admite expresiones regulares, pero tiene muchas otras opciones de búsqueda, por lo que podría adaptarse a sus necesidades.

Respuesta

Hay una pregunta duplicada en StackOverflow. La gente allí sugiere una variación de la respuesta de harish.venkarts:

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

La ventaja sobre la respuesta similar aquí es la --with-filename marca para grep. Esto también es algo superior a pdfgrep, porque el grep estándar tiene más funciones.

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files

Comentarios

  • Creo que hubiera sido mejor dejar esto como comentario (o edición) en la respuesta similar a la que se refiere.

Respuesta

Eche un vistazo en la herramienta grep de recursos comunes crgrep que admite la búsqueda dentro de archivos PDF.

También permite buscar otros recursos como contenido anidado en archivos, bases de datos mesas , metadatos de imágenes, dependencias de archivos POM y recursos web, y combinaciones de estos, incluida la búsqueda recursiva.

Respuesta

Podría canalícelo a través de strings primero: –

cat file.pdf | strings | grep <...etc...> 

Comentarios

  • Solo use strings file.pdf | grep <...>, no ‘ no necesita cat
  • Sí, mi mente parece funcionar mejor con transmisiones … 🙂
  • no funcionará si el texto está comprimido, que es la mayoría de las veces.
  • Incluso si el texto está descomprimido, ‘ es generalmente pequeños fragmentos de oraciones (¡ni siquiera necesariamente palabras completas!) finamente entremezclados con información de formato. No es muy amigable para strings o grep.
  • ¿Puedes pensar en otra razón por la que usar cadenas para esto no sería ‘ ¿no funciona? Descubrí que el uso de cadenas funciona en algunos archivos PDF pero no en otros.

Respuesta

prueba esto

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done 

para imprimir las líneas, el patrón ocurre dentro del pdf

Respuesta

Aquí hay una secuencia de comandos rápida para buscar archivos PDF en el directorio actual:

#!/bin/bash if [ $# -ne 1 ]; then echo "usage $0 VALUE" 1>&2 exit 1 fi echo "SEARCH IS CASE SENSITIVE" 1>&2 find . -name "*.pdf" -exec /bin/bash -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"" "$1" \; 

Comentarios

  • No puedo editar esto debido a que es demasiado pequeño: el $1 en la invocación de búsqueda debe estar entre comillas; de lo contrario, esto no ‘ no funcionará con la búsqueda. términos con espacios.
  • @ankon lo arregló 🙂

Responder

cd to su carpeta que contiene su archivo pdf y luego ..

pdfgrep "pattern" your.pdf 

o si desea buscar en más de un archivo pdf (por ejemplo, en todos los archivos pdf) archivos en su carpeta)

pdfgrep "pattern" `ls *.pdf` 

o

pdfgrep "pattern" $(ls *.pdf) 

Comentarios

  • por qué En la tierra, ¿usas ls para poner nombres de archivo en parámetros? ‘ no solo es más lento sino también una mala idea usar ls como la entrada a otros comandos . Solo pdfgrep 'pattern' *.pdf es suficiente
  • @phuclv Estás equivocado. pdfgrep 'pattern' *.pdf no funcionará.
  • @ f0nzie, ‘ estás equivocado. $(ls *.pdf) será casi exactamente igual que *.pdf, solo que peor porque es especial los archivos no están protegidos entre comillas

Respuesta

Supongo que te refieres a tp no convertirlo en el disco, puede convertirlos a stdout y luego grep con pdftotext. Grepping el pdf sin ningún tipo de conversión no es un enfoque práctico ya que PDF es principalmente un formato binario.

En el directorio:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

o en el directorio y sus subdirectorios:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

Además, debido a que algunos pdf son escaneos, primero deben someterse a OCR. Escribí una forma bastante sencilla de buscar todos los archivos PDF que no se pueden grep ed y OCR.

Me di cuenta de si un pdf no tiene ninguna fuente, por lo general no se puede buscar. Así que, sabiendo esto, podemos usar pdffonts.

Primeras 2 líneas del pdffonts son el encabezado de la tabla, por lo que cuando un archivo se puede buscar tiene más de dos líneas de salida, sabiendo esto podemos crear:

gedit check_pdf_searchable.sh 

luego pega esto

#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi 

luego hazlo ejecutable

chmod +x check_pdf_searchable.sh 

luego enumera todo PDF que no se pueden buscar en el directorio:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

o en el directorio y sus subdirectorios:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

Respuesta

Si solo desea buscar nombres / propiedades en PDF … o cadenas simples que no están comprimidas o codificadas, entonces en lugar de strings puede utilizar el siguiente

grep -a STRING file.pdf cat -v file.pdf | grep STRING 

De grep --help:

 --binary-files=TYPE assume that binary files are TYPE; TYPE is "binary", "text", or "without-match" -a, --text equivalent to --binary-files=text 

y cat --help:

 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB 

Respuesta

gpdf podría ser lo que necesita si «está usando Gnome ! Marque esto en caso de que no esté usando Gnome. Tiene una lista de visores de PDF CLI. Luego puede usar grep para encontrar algún patrón.

Respuesta

 pdfgrep -r --include "*.pdf" -i "pattern"  

Comentarios

  • Bienvenido al sitio y gracias usted por su contribución. ¿Podría agregar alguna explicación sobre lo que significan estas opciones? Esto también podría ayudar a explicar en qué se diferencia su enfoque de otras respuestas a esta pregunta que también recomiendan pdfgrep.

Respuesta

La forma más rápida es

grep -rinw "pattern" --include \*.pdf * 

Comentarios

  • Bienvenido al sitio. ¿Le importaría agregar más explicaciones a la solución propuesta para que sea más accesible para los no expertos? Por ejemplo, su línea de comandos grep busca de forma recursiva en subdirectorios que alguien que no esté familiarizado con grep podría desconocer. Además, incluyó la marca -i aunque ignorar el caso no siempre es lo que el usuario desea. Además, explique en qué se diferencia su enfoque de la respuesta de, por ejemplo, @phuclv y otros.
  • Como dice AdminBee, la pregunta no solicita una búsqueda que no distinga entre mayúsculas y minúsculas o una búsqueda de directorio recursiva. Las opciones -n y -w tampoco están justificadas por la pregunta. Pero, lo que es más importante, esta respuesta le dice cómo buscar en archivos de texto cuyos nombres terminan con .pdf; no entendió el punto de la pregunta.

Respuesta

less mypdf.pdf | grep "Hello, World" 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *