Como localizar automaticamente PDFs não pesquisáveis

4

Suponha que eu tenha um diretório cheio de muitos PDFs. Na maioria deles, o texto é totalmente pesquisável, o que é o que eu preciso que eles sejam. Mas alguns deles são apenas imagens digitalizadas e precisam ser OCR-ed.

Outros, em seguida, basta fazer um OCR em lote em todo o diretório. Existe uma maneira de identificar rapidamente quais PDFs são os únicos de imagem que realmente precisam ser OCR-ed?

Eu não sou um programador, mas uma solução amigável ao Linux seria a preferida.

    
por Brian Z 06.09.2013 / 16:30

3 respostas

3

Eu não tenho certeza se esta é uma solução 100%, mas eu criei o seguinte script que deve te dar uma boa parte do caminho, se não todo o caminho (eu não passei pela especificação). ser executado a partir do diretório que tem todos os PDFs (ele irá procurar subdiretórios).

#! /bin/bash

if [[ ! "$#" = "1" ]]
  then
      echo "Usage: $0 /path/to/PDFDirectory"
      exit 1
fi

PDFDIRECTORY="$1"

while IFS= read -r -d $'
#! /bin/bash

if [[ ! "$#" = "1" ]]
  then
      echo "Usage: $0 /path/to/PDFDirectory"
      exit 1
fi

PDFDIRECTORY="$1"

while IFS= read -r -d $'%pre%' FILE; do
    PDFFONTS_OUT="$(pdffonts "$FILE" 2>/dev/null)"
    RET_PDFFONTS="$?"
    FONTS="$(( $(echo "$PDFFONTS_OUT" | wc -l) - 2 ))"
    if [[ ! "$RET_PDFFONTS" = "0" ]]
      then
          READ_ERROR=1
          echo "Error while reading $FILE. Skipping..."
          continue
    fi
    if [[ "$FONTS" = "0" ]]
      then
          echo "NOT SEARCHABLE: $FILE"
      else
          echo "SEARCHABLE: $FILE"
    fi
done < <(find "$PDFDIRECTORY" -type f -name '*.pdf' -print0)

echo "Done."
if [[ "$READ_ERROR" = "1" ]]
  then
      echo "There were some errors."
fi
' FILE; do PDFFONTS_OUT="$(pdffonts "$FILE" 2>/dev/null)" RET_PDFFONTS="$?" FONTS="$(( $(echo "$PDFFONTS_OUT" | wc -l) - 2 ))" if [[ ! "$RET_PDFFONTS" = "0" ]] then READ_ERROR=1 echo "Error while reading $FILE. Skipping..." continue fi if [[ "$FONTS" = "0" ]] then echo "NOT SEARCHABLE: $FILE" else echo "SEARCHABLE: $FILE" fi done < <(find "$PDFDIRECTORY" -type f -name '*.pdf' -print0) echo "Done." if [[ "$READ_ERROR" = "1" ]] then echo "There were some errors." fi

Funciona procurando o número de fontes especificado em cada PDF. Se o arquivo não tiver fontes, presume-se que seja composto apenas por uma imagem. (Isso pode atrapalhar arquivos protegidos por senha, não tenho idéia, não tenho nenhum teste contra). Se houver alguma coisa pesquisável e alguma coisa que seja uma imagem, isso não funcionará - mas provavelmente será útil separar os documentos de imagem digitalizados em um contêiner PDF dos PDFs "reais".

Você pode, é claro, comentar a parte do loop if-then-else que não se aplica se você quiser apenas imprimir os arquivos que não são pesquisáveis.

    
por 07.09.2013 / 06:28
2

Vou usar um truque, é um fato secundário peculiar que eu notei se um arquivo pdf não tem nenhuma fonte, normalmente 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" # alternatively you can use ocrmypdf "$1" "${1}_ocr.pdf"
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 em seus subdiretórios:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
    
por 08.02.2018 / 00:49
0

Eu tive dificuldades com tree , então essa solução funcionou para mim, usando o mesmo script.

find . -name "*.pdf" -type f -exec ~/check_pdf_searchable.sh {} \;

~/ assume que o script está no seu diretório pessoal. Facilita as coisas.

    
por 30.04.2019 / 02:41

Tags