为什么嵌入PDF的JPEG渲染与原始渲染略有不同?

时间:2018-08-18 14:38:16

标签: pdf jpeg ghostscript mupdf poppler

PDF容器允许将完整的JPEG文件(包括标头和全部)嵌入到文档中。但是,即使存储在PDF中的JPEG与原始文件一点一点地相同,它的呈现也将与原始JPEG稍有不同。我想知道为什么会这样,以及如何使PDF中的JPEG完全像原始JPEG文件一样呈现。这是重现我的发现的方法:

设置

拍摄此测试图像(md5sum:5085774e481966b3359df0745c57daca

test image

curl https://i.stack.imgur.com/fRHo8.jpg > test.jpg

并将其放入pdf容器中。您可以使用工具img2pdf

img2pdf --producer="" --nodate test.jpg > test.pdf

或者您可以使用以下gzip压缩的base64表示形式的PDF:

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

通过将base64复制到文本文件中并运行,将其转换为原始格式:

$ base64 -d test.txt | gzip -cd > test.pdf
最终PDF的

md5sum:156994ee6590ef8421fad1325378906d

可能关键的部分:

6 0 obj
<</BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height
  60 /Length 1790 /Subtype /Image /Type /XObject /Width 60>>
stream

在PDF查看器中查看它会显示原始图像。至少您是这么想的,但是现在我们将揭示一些微小的差异。为了测试PDF的呈现方式,我们使用了三种不同的呈现引擎,以确保这是系统性错误,对于特定的呈现引擎而言可能不是问题

ghostscript

$ gs -dNOPAUSE -dBATCH -sDEVICE=png16m -r96 -sOutputFile=gs.png test.pdf

poppler

我们使用Debian及其衍生产品中pdftocairo软件包中的poppler-utils工具。

$ pdftocairo -r 96 -png test.pdf poppler

mupdf

$ mutool draw -o mupdf.png -r 96 test.pdf

评估

第一个观察结果:这三个工具都产生相同的PDF呈现。我们使用imagemagick进行比较。

$ compare -metric AE mupdf.png gs.png null:
0
$ compare -metric AE poppler-1.png mupdf.png null:
0
$ compare -metric AE gs.png poppler-1.png null:
0

现在我们将其与原始输入图像进行比较:

$ compare -metric AE mupdf.png test.jpg null:
105
$ compare -metric AE poppler-1.png test.jpg null:
105
$ compare -metric AE gs.png test.jpg null:
105

让我们看到差异:

mupdf diff poppler diff gs diff

人们可能会认为,当我们将test.jpg嵌入到PDF容器中时,某些数据可能已更改,因此让我们从PDF中提取JPEG:

$ pdfimages -j test.pdf extracted

pdfimages从PDF提取的数据与输入图像test.jpg完全相同:

$ cmp test.jpg extracted-000.jpg || echo different
$ md5sum extracted-000.jpg test.jpg
5085774e481966b3359df0745c57daca  extracted-000.jpg
5085774e481966b3359df0745c57daca  test.jpg

结论

因此,显然,PDF文件中嵌入的JPEG与原始JPEG一点一点相同。尽管如此,渲染PDF产生的结果与输入的结果略有不同。更是如此:三个不同的PDF引擎产生相同的差异。

那是为什么?

如何使PDF显示与输入的JPEG完全相同?

2 个答案:

答案 0 :(得分:2)

我猜想我想说ImageMagick使用的是与其他三个引擎不同的JPEG解码器,因为它们彼此同意。我知道Ghostscript和MuPDF使用jpeglib,不了解poppler。

所以您要说的不是PDF品种“错”只是“与比较(ImageMagick工具?)不一样”而又不是(IMO)一样。您也可以通过在lib目录中使用viewjpeg.ps来使Ghostscript呈现原始JPEG,我很确定MuPDF也可以直接呈现JPEG文件。我敢打赌,它们渲染JPEG的方式与处理包含JPEG的PDF方式相同。

JPEG是一种有损格式,它使用的离散余弦变换是一种数学变换(它使用高通和低通滤波器),我敢打赌,这仅仅是由于四舍五入关系从过滤后的数据重构样本时,我强烈怀疑您无法通过肉眼检测到任何差异。您是否查看了图像中相关位置的样本的RGB值?

我建议您尝试使用JPEG作为MuPDF和Ghostscript的直接输入(如果可以的话,请使用poppler)。我的期望是结果将与PDF的呈现相匹配。

在这种情况下,奇怪的鬃毛是谁?

答案 1 :(得分:0)

两者都是色彩空间sRGB。但是一个区别是您的test.jpg没有颜色配置文件。但是,至少在将Imagemagick转换为convert test.jpg test.pdf时,test.pdf具有sRGB.icc配置文件。即使数据是相同的,添加颜色配置文件通常也可以更改图像的显示,但是查看可能取决于查看器,并且即使它不存在还是忽略配置文件,sRGB配置文件是否仍假定为sRGB配置文件。我使用Imagemagick识别-verbose

test.jpg

 Properties:
    date:create: 2018-08-18T09:57:16-07:00
    date:modify: 2018-08-18T09:57:16-07:00
    jpeg:colorspace: 2
    jpeg:sampling-factor: 1x1,1x1,1x1
    signature: fa0b78710e2c79f1cc852e0ae805393ea96d1f51769beb9d1729ec330da71303
  Artifacts:
    filename: test.jpg
    verbose: true
  Tainted: False
  Filesize: 1790B
  Number pixels: 3600
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.9.10-10 Q16 x86_64 2018-08-14 https://www.imagemagick.org


test.pdf

 Properties:
    date:create: 2018-08-18T09:59:37-07:00
    date:modify: 2018-08-18T09:59:37-07:00
    icc:copyright: Copyright Artifex Software 2011
    icc:description: Artifex Software sRGB ICC Profile
    pdf:HiResBoundingBox: 60x60+0+0
    pdf:Version: PDF-1.3  1 0 obj << 
    signature: b3783659c15300ffb14e4da501db28afcc0e0b0060286effa74823327a24abd6
  Profiles:
    Profile-icc: 2576 bytes
  Artifacts:
    filename: test.pdf
    verbose: true
  Tainted: False
  Filesize: 8415B
  Number pixels: 3600
  Pixels per second: 360000B
  User time: 0.000u
  Elapsed time: 0:01.009
  Version: ImageMagick 6.9.10-10 Q16 x86_64 2018-08-14 https://www.imagemagick.org


在转换为PDF之前,请尝试将sRGB.icc配置文件添加到test.jpg文件。看看是否有帮助。