Como posso grep em arquivos PDF?

106

Existe uma maneira de pesquisar arquivos pdf usando o poder do grep, sem converter primeiro texto no Ubuntu?

    
por Dervin Thunk 31.01.2011 / 14:31

13 respostas

112

Instale o pacote pdfgrep e use o comando:

find /path -iname '*.pdf' -exec pdfgrep pattern {} +
    
por 23.12.2011 / 19:40
54

Se você tem o poppler-utils instalado (padrão no Ubuntu Desktop), você pode "convertê-lo em tempo real e canalizá-lo para grep :

pdftotext my.pdf - | grep 'pattern'

Isso não criará um arquivo .txt.

    
por 31.01.2011 / 14:45
7

Não.

Um pdf consiste em pedaços de dados, alguns deles texto, alguns deles imagens e alguns deles realmente fantasia mágica XYZ (por exemplo, arquivos .u3d). Esses pedaços são na maioria das vezes comprimidos (por exemplo, flat, verifique link ). A fim de 'grep' um .pdf você tem para reverter a compressão aka extrair o texto.

Você pode fazer isso por arquivo com ferramentas como pdf2text e grep o resultado, ou executar um 'indexador' (veja xapian.org ou lucene ) que cria um índice pesquisável de seus arquivos .pdf e, em seguida, você pode usar as ferramentas do mecanismo de busca desse indexador para obter o conteúdo do pdf.

Mas não, você não pode grep arquivos pdf e esperar por respostas confiáveis sem extrair o texto primeiro.

    
por 31.01.2011 / 16:17
7
O

pdfgrep foi escrito exatamente para esse propósito e está disponível no Ubuntu.

Ele tenta ser principalmente compatível com grep e, assim, fornece "o poder do grep", especializado apenas em PDFs. Isso inclui opções comuns do grep, como --recursive , --ignore-case ou --color .

Em contraste com pdftotext | grep , o pdfgrep pode gerar o número de página de uma correspondência de uma maneira eficaz e geralmente é mais rápido quando não precisa pesquisar o documento inteiro (por exemplo, --max-count ou --quiet ). / p>

O uso básico é:

pdfgrep PATTERN FILE..

onde PATTERN é sua string de pesquisa e FILE uma lista de nomes de arquivos (ou curingas em um shell).

Veja a página de manual para mais informações.

    
por 19.06.2015 / 03:06
6

Recoll pode pesquisar PDFs. Não suporta expressões regulares, mas tem muitas outras opções de pesquisa, pelo que pode satisfazer as suas necessidades.

    
por 16.05.2013 / 22:52
4

Você poderia canalizá-lo através de strings primeiro: -

cat file.pdf | strings | grep <...etc...>
    
por 31.01.2011 / 14:45
3

Dê uma olhada na ferramenta comum grep de recursos crgrep que oferece suporte à pesquisa em arquivos PDF.

Ele também permite pesquisar outros recursos, como conteúdo aninhado em arquivos, tabelas de banco de dados, metadados de imagens, dependências de arquivos POM e recursos da Web - e combinações desses, incluindo pesquisa recursiva.

    
por 23.10.2013 / 14:30
2

tente isso

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

para imprimir as linhas que o padrão ocorre dentro do pdf

    
por 23.12.2011 / 20:35
2

cd para sua pasta contendo o seu arquivo pdf e depois ..

pdfgrep 'pattern' your.pdf

ou se você quiser pesquisar em mais de um arquivo pdf (por exemplo, em todos os arquivos pdf da sua pasta)

pdfgrep 'pattern'  'ls *.pdf'

ou

pdfgrep 'pattern' $(ls *.pdf)
    
por 19.04.2015 / 21:26
1

Existe uma pergunta duplicada no StackOverflow. As pessoas de lá sugerem uma variação da resposta de harish.venkarts:

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

A vantagem sobre a resposta semelhante aqui é a --with-filename flag para grep. Isso também é um pouco superior ao pdfgrep, porque o padrão grep tem mais recursos.

link

    
por 09.05.2014 / 12:00
0

O gpdf pode ser o que você precisa se estiver usando o Gnome! Verifique este caso você não esteja usando o Gnome. Tem uma lista de visualizadores de pdf do CLI. Então você pode usar grep para encontrar algum padrão.

Espero que ajude.

    
por 31.01.2011 / 15:03
0

Aqui está um script rápido para pesquisa pdf no diretório atual:

#!/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 \;
    
por 01.06.2016 / 21:01
0

Suponho que você quer dizer que tp não o converte no disco, você pode convertê-los em stdout e, em seguida, utilizá-lo com pdftotext . Ganhar o pdf sem qualquer tipo de conversão não é uma abordagem prática, pois PDF é principalmente um formato binário.

No diretório:

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

ou no diretório e seus subdiretórios:

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

Também porque alguns pdf são verificações que precisam ser OCR primeiro. Eu escrevi uma maneira bem simples de pesquisar todos os pdfs que não podem ser grep ed e OCR deles.

Percebi que, se um arquivo pdf não tiver nenhuma fonte, geralmente ele não é pesquisável. Então, sabendo disso, podemos usar pdffonts .

As primeiras 2 linhas do pdffonts são o cabeçalho da tabela, então quando um arquivo é pesquisável tem mais de duas saídas de linha, sabendo disso, podemos criar:

gedit check_pdf_searchable.sh

depois cole isto

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

torne-o executável

chmod +x check_pdf_searchable.sh

liste todos os PDFs não pesquisáveis no diretório:

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

ou no diretório e seus subdiretórios:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
    
por 08.02.2018 / 09:38

Tags