Instale o pacote pdfgrep
e use o comando:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
Existe uma maneira de pesquisar arquivos pdf usando o poder do grep, sem converter primeiro texto no Ubuntu?
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.
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.
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.
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.
Você poderia canalizá-lo através de strings
primeiro: -
cat file.pdf | strings | grep <...etc...>
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.
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
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)
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.
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.
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 \;
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 {}