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

Comentários

Resposta

Instale o pacote pdfgrep e use o comando:

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

—— ————

Maneira mais simples de fazer isso:

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

Comentários

  • Isso funciona no mac osx (Mavericks) também. Instale-o usando cerveja. Simples. Obrigado.
  • Por curiosidade, verifiquei a fonte do pdfgrep e ele usa o poppler para extrair strings do pdf. Quase exatamente como a resposta de @wag ‘ s apenas pagewise em vez de, presumivelmente, todo o documento.
  • pdfgrep também tem um sinalizador recursivo. Portanto, essa resposta talvez pudesse ser reduzida a: pdfgrep -R pattern /path/. Embora possa ser menos eficaz se passar por todos os arquivos, mesmo que não seja ‘ um PDF. E percebi que há problemas com caracteres internacionais, como å, ä e ö .
  • Na verdade, a opção -n é uma profissional do pdfgrep, pois permite incluir o número da página na saída (pode ser útil para processamento posterior).
  • Esta resposta seria mais fácil de usar se explicasse quais bits do comando devem ser copiados literalmente e quais são marcadores de posição. O que ‘ s pattern? O que ‘ s {}? O que ‘ está acontecendo com o `+`? Não tenho ideia na primeira leitura … então vou para a página de manual que vou, suponho.

Resposta

Se você tiver poppler-utils instalado (padrão no Ubuntu Desktop), poderá “convertê-lo” em tempo real e canalizá-lo para grep :

pdftotext my.pdf - | grep "pattern" 

Isso não criará um arquivo .txt.

Comentários

  • então .. você extrai o texto antes de grep, o que significa que a resposta é ” no “.
  • @akira O OP provavelmente significava ” sem abrir o PDF em um visualizador e exportar para texto ”
  • @akira Onde você vê ” grep only “?
  • @akira Bem, eu já disse o que penso ele provavelmente quis dizer; ele não ‘ quer exportar para texto antes de processá-lo. Duvido muito que ele tenha problemas com qualquer comando que co nverte para texto de qualquer forma; não há ‘ nenhuma razão para não
  • @sherrellbc O segundo argumento de pdftotext é o nome do arquivo que deve ser escrito . No entanto, por convenção, as ferramentas normalmente permitem que você grave em stdout em vez de em um arquivo especificando um -. Da mesma forma, algumas ferramentas gravariam em stdout por padrão se você omitir totalmente esse argumento (mas isso nem sempre é possível sem criar ambiguidade).

Resposta

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

Ele tenta ser mais compatível com grep e, portanto, fornece “o poder do grep”, especializado apenas para PDFs. Isso inclui opções grep comuns, como --recursive, --ignore-case ou --color.

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

O uso básico é:

pdfgrep PATTERN FILE.. 

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

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

Resposta

Não.

Um pdf consiste em pedaços de dados, alguns deles texto, alguns deles imagens e alguns deles XYZ realmente mágicos (por exemplo. arquivos .u3d). os pedaços são na maioria das vezes compactados (por exemplo, flat, verifique http://www.verypdf.com/pdfinfoeditor/compression.htm ). Para “grep” a . pdf você tem para reverter a compressão ou extrair o texto.

Você pode fazer isso por arquivo com ferramentas como pdf2text e executar o grep no resultado ou executar um “indexador” (veja xapian.org ou lucene ) que constrói um índice pesquisável de seus arquivos .pdf e então você pode usar o ferramentas do mecanismo de pesquisa desse indexador para obter o conteúdo do pdf.

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

Comentários

  • Considerando que pdfgrep existe (veja acima), um ” no ” está incorreto.
  • @JonathanCross, considerando que a pergunta diz ” usando o poder do grep, sem primeiro converter para texto “, um plano ” não ” está correto.

Resposta

Recoll pode pesquisar PDFs. Não é compatível com expressões regulares, mas tem muitas outras opções de pesquisa, portanto, pode atender às suas necessidades.

Resposta

Há uma pergunta duplicada no StackOverflow. As pessoas ali sugerem uma variação da resposta harish.venkarts:

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

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

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

Comentários

  • Acho que teria sido melhor deixar isto como um comentário (ou edição) na resposta semelhante à qual você está se referindo.

Resposta

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

Também permite pesquisar outros recursos, como conteúdo aninhado em arquivos, banco de dados mesas , metadados de imagem, dependências de arquivo POM e recursos da web – e combinações destes, incluindo pesquisa recursiva.

Resposta

Você poderia canalize-o por strings primeiro: –

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

Comentários

  • Basta usar strings file.pdf | grep <...>, você não ‘ não precisa cat
  • Sim – minha mente parece funcionar melhor com streams … 🙂
  • não funcionará se o texto for compactado, o que acontece na maioria das vezes.
  • Mesmo se o texto é descompactado, ele ‘ s geralmente pequenas partes de frases (nem mesmo palavras inteiras!) finamente misturadas com informações de formatação. Não é muito amigável para strings ou grep.
  • Você pode pensar em outro motivo pelo qual usar strings para isso não ‘ t funciona? Descobri que o uso de strings funciona em alguns PDFs, mas não em outros.

Resposta

tente isso

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

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

Resposta

Aqui está um script rápido para pesquisar 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" \; 

Comentários

  • Não posso editar isso porque sou muito pequeno: o $1 na invocação de localização deve ser citado, caso contrário, não ‘ funcionará com a pesquisa termos com espaços.
  • @ankon corrigiu 🙂

Resposta

cd para sua pasta contendo seu arquivo pdf e então ..

pdfgrep "pattern" your.pdf 

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

pdfgrep "pattern" `ls *.pdf` 

ou

pdfgrep "pattern" $(ls *.pdf) 

Comentários

  • por que na Terra, você usa ls para colocar nomes de arquivos em parâmetros? Não é ‘ apenas mais lento, mas também uma má ideia usar ls a saída como a entrada para outros comandos . Apenas pdfgrep 'pattern' *.pdf é o suficiente
  • @phuclv Você está errado. pdfgrep 'pattern' *.pdf não funcionará.
  • @ f0nzie, você ‘ está errado. $(ls *.pdf) será quase exatamente o mesmo que *.pdf, só que pior porque especial os arquivos não estão protegidos entre aspas

Resposta

Presumo que você queira dizer não convertê-lo no disco, você pode convertê-los para stdout e, em seguida, grep com pdftotext. Pesquisar 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" 

Além disso, porque alguns pdf são varreduras, eles precisam passar por OCR primeiro. Eu escrevi uma maneira bem simples de pesquisar todos os PDFs que não podem ser grep editados e OCR deles.

Eu percebi que um pdf o arquivo não tem nenhuma fonte, geralmente não é pesquisável. Sabendo disso, podemos usar pdffonts.

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

gedit check_pdf_searchable.sh 

em seguida, cole

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

e torne-o executável

chmod +x check_pdf_searchable.sh 

e liste todos 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 {} 

Resposta

Se você apenas deseja pesquisar nomes / propriedades em PDF … ou strings simples que não são compactadas ou codificadas em vez de strings você pode usar o seguinte

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 

e cat --help:

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

Resposta

gpdf pode ser o que você precisa se estiver usando o Gnome ! Verifique isto caso você não esteja usando o Gnome. Ele tem uma lista de visualizadores de pdf CLI. Em seguida, você pode usar grep para encontrar algum padrão.

Resposta

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

Comentários

  • Bem-vindo ao site e obrigado por sua contribuição. Você poderia acrescentar alguma explicação sobre o que essas opções significam? Isso também pode ajudar a explicar como sua abordagem difere de outras respostas a esta pergunta que também recomendam pdfgrep.

Resposta

A maneira mais rápida é

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

Comentários

  • Bem vindo ao site. Você se importaria de adicionar mais explicações à solução proposta para torná-la mais acessível para quem não é especialista? Por exemplo, suas pesquisas de linha de comando grep recursivamente em subdiretórios que alguém não familiarizado com grep pode não saber. Além disso, você incluiu o sinalizador -i, embora ignorar o caso nem sempre seja o que o usuário deseja. Além disso, explique de que forma a sua abordagem difere da resposta de, por exemplo, @phuclv e outros.
  • Como diz AdminBee, a pergunta não pede uma pesquisa que não diferencia maiúsculas de minúsculas ou uma pesquisa recursiva de diretório. As opções -n e -w também não são justificadas pela pergunta. Mas, o mais importante, esta resposta mostra como pesquisar em arquivos de texto cujos nomes terminem com .pdf – você não entendeu o ponto da questão.

Resposta

less mypdf.pdf | grep "Hello, World" 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *