Como determinar programaticamente o DPI das imagens no arquivo PDF?

13

Eu tenho alguns arquivos PDF que eu quero dividir em arquivos TIFF usando convert(para OCR via tesseract). Até agora, isso está funcionando muito bem - exceto que, para automatizar todo o processo, preciso definir o DPI da convertsaída. No momento, estou usando um comando como este:

convert -density 300 myFile.pdf -depth 8 -background white output-%04d.tiff

... que gera os arquivos PDF em 300 DPI. No entanto, alguns arquivos PDF têm DPI mais baixo (por exemplo, 150 DPI), o que significa que eu não quero produzi-los a 300 DPI via convert- isso cria arquivos TIFF excessivamente grandes sem nenhuma informação adicional.

Sei que existem maneiras de verificar o DPI das imagens em um arquivo PDF, abrindo o Adobe Acrobat e mexendo nas ferramentas "preflight". No entanto, existe uma maneira de determinar, através da linha de comando, o DPI de um arquivo PDF específico?

Jason
fonte

Respostas:

9

Resposta principal

Como estou interessado no mesmo tipo de trabalho (embora não necessariamente oculte os arquivos PDF, mas os converta para DjVu e depois OCR), achei essa pergunta e as respostas ausentes (pois precisava adivinhar o DPI do imagens com o número de pixels e, em seguida, use o tamanho como saída pdfinfoou outros truques - sem mencionar que as imagens em um PDF podem ter densidades diferentes etc.).

Depois de muita pesquisa, descobri que você pode usar pdfimages(do pacote poppler-utils ) como o seguinte:

$ pdfimages -list deptest.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   1  image  no         9  0    53    53  169B  14%
   2     1 image     100   100  gray    1   1  ccitt  no   [inline]      53    53  698B  56%

Observe o x-ppie y-ppina lista acima. Ele também lista o formato em que as imagens são armazenadas no PDF, o que é legal (às vezes, é JBIG2, às vezes JPEG2000 etc.)

Nota: O arquivo deptest.pdfusado acima está disponível no pdfsizeoptrepositório .

A ação real

Depois disso, você pode simplesmente extrair as imagens consigo pdfimagesmesmo ou usar pdftoppm(também de poppler-utils) para renderizar páginas inteiras em vários formatos que desejar (por exemplo, tiff, para digitalizar tesseract).

Você pode usar algo como o seguinte (supondo que você tenha criado um diretório chamado imgsonde você colocará suas imagens):

pdfimages -png Faraway-PRA.pdf imgs/prefix

Os arquivos serão criados dentro do diretório imgscom nomes começando por prefix, como em:

$ ls 
prefix-000.png  prefix-047.png  prefix-094.png  prefix-141.png
prefix-001.png  prefix-048.png  prefix-095.png  prefix-142.png
prefix-002.png  prefix-049.png  prefix-096.png  prefix-143.png
prefix-003.png  prefix-050.png  prefix-097.png  prefix-144.png
(...)

Você pode, então, executar qualquer cirurgia que achar melhor com ferramentas como scantailorou o que quiser.

Resposta mais direta

Se você quiser apenas registrar um arquivo PDF em OCR, poderá usar um programa bem conservado e já empacotado, ou seja, ocrmypdf .

rbrito
fonte
Observe que x-ppi(resolução x em DPI) e y-ppi(resolução y em DPI) NÃO são mostradas nas versões mais antigas pdfimagesque acompanham o Ubuntu 14.04, por exemplo. O que está disponível no Ubuntu 18.04, no entanto, inclui esses valores. pdfimages -vem meus Ubuntu 18.04 mostra máquina eu tenho a versão 0.62.0, o que faz ter essas características.
Gabriel Staples
@ GabrielStaples, obrigado por apontar isso. Eu pensei que o Ubuntu 14.04 já tinha EOL'ed, mas "apenas" teve seu Suporte Padrão encerrado em julho de 2019, de acordo com wiki.ubuntu.com/Releases
rbrito 12/11/19
4

Eu precisava dessas informações e as encontrei aqui:

http://www.wizards-toolkit.org/discourse-server/viewtopic.php?t=16110

Essa técnica também usa o ImageMagick:

identify -format "%w x %h %x x %y" DAT_1.tif

A saída é o tamanho da imagem e o dpi:

2480 x 3507 300 x 300
excyberlabber
fonte
Eu adicionaria uma nova linha ao final do formato, caso você queira fazer * .pdf para processar todos os pdfs no diretório. "% wx% h% xx% y \ n"
Hatoru Hansou 06/04
2

Eu uso o seguinte comando:

convert MyPDF.pdf -print "Size: %wx%h\n" /dev/null

e retorna:

Size: 380x380
Mahdi
fonte
Obrigado - obtém o tamanho das imagens em pdf (no seu caso, 380x380, pois é um quadrado). O DPI é diferente. No meu arquivo que eu apenas corri este comando em, recebo Size: 595x842embora o DPI (check-in Acrobat) é de cerca de 130
Jason