Existe uma maneira de pesquisar arquivos PDF usando o poder do grep, sem converter primeiro o texto no Ubuntu?
Existe uma maneira de pesquisar arquivos PDF usando o poder do grep, sem converter primeiro o texto no Ubuntu?
Respostas:
Instale o pacote pdfgrep
e use o comando:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
Maneira mais simples é
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
também tem uma bandeira recursiva. Assim, esta resposta talvez pudesse ser reduzido a: pdfgrep -R pattern /path/
. Embora possa ser menos eficaz se passar por todos os arquivos, mesmo que não seja um PDF. E percebo que há problemas com caracteres internacionais como å, ä e ö.
-n
opção é um profissional para o pdfgrep, pois permite incluir o número da página na saída (pode ser útil para processamento adicional).
pattern
? O que é {}
? O que há com o `+`? Eu não tenho idéia na primeira leitura ... então vou para a página de manual, suponho.
Se você poppler-utils
instalou (padrão no Ubuntu Desktop), você pode "convertê-lo" rapidamente e canalizá-lo para grep
:
pdftotext my.pdf - | grep 'pattern'
Isso não criará um arquivo .txt.
pdftotext
é o nome do arquivo no qual ele deve gravar. No entanto, por convenção, as ferramentas normalmente permitem gravar em stdout
vez de em um arquivo, especificando um -
. Da mesma forma, algumas ferramentas gravariam stdout
por padrão se você omitir completamente esse argumento (mas isso nem sempre é possível sem criar ambiguidade).
O pdfgrep foi escrito exatamente para esse fim e está disponível no Ubuntu.
Ele tenta ser principalmente compatível grep
e, portanto, fornece "o poder do grep", especializado apenas em PDFs. Isso inclui opções comuns de grep, como --recursive
, --ignore-case
ou --color
.
Em contraste com pdftotext | grep
, o pdfgrep pode gerar o número da página de uma correspondência de maneira eficiente e geralmente é mais rápido quando não é necessário pesquisar o documento inteiro (por exemplo, --max-count
ou --quiet
).
O uso básico é:
pdfgrep PATTERN FILE..
onde PATTERN
está a 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.
Não.
Um pdf consiste em pedaços de dados, alguns com texto, alguns com fotos e outros com XYZ sofisticado e mágico (por exemplo, arquivos .u3d). Esses pedaços são na maioria das vezes compactados (por exemplo, flat, consulte http://www.verypdf.com/pdfinfoeditor/compression.htm ). Para 'grep' um arquivo .pdf, você precisa reverter a compactação, também conhecida como 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 a partir de seus arquivos .pdf e pode usar a pesquisa ferramentas de mecanismo desse indexador para obter o conteúdo do pdf.
Mas não, você não pode grep
arquivos pdf e espera por respostas confiáveis sem extrair o texto primeiro.
pdfgrep
existe (veja acima), um "não" simples está incorreto.
Você pode passar strings
primeiro: -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, você não precisacat
strings
ou grep
.
Dê uma olhada na ferramenta grep de recurso comum crgrep, que suporta a 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, o padrão ocorre dentro do pdf
CD para a sua pasta contendo o seu arquivo pdf e depois ..
pdfgrep 'pattern' your.pdf
ou se você deseja 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)
ls
saída como entrada para outros comandos . Apenas pdfgrep 'pattern' *.pdf
é suficiente
Há uma pergunta duplicada no StackOverflow. As pessoas sugerem uma variação 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
bandeira do 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
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 \;
Presumo que você quer dizer tp não convertê-lo no disco, você pode convertê-los para stdout
e depois cumprimentá-lo pdftotext
. Grepping 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 algumas pdf
são verificações, elas precisam ser OCR primeiro. Eu escrevi uma maneira bastante simples de pesquisar todos os PDFs que não podem ser grep
editados e ocrá-los.
Percebi que se um pdf
arquivo não tem nenhuma fonte, geralmente não é pesquisável. Então, sabendo disso, podemos usar pdffonts
.
As primeiras 2 linhas do pdffonts
são o cabeçalho da tabela; portanto, quando um arquivo é pesquisável, tem mais de duas linhas de saída, sabendo disso, podemos criar:
gedit check_pdf_searchable.sh
depois cole
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
então torne-o executável
chmod +x check_pdf_searchable.sh
em seguida, 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 {}
Se você deseja apenas pesquisar nomes / propriedades em pdf ... ou seqüências de caracteres simples que não são compactadas ou codificadas, em vez de strings
usar as opções abaixo
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