Eu tenho milhares de documentos e alguns deles são digitalizados. Então, preciso de um script para testar todos os arquivos PDF que pertencem a um diretório. Existe uma maneira simples de fazer isso?
- A maioria dos PDFs são relatórios. Assim, eles têm muito texto.
Eles são muito diferentes, mas os digitalizados, conforme mencionado abaixo, podem encontrar algum texto devido a um processo precário de OCR acoplado à digitalização.
A proposta devida a Sudodus nos comentários abaixo parece ser muito interessante. Veja a diferença entre um PDF digitalizado para um PDF não digitalizado:
Digitalizado:
grep --color -a 'Image' AR-G1002.pdf
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 340615/Name/Obj13/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40452/Name/Obj18/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41680/Name/Obj23/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41432/Name/Obj28/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59084/Name/Obj33/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 472681/Name/Obj38/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 469340/Name/Obj43/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 371863/Name/Obj48/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 344092/Name/Obj53/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59416/Name/Obj58/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 48308/Name/Obj63/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 51564/Name/Obj68/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 63184/Name/Obj73/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40824/Name/Obj78/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 23320/Name/Obj83/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 31504/Name/Obj93/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 18996/Name/Obj98/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 292932/Name/Obj103/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 27720/Name/Obj108/Subtype/Image/Type/XObject/Width 1698>>stream
<rdf:li xml:lang="x-default">Image</rdf:li>
<rdf:li xml:lang="x-default">Image</rdf:li>
Não digitalizado:
grep --color -a 'Image' AR-G1003.pdf
<</Lang(en-US)/MarkInfo<</Marked true>>/Metadata 167 0 R/Pages 2 0 R/StructTreeR<</Contents 4 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F4 11 0 R/F5 13 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/<</Filter/FlateDecode/Length 5463>>stream
<</BaseFont/Times#20New#20Roman,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontD<</Ascent 891/AvgWidth 427/CapHeight 677/Descent -216/Flags 32/FontBBox[-558 -216 2000 677]/FontName/Times#20New#20Roman,Bold/FontWeight 700/ItalicAngle 0/Leadi<</BaseFont/Times#20New#20Roman/Encoding/WinAnsiEncoding/FirstChar 32/FontDescri<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontName/Times#20New#20Roman/FontWeight 400/ItalicAngle 0/Leading 42<</BaseFont/Arial,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 10 0<</Ascent 905/AvgWidth 479/CapHeight 728/Descent -210/Flags 32/FontBBox[-628 -210 2000 728]/FontName/Arial,Bold/FontWeight 700/ItalicAngle 0/Leading 33/MaxWidth<</BaseFont/Times#20New#20Roman,Italic/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 12 0 R/LastChar 118/Name/F4/Subtype/TrueType/Type/Font/Widths 164 0 <</Ascent 891/AvgWidth 402/CapHeight 694/Descent -216/Flags 32/FontBBox[-498 -216 1333 694]/FontName/Times#20New#20Roman,Italic/FontWeight 400/ItalicAngle -16.4<</BaseFont/Arial/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 14 0 R/La<</Ascent 905/AvgWidth 441/CapHeight 728/Descent -210/Flags 32/FontBBox[-665 -210 2000 728]/FontName/Arial/FontWeight 400/ItalicAngle 0/Leading 33/MaxWidth 2665<</Contents 16 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 7534>>streamarents 1/Tabs/S/Type/Page>>
<</Contents 18 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 6137>>streamarents 2/Tabs/S/Type/Page>>
<</Contents 20 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R/F6 21 0 R><</Filter/FlateDecode/Length 6533>>stream>>/StructParents 3/Tabs/S/Type/Page>>
<</BaseFont/Times#20New#20Roman/DescendantFonts 22 0 R/Encoding/Identity-H/Subty<</BaseFont/Times#20New#20Roman/CIDSystemInfo 24 0 R/CIDToGIDMap/Identity/DW 100<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontFile2 160 0 R/FontName/Times#20New#20Roman/FontWeight 400/Italic<</Contents 27 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</ExtGState<</GS28 28 0 R/GS29 29 0 R>>/Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F5 13 0 R/F6 21 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC<</Filter/FlateDecode/Length 5369>>streamge>>
O número de imagens por página é muito maior (cerca de uma por página)!
command-line
pdf
DanielTheRocketMan
fonte
fonte
pdf
arquivo contém uma imagem (inserida em um documento ao lado do texto ou em páginas inteiras, 'pdf digitalizado'), o arquivo geralmente (talvez sempre) contém a string/Image/
, que pode ser encontrada na linha de comandogrep --color -a 'Image' filename.pdf
. Isso separará os arquivos que contêm apenas texto daqueles que contêm imagens (imagens de página inteira, bem como páginas de texto com logotipos pequenos e figuras ilustrativas de tamanho médio).Respostas:
Shellscript
Se um
pdf
arquivo contém uma imagem (inserida em um documento ao lado do texto ou em páginas inteiras, 'pdf digitalizado'), o arquivo geralmente (talvez sempre) contém a sequência/Image/
.Da mesma maneira, você pode procurar a string
/Text
para saber se um arquivo pdf contém texto (não digitalizado).Eu criei o shellscript
pdf-text-or-image
e ele pode funcionar na maioria dos casos com seus arquivos. O shellscript procura as seqüências de texto/Image/
e/Text
ospdf
arquivos.Torne o shellscript executável,
Mude o diretório para onde você tem os
pdf
arquivos e execute o shellscript.Arquivos identificados são movidos para os seguintes subdiretórios
scanned
text
s-and-t
(para documentos com imagens [digitalizadas?] e conteúdo de texto)Objetos de arquivo não identificados, 'UFOs', permanecem no diretório atual.
Teste
Testei o shellscript com dois dos seus arquivos,
AR-G1002.pdf
eAR-G1003.pdf
, e com alguns própriospdf
arquivos (que criei usando o Libre Office Impress).Vamos torcer para que
fonte
grep -q
grep -q
sai imediatamente com status zero se alguma correspondência for encontrada (em vez de pesquisar nos arquivos inteiros).cd <path to dir>
Todos os arquivos digitalizados em PDF permanecerão na pasta e outros arquivos serão movidos para outra pasta.
fonte
file pdf-filename.pdf
produzirá um número de versão. Não foi possível pesquisar por texto específico em BR-L1411-3.pdf BR-L1411-3.pdf: documento PDF, versão 1.3, mas consegui pesquisar por texto nos dois arquivos que você forneceu, que são a versão 1.5 e 1.6 e obtenha uma ou mais correspondências. Usei o visualizador de PDF XChange para pesquisar esses arquivos, mas obtive resultados semelhantes com o evince. o documento da versão 1.3 não correspondia a nada.file
útil para concluir seu projeto. Embora eu, ao que parece, outros ainda não estejam claros sobre exatamente o que você está tentando realizar.Criei um script para detectar se um PDF era OCRd. A idéia principal: nos PDFs do OCRd, o texto é invisível.
Algoritmo para testar se um determinado PDF (
f1
) era OCRd:f1
anotado comof2
f2
f1
ef2
f1
foi OCRd se todas as imagensf1
ef2
forem idênticas.https://github.com/jfilter/pdf-scripts/blob/master/is_ocrd_pdf.sh
fonte
O Hobbyist oferece uma boa solução se os documentos digitalizados da coleção de documentos não tiverem texto adicionado com reconhecimento óptico de caracteres (OCR). Se isso for possível, convém executar alguns scripts que leiam a saída
pdfinfo -meta
e verifiquem a ferramenta usada para criar o arquivo, ou utilize uma rotina Python que use uma das bibliotecas Python para examiná-las. A pesquisa de texto com uma ferramenta comostrings
não será confiável, pois o conteúdo do PDF pode ser compactado. E verificar a ferramenta de criação também não é à prova de falhas, pois as páginas PDF podem ser combinadas; Eu costumo combinar documentos de texto PDF com imagens digitalizadas para manter as coisas juntas.Lamento não poder oferecer sugestões específicas. Já faz um tempo desde que eu analisei a estrutura interna do PDF, mas dependendo de quão rigorosos são seus requisitos, você pode querer saber que é meio complicado. Boa sorte!
fonte
Se realmente se trata de detectar se o PDF foi criado pela digitalização, em vez de o PDF possuir imagens em vez de texto , pode ser necessário cavar os metadados do arquivo, não apenas o conteúdo.
Em geral, para os arquivos que eu encontrei no meu computador e nos arquivos de teste, o seguinte é verdadeiro:
Estou usando o Windows no momento, então usei
node.js
o seguinte exemplo:Para executá-lo, você precisa ter o Node.js instalado (deve ser um único comando) e também precisa chamar:
Uso:
Este exemplo não é considerado uma solução finalizada, mas com o
debug
sinalizador, você obtém algumas informações sobre as meta informações de um arquivo:A função ingênua que escrevi tem 100% de êxito nos documentos que encontrei no meu computador (incluindo suas amostras). Eu nomeei os arquivos com base em qual era seu status antes de executar o programa, para possibilitar ver se os resultados estão corretos.
Você pode usar o modo de depuração junto com um pouquinho de programação para melhorar bastante seus resultados. Você pode passar a saída do programa para outros programas, ele sempre terá um caminho completo por linha.
fonte
2 maneiras em que posso pensar:
Usando a ferramenta Selecionar texto: se você estiver usando um PDF digitalizado, os textos não poderão ser selecionados, uma caixa será exibida. Você pode usar esse fato para criar o script. Eu sei que em C ++ QT existe uma maneira, mas não tenho certeza no Linux.
Pesquisar palavra no arquivo: em um PDF não digitalizado, sua pesquisa funcionará, mas não no arquivo digitalizado. Você só precisa encontrar algumas palavras comuns a todos os PDFs ou prefiro procurar a letra 'e' em todos os PDFs. Ele tem a distribuição de frequência mais alta, então é provável que você o encontre em todos os documentos que possuem texto (a menos que seja por engano )
por exemplo
Use qualquer uma das ferramentas de processamento de texto
fonte