Como posso converter um PDF digitalizado com texto OCR para um sem texto com OCR?

5

Eu tenho um arquivo PDF digitalizado , com texto oculto de baixa qualidade.

Eu gostaria de ter um arquivo PDF sem o texto oculto.

Como posso converter um PDF digitalizado com texto OCR para sem texto com OCR?

Estou pensando em quais maneiras podem recuperar o arquivo PDF original digitalizado antes do OCR, sem alterar a largura e a altura de cada página em pixels e sem alterar os pixels por polegada de cada página?

Algum tipo de rasterização novamente ajuda? A rasterização irá novamente perder a qualidade da imagem?

Diversas atitudes:

  1. eu uso a impressão para arquivo no Evince, que eu acho que usa cups-pdf , não remove texto oculto.
  2. O seguinte comando usando gs não remove texto com OCR (acho que não descobri como usar gs corretamente):

    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
       -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf toc.pdf
    
por Tim 07.12.2014 / 13:30

4 respostas

4

Aqui está como eu removo o texto de OCR-ed, se eu tiver que ...

Primeiro, você precisa saber que o texto em OCR em um PDF não é uma camada , mas um modo especial de renderização de texto . A seguinte captura de tela da especificação oficial do PDF lista todas as renderizações de texto disponíveis modos:

Paramaisinformações,vejaestasminhasrespostasnoStackOverflow:

Agora, para o procedimento que imagino:

0. Faça um backup do seu arquivo PDF original

'nuff disse ...

1. Use qpdf para desfazer a compactação da maioria dos objetos PDF

qpdf é uma bela ferramenta de linha de comando para transformar a maioria dos PDFs em um formato que o torne mais fácil de manipular através de um editor de texto (ou através de sed ):

qpdf                       \
  --qdf                    \
  --object-streams=disable \
    input.pdf              \
    editable.pdf

2. Pesquise por pontos em que o código PDF contém 3 Tr

Todos os pontos no texto editable.pdf onde há 'invisível' (a.k.a. não preenchido nem acariciado ) são marcados por uma definição inicial de

3 Tr

Altere estes para agora ler

1 Tr

Isso deve tornar visível o texto anteriormente oculto. Os glifos aparecerão em contornos espessos, sobrepondo as imagens originais da página digitalizada.

Vai ficar muito feio.

Salve o PDF editado.

3. Altere os operadores de tratamento de texto Tj e TJ para 'não-ops'

Sempre que uma sequência de texto é preparada para renderização, o operador real responsável por isso é denominado Tj ou TJ .

Fique atento a tudo isso. Substitua-os por tJ e tj . Isso os transformará em "no-ops": eles não têm nenhum significado no código-fonte do PDF; nenhum visualizador ou processador de PDF os "entenderá". (Tenha cuidado para não alterar o número de bytes ao substituir o material no código-fonte do PDF, porque senão você pode fazer com que ele se torne "corrompido".)

Salve o arquivo PDF.

4. Verifique como o arquivo PDF está agora

O PDF deve agora parecer "limpo" novamente. Os operadores de texto renomeados não têm mais nenhum significado para o visualizador de PDF nem para qualquer interpretador de PDF.

5. Use o Ghostscript para criar o PDF final

Este comando deve alcançar o que você deseja:

gs                        \
  -o final.pdf            \
  -sDEVICE=pdfwrite       \
  -dPDFSETTINGS=/prepress \
   editable.pdf

Esta etapa final usa editable.pdf como entrada. Emite final.pdf . A saída terá removido todos os vestígios de texto. A entrada ainda tinha o texto, embora de forma "inutilizável", porque o operador renomeia. Como o Ghostscript não "entende" os operadores renomeados, ele simplesmente os ignorará por padrão.

    
por 28.01.2015 / 21:02
3

