Por que as imagens produzidas por pdfimages são diferentes ao usar o sinalizador -all?

3

Entendo que pdfimages -all extrai imagens de PDFs em seus formatos nativos.

Portanto, esperava-se que as imagens JPG (com perdas) extraídas desse comando tivessem as mesmas informações de pixel dos arquivos .ppm e .pbm produzidos sem a opção -all , bem como os arquivos PNG (sem perda) criados quando clico com o botão direito do mouse e salvo a imagem no Evince.

No entanto, meu uso do comando ImageMagick compare me diz que há diferenças nas imagens contidas nos arquivos JPG em comparação com as outras opções acima. Para reproduzir, faça o download do PDF neste link ( link ), use-o como um argumento para pdfimages e pdfimages -all e use o primeiro arquivo .ppm e o primeiro arquivo .jpg como argumentos para compare . Quando faço isso, produz um arquivo de imagem contendo vermelho para indicar uma diferença nas imagens.

Existe algo que eu não entendo? Por padrão, pdfimages está adicionando informações de pixel quando cria arquivos .ppm e .pbm?

    
por Orion751 24.05.2016 / 07:51

1 resposta

3

pdfimages -all retorna o arquivo exato que foi armazenado no pdf.

Podemos testar isso fazendo uma viagem de ida e volta: começando com uma imagem jpg, adicionamos a um pdf usando o LaTeX, extraí-lo usando pdfimages -all e, em seguida, comparamos com o original. (A razão para usar o LaTeX será explicada mais adiante).

Eu tenho a primeira imagem jpg extraída do seu link e a nomeei device.jpg . Vamos colocar em um arquivo PDF usando o LaTeX:

$ cat img.tex 
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[width=5in,keepaspectratio]{device}
\end{document}
$ pdflatex img
[...snip...]
Output written on img.pdf (1 page, 672455 bytes).
Transcript written on img.log.

Agora, vamos extraí-lo usando pdfimages -all e compará-lo com o original:

$ pdfimages -all img.pdf img-all
$ cmp device.jpg img-all-000.jpg 
$

O jpg extraído é byte-by-byte idêntico ao original.

Nota de rodapé: o motivo para usar o LaTeX

O teste acima não pode ser feito usando apenas qualquer criador de PDF. Isso porque nem todos os criadores de PDF colocarão as imagens em um PDF sem serem importunadas. Por exemplo, vamos tentar o convert :

do ImageMagick
$ convert device.jpg device.pdf
$ pdfimages -all device.pdf device-all
$ cmp device.jpg device-all-000.jpg 
device.jpg device-all-000.jpg differ: byte 4, line 1

convert re-amostrou a imagem para um tamanho menor antes de colocá-la no pdf.

$ ls -1s device.jpg device-all-000.jpg 
528 device-all-000.jpg
656 device.jpg

A precisão da imagem fazia parte dos objetivos de design do pdflatex. Outro software de criação de PDF pode, por padrão, "otimizar" as imagens antes de colocá-las no PDF.

    
por John1024 27.05.2016 / 21:40