Existe uma maneira de pesquisar arquivos PDF usando o poder do grep, sem converter em texto primeiro no Ubuntu?
Comentários
- Veja também Existe algum tipo de conversor de PDF para texto? e Ferramenta de linha de comando para pesquisar frases em um grande número de arquivos PDF .
- Para pessoas que vêm aqui por meio de pesquisa: Se você deseja convertê-la primeiro em arquivos de texto, tenha veja Como pesquisar o conteúdo de vários arquivos PDF?
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 emstdout
em vez de em um arquivo especificando um-
. Da mesma forma, algumas ferramentas gravariam emstdout
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 precisacat
- 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
ougrep
. - 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 . Apenaspdfgrep '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 comgrep
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"