Como pesquisar o conteúdo de vários arquivos pdf?

227

Como eu poderia pesquisar o conteúdo dos arquivos PDF em um diretório / subdiretório? Estou procurando algumas ferramentas de linha de comando. Parece que grepnão é possível pesquisar arquivos PDF.

Jestin Joy
fonte
5
O Grep não funcionará, pois o PDF é um formato binário e o texto geralmente é compactado ou codificado de várias maneiras.
Mark Stephens
4
Aqui está uma solução GUI: Adobe Reader, consulte wikispaces.psu.edu/display/training/...
Martin Thoma
3
O Adobe Reader funciona bem, mas não indexa; portanto, se você tiver muitos arquivos, será lento. Alguma solução de indexação?
Ruby

Respostas:

211

Sua distribuição deve fornecer um utilitário chamado pdftotext:

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

O "-" é necessário para a saída do pdftotext para o stdout, não para os arquivos. As opções --with-filenamee --label=colocarão o nome do arquivo na saída do grep. O --colorsinalizador opcional é bom e informa ao grep para saída usando cores no terminal.

(No Ubuntu, pdftotexté fornecido pelo pacote xpdf-utilsou poppler-utils.)

Este método, using pdftotexte grep, tem uma vantagem sobre pdfgrepse você deseja usar recursos do GNU grepque pdfgrepnão suportam. Nota : O pdfgrep-1.3.x suporta a -Copção de impressão de linha de contexto.

sjr
fonte
1
@Kurt Pfeifle A edição "(Editar por -kp-)" que você fez não funciona, pois grepfiltra os nomes dos arquivos impressos.
Raphael Ahrens
@sjr não, embora a pdfgrepsolução seja boa para pesquisas muito rápidas e simples, muitas vezes eu quero ter algum contexto, pois uma única linha não será útil o suficiente - então, como eu adicionei a esta resposta: Por exemplo, você pode adicionar a opção C5 antes "o seu padrão" para incluir 5 linhas de contexto para a saída - pdfgrep não suporta esta
Colin D Bennett
oh isso é legal, feliz em saber que existem vantagens para isso, embora seja muito menos óbvio para a maioria das pessoas wtf que está fazendo
SJR
2
@sjr Apenas para constar: estou usando o Ubuntu 12.10 e pdfgrepé inútil, ele relata uma quantidade enorme de lixo em arquivos que não pode manipular. Sua solução, por outro lado, ajudou. Então, por favor, não exclua-o, mesmo após 3 anos, ainda é útil!
Ali
Eu era capaz de usá-lo também no cygwin, apesar de torná-lo uma função com o parâmetro Eu tive que fazer o "your_pattern" tornar-se '$ 1'
Koshmaar
215

Existe o pdfgrep , que faz exatamente o que o nome sugere.

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

Eu usei-o para pesquisas simples e funcionou bem.

(Existem pacotes no Debian, Ubuntu e Fedora.)

Desde a versão 1.3.0, o pdfgrep suporta pesquisa recursiva. Esta versão está disponível no Ubuntu desde o Ubuntu 12.10 (Quantal).

Graeme
fonte
1
Do Natty (Ubuntu 11.04) para cima (Veja packages.ubuntu.com/… )
Martin Thoma
2
O @pavon pdfgrepagora tem essa opção de recursão, incluindo -Rtambém seguir links simbólicos #
Tobias Kienzler
30

Recoll é um fantástico aplicativo de pesquisa de GUI de texto completo para Unix / Linux que suporta dezenas de formatos diferentes, incluindo PDF. Ele pode até passar o número exato da página e o termo de pesquisa de uma consulta para o visualizador de documentos e, assim, permite que você pule para o resultado diretamente de sua GUI.

O Recoll também vem com uma interface de linha de comando viável e uma interface de navegador da web .

Glutanimado
fonte
1
@ Glutanimate Ajudaria (eu e possivelmente outros também) se você pudesse adicionar um exemplo referente à pergunta original (ferramenta de linha de comando para pesquisa de vários PDFs): Eu também gostaria de ver como realizar uma pesquisa curinga e como pesquisar o diretório atual, incluindo todos os subdiretórios . Como isso ficaria recoll / xapianna linha de comando (não GUI)? Obrigado!
noz sobre natty
@ LeszekŻarna Talvez você possa postar o exemplo que testou?
Noz sobre natty
O recoll manual do usuário pode conter algumas indicações, mas oferece uma bastante técnica e "off-topic" ler ...
noz sobre natty
1
@nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow comeu os backticks em torno do pwd.
medoc
13

Minha versão atual do pdfgrep (1.3.0) permite o seguinte:

pdfgrep -HiR 'pattern' /path

Ao fazer pdfgrep --help:

  • H: Imprima o nome do arquivo para cada correspondência.
  • i: Ignore as distinções de maiúsculas e minúsculas.
  • R: Pesquise diretórios recursivamente.

Funciona bem no meu Ubuntu.

Arkhi
fonte
7

Eu fiz esse pequeno script destrutivo . Divirta-se com isso.

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
fonte
2
+1. Mas, em vez de $filename.você, você deve inseri-lo grep.
Raphael Ahrens
3

Eu gosto da resposta do @ sjr, no entanto, prefiro xargs vs -exec. Acho xargs mais versátil. Por exemplo, com -P, podemos tirar proveito de várias CPUs quando faz sentido.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
Deian
fonte
ponto interessante sobre xargs'capacidade de processamento paralelo. Observe que seu --labelargumento de opção será literalmente {} , porque o grepcomando agora não é mais executado no contexto de find's exec.
usar o seguinte comando
2

Eu tive o mesmo problema e, portanto, escrevi um script que procura uma string em todos os arquivos pdf da pasta especificada e imprime os arquivos PDF correspondentes à string de consulta.

Talvez isso seja útil para você.

Você pode baixá-lo aqui

Paul Weibert
fonte
talvez seja útil colocar o script no comentário?
Baxx
Eu tentei o seu script e ele ficou muito mais lento que a pdfgrepsolução ou o one-liner do sjr, e me deixou com um processo contínuo usando 100% de um thread da CPU, mesmo depois de eu ter pressionado Ctrl-C para finalizá-lo.
Jason
2

Se você deseja ver os nomes de arquivo com pdftotext, use o seguinte comando:

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

Há outro utilitário chamado ripgrep-all , que é baseado no ripgrep .

Ele pode lidar com mais do que apenas documentos PDF, como documentos e filmes do Office, e o autor afirma que é mais rápido que pdfgrep.

Sintaxe de comando para pesquisar recursivamente o diretório atual, e o segundo limita apenas aos arquivos PDF:

rga 'pattern' .
rga --type pdf 'pattern' .
oschoudhury
fonte
1

Há um recurso comum ferramenta grep open source crgrep que pesquisas em arquivos PDF, mas também outros recursos como conteúdo aninhado em arquivos, tabelas de banco de dados, imagem meta-dados, dependências do arquivo POM e os recursos da web - e combinações destes incluindo a busca recursiva.

A descrição completa na guia Arquivos praticamente cobre o que a ferramenta suporta.

Eu desenvolvi o crgrep como uma ferramenta de código-fonte aberto.

Craig
fonte
Craig - você tem alguma conexão com esse projeto? Nesse caso, você deve indicá-lo em sua resposta. Digo isto porque você acabou de enviar uma resposta virtualmente idêntico a duas outras questões velhos ...
Stephen C
Pós atualizado para esclarecer que eu sou o autor de crgrep
Craig
1

Primeiro converta todos os seus arquivos PDF em arquivos de texto:

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

Então use grepcomo normal. Isso é especialmente bom, pois é rápido quando você tem várias consultas e muitos arquivos PDF.

Martin Thoma
fonte
Isso, quando feito em combinação com ag github.com/ggreer/the_silver_searcher . Capaz de analisar em Gb psicodélicos por microssegundos. Arquivos simples para toda a vida
NVRM 10/0318
0

Você precisa de algumas ferramentas, como pdf2text, para primeiro converter seu pdf em um arquivo de texto e depois pesquisar dentro do texto. (Você provavelmente perderá algumas informações ou símbolos).

Se você estiver usando uma linguagem de programação, provavelmente existem bibliotecas de pdf escritas para esse fim. por exemplo, http://search.cpan.org/dist/CAM-PDF/ para Perl

Sorriso de nylon
fonte
0

tente usar 'acroread' em um script simples como o descrito acima

acathur
fonte