Existem várias maneiras de se livrar do texto oculto no arquivo.

  1. Exporte as imagens digitalizadas do PDF e recombine-as. Você pode usar pdfimages para a extração (do poppler-utils package) e convert (do imagemagick ) para convertê-los de volta:

    pdfimages toc.pdf toctmp
    convert toctmp*.pbm newtoc.pdf
    
  2. Imprimir para PDF (com suporte a PDF de cups-pdf )

O PDF é um formato horrível para imagens digitalizadas, mas bastante usado porque pode incluir várias páginas em um arquivo. No entanto, o formato de armazenamento é o formato JPEG inadequado (para digitalizações). Recuperar as imagens originais (não existe o arquivo PDF digitalizado original) do PDF provavelmente não pode ser feito, pois fazer o PDF a partir das imagens digitalizadas é, na maioria das vezes, a etapa de redução da qualidade após a digitalização. Você pode tentar tirar as imagens do PDF com pdfimage (ou pdftoppm ), mas o software OCR que funciona em imagens em PDF já sabe como obter as melhores (apenas) imagens de qualidade desses PDFs, é improvável algo que você pode fazer para melhorar isso.

O problema provavelmente está no software de digitalização, não no software de OCR. Se você ainda tiver o material original, digitalize-o mais para TIFF de várias páginas (lzw compactado) que oferece um OCR muito melhor do que qualquer coisa que tenha sido convertida em PDF quando isso inclui JPEG.

    
por 07.12.2014 / 13:43
3

Quando tentei acessar o link para o arquivo digitalizado de amostra antes, não funcionou para mim. No entanto, enquanto isso eu baixei, e dei uma olhada mais de perto.

1. Usando pdfimages -list para investigar as imagens incorporadas

Se você executar uma versão recente (!) da variante Poppler de pdfimages , você terá o parâmetro -list disponível. Este parâmetro imprime uma lista útil de imagens contidas no seu arquivo PDF. As versões mais recentes do mais também lhe dirão algumas informações adicionais (como a resolução da imagem e a taxa de compressão), que não estavam tão facilmente disponíveis antes.

Infelizmente, seu arquivo PDF contém alguns erros de sintaxe, que fornecem essa saída distorcida:

kp@mbp:#175536> pdfimages -l 1 -list toc.pdf
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image  2000  2650  icc     1   1  jbig2  no       51 0   300   300 12.4K 1.9%

Então, vamos redirecionar <stderr> output para /dev/null e tentar novamente:

kp@mbp:#175536> pdfimages -list toc.pdf 2>/dev/null
page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
   1   0 image  2000  2650  icc     1   1  jbig2  no       51 0   300   300 12.4K 1.9%
   2   1 image  2012  2659  icc     1   1  jbig2  no      616 0   300   301 16.1K 2.5%
   3   2 image  2014  2661  icc     1   1  jbig2  no      696 0   301   300 16.0K 2.4%
   4   3 image  2000  2650  icc     1   1  jbig2  no      778 0   300   300 16.2K 2.5%
   5   4 image  2000  2650  icc     1   1  jbig2  no      855 0   300   300 16.2K 2.5%
   6   5 image  2000  2650  icc     1   1  jbig2  no      938 0   300   300 15.7K 2.4%
   7   6 image  2000  2650  icc     1   1  jbig2  no     1026 0   300   300 15.5K 2.4%
   8   7 image  2022  2667  icc     1   1  jbig2  no     1103 0   300   300 15.7K 2.4%
   9   8 image  2000  2650  icc     1   1  jbig2  no     1190 0   300   300 15.5K 2.4%
  10   9 image  2011  2658  icc     1   1  jbig2  no     1271 0   300   301 15.7K 2.4%
  11  10 image  2000  2650  icc     1   1  jbig2  no     1347 0   300   300 15.7K 2.4%
  12  11 image  2010  2657  icc     1   1  jbig2  no     1429 0   300   300 15.5K 2.4%
  13  12 image  2000  2650  icc     1   1  jbig2  no     1504 0   300   300 16.8K 2.6%
  14  13 image  2000  2650  icc     1   1  jbig2  no     1589 0   300   300 15.4K 2.4%
  15  14 image  2000  2650  icc     1   1  jbig2  no     1666 0   300   300 17.6K 2.7%
  16  15 image  2010  2657  icc     1   1  jbig2  no     1740 0   300   300 18.7K 2.9%
  17  16 image  2006  2654  icc     1   1  jbig2  no     1823 0   300   301 17.7K 2.7%
  18  17 image  2007  2656  icc     1   1  jbig2  no     1905 0   300   300 16.9K 2.6%
  19  18 image  2000  2650  icc     1   1  jbig2  no     1983 0   300   300 16.7K 2.6%
  20  19 image  2000  2650  icc     1   1  jbig2  no     2065 0   300   300 17.4K 2.7%
  21  20 image  2000  2650  icc     1   1  jbig2  no     2148 0   300   300 17.4K 2.7%
  22  21 image  2011  2658  icc     1   1  jbig2  no     2229 0   300   301 17.2K 2.6%
  23  22 image  2006  2654  icc     1   1  jbig2  no     2305 0   300   301 17.5K 2.7%
  24  23 image  2000  2650  icc     1   1  jbig2  no     2377 0   300   300 14.5K 2.2%

Esta saída significa:

  • 24 imagens (numeradas 0--23) em 24 páginas (cada página 1 imagem).
  • Todas as imagens têm dimensões muito semelhantes (largura / altura) e uma resolução de 300 PPI.
  • Todas as imagens usam o mesmo método de compactação, JBIG2 .

Esses resultados me dão confiança para sugerir um método diferente para remover o texto de OCR do seu PDF:

  1. Extraia todas as imagens.
  2. Crie um novo PDF a partir dessas imagens.

2. Extraia todas as imagens do PDF

Se você tiver uma das versões mais recentes do Poppler de pdfimages , poderá extrair as imagens na compactação JBIG2:

pdfimages -jbig2 toc.pdf toc--

Os arquivos de imagem resultantes conterão os nomes dos arquivos toc---000.jb2e , toc---000.jb2e , ... (sufixo .jb2e ). Cada um desses arquivos deve ter outro, chamado toc---000.jb2g , toc---000.jb2g , ... (sufixo .jb2g ).

Se você não obtiver .jb2e images como resultado, mas .pbm , será necessário usar o recurso de conversão do ImageMagick para criar JPEGs:

for i in toc--*.pbm; do
  convert $i ${i/.pbm/.jpg}
done

No entanto, as imagens JPEG serão muito maiores que as do JBIG2. (Eu tentei: JPEGs são no total 15 MByte, PBMs são no total 15 MBytes, JBIG2 são no total 436 kBytes para as 24 imagens!)

3. Crie um novo PDF a partir das imagens extraídas

Se você teve azar e precisou converter para JPEG, agora é possível convertê-los em um PDF:

convert toc--*.jpg -density out.pdf

Voila !, agora você tem um arquivo PDF de 15 MBytes sem o texto em OCR-ed, onde antes tinha um arquivo PDF de 1,6 MByte com texto de OCR-ed! (Mas você não terá perdido muito da qualidade anterior ...)

Como meu próprio pdfimages é compilado de fontes, de vez em quando sofro de um bug com ele. No momento, ele não extrai imagens corretamente como arquivos JBIG2. É por isso que não consigo criar um PDF deles também. Mas o tamanho desse PDF seria semelhante ao tamanho original do toc.pdf ....

    
por 29.01.2015 / 00:28
0

A melhor maneira que encontrei para PDFs de qualidade e de várias camadas é usar inkscape e img2pdf . Eu fiz este rápido script bash :

#!/bin/bash
mkdir "$1_temp"
cp "$1" "$1_temp"/to_do.pdf
cd "$1_temp"
pdftk to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png
rm *.pdf
ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 - {}.jpg
rm *.pdf
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
rm *.jpg
pdftk *.pdf cat output combined.pdf
    
por 08.02.2018 / 01:02