Контейнер PDF позволяет встроить в документ полный файл JPEG (включая заголовок и все остальное). Но даже если JPEG, хранящийся в PDF-файле, побитно идентичен исходному файлу, он будет отображаться немного иначе, чем исходный JPEG. Я хочу знать, почему это так, и как сделать так, чтобы JPEG в PDF отображал точно так же, как исходный файл JPEG. Вот как воспроизвести мои выводы:
Настраивать
Возьмите это тестовое изображение (md5sum: 5085774e481966b3359df0745c57daca
)
curl https://i.stack.imgur.com/fRHo8.jpg > test.jpg
И поместите его в контейнер pdf. Вы можете использовать инструмент img2pdf
img2pdf --producer="" --nodate test.jpg > test.pdf
или вы можете использовать это представление PDF-файла в формате gzip base64:
H4sICHImeFsAA291dC5wZGYAlVZ7PFT7Fp8xM8yMPMYrFDbK4wgzxgw5Ut6mkWEMyqMaY8cwZsxD
Ht2euKfI60QkeVPqFJEi1emirh6SmLx6EQp5HKXELWePHrqf7j93ffZn77W/67u+a63fP7+11tPJ
xZRgRsSuHXzZ3oklAHiAFxyOtbW1s8OC3BCJb/EdM/dkhoJCgAgBdMCcERcFAuaOTBGTwwtdphOX
6Y68aK4IIADmVHaIEAiwlOQFfUtc0lpOs/wxjSsCuSIhQPpSaAsYwmY68GKBADwEWJKgJ0iSL4BI
35qhg0JetIAFCrEAAElspQWHgyyRxKVE4gGyhGQH2Y/Fl2uTlmu7g9xQURhgaQ1FhSIByIzE8rGW
JDM8ZMCX8l/9//qwIrFLhZx4WC+J6tfUr/rkZX0HtkjoCQoceZFRPK6kf2voCHkcnsA7ismCGnMC
d7NZIN3VATB3YXNEoACCHBlOIIsXAkXdQHZomAgakYwHvrVKsFoP/XhHB4uWJqNEQqN9G/PbMZj7
sUMgKhm/PNViz2I/zBGGkJKY5I2ADCmNlBhaWholjUFjsRg0BoNdobACKysvi8HI4eTkFRQVcYrY
FUrKSorKkK8oEYFLMhFINJSoKIuRVfy/bfEmDIeG2cJsEXAcTAoHR+Dgiy0wLRhMCo6Cw2HfTVoG
LYVAojAwSdhMEQZHIOFwNByB+hKGQ0EYShono4tWUlYh2Hsx9VSLO/Tp/IP/gvir4TApBBz+g54M
GomShkNHAEUNcDA4UgqS+k6Q0JESNSVdZRU9gr2FqtdiH2wFAsJxCBxsI2zYJy4uiJlkW52VOvmn
QmwY3eTm6NO+Lmb6AN3wAyPAZqMPRWjUs9/LMbDDsHWa6nVpuwWFE5O54IM80dl+KEU0T3/UfsxX
rj+V0Yc9yXtfqfo2vwDjo1FwPDeXqpnTnb93QZhoXAM7bxqQmhtrv27kCpk0ZG2qd5DSUflipsZM
6/ShG35+Kw/0iuNE8pvNmjkF++jkU6liM4/2suYmg7A583ccq4zC3Nmkw/yOituzfzk2Ht9hkiys
u75P09Nq8ModUL9oi+/vU+Jazrqwl0nUh/QZN9OpT34njZkLOzBjt0zcoqhPxlUcj5p21XW79l2q
zz8oD8vCjUlXqjy86oJMbnQihFQiI1wO+wzNamJptSptlHtqKApj7DKdUW0yutoja1q8kD6/+rSh
Sp9tjOLmiCmD0vC56a6Wd5datDG0HvW3KWxjhw3OsaImwbNXJBI+KISfGLBzsLFugD3NWpcwu9U0
h3FMqWnQLhv8VHKdMCNgBfxqHaQdZtx6d9V8kcEOlvpH2cCLl+OPILRuCjSGzB58UD/e7auvXFYY
PqkjTKZsGg4lBogjfPK1GRrD6wwik0dmApmbUDrhO6s13CZa0MbevRbZE/58JhUEyjIi6AomNmgT
VviRwXr5M8XlEaGG+CGjWtro6f3qrbuU24r9tbPaGI9enAvU7vIcHWky6ZHj0/tTOOg7a/F9uGfI
5Huher/paEyfGF+1mt85Jf8f76rkem6/0rPO9lsed+3H8rZZrd+WMbkTE99nhanIrUtz39az96ry
js60A7C5suYzVxtzg0ykbrvmHXe8l599LYVX91FmG78sGhnvqX0stCo0fa5m1e6esMe264UvL9HU
muvjTmTmrhqLxwaLri0MTLCSd/zCs6DtqXvwyZO7kPqr9Ot3PIWgTnc5atPWhMySNErtze6ZyouW
lvKVD0Z9NySdj5G9UuBVnicYaHXIiC5133OuriOq4eidG0eLJ37h7abeKb1uZxNyRgs3vimtxEvI
ignvGYovnjg7L1gvalS7a3q+3x/D1/9L5WyI0eZRmq7cyPOzvXxhwR+gxh8GJVVXB2Oq8lZNzE81
nB18UVkVja3bXdBtNHpqeDx/vt9hXontenfgJL3zGnCh/9rGtff8/7HmBl9VeaJq7oBWWdcTxj81
XNHRafWLMJFW+9ihJwkhzGsldAeZqk+WTcyJ+i62+3up8af2v2UVXbTLLJssvJA9rP7wsdLhnBPz
R3r9PJ2J1W5r0jMqV6PpOrUXvOeDxFk5e/7M+FA8Mpo+O2CYaP60H5/YkCRaqXZfJzOSveWG22R6
vH+N9ci/dScxEQ2nGnwdng2euz6kFAjaexTS8lS5b5t9Sw8dIPpyCo8lbw9cY9zNKDfZy17TU8F5
nO9fQXa1jbM/cUucSz6dVXdwLi8h5cLoLpjJG1M/GrMIhap9cySnJo6Klalq761QxrldLnVgV1u/
IqdIuQWMqKnZdOLOvDG77fHcqDBYezq56MlJf5cu4wbxB//3g2HC7BWzKZtJzRa1YEH/65hNuCn/
+0l3u5l2DvdHCPtm9B6p3BtME125oOw1THUD4GJGPU9aU7edSd3XWebeS+3perQn09S7H9Xg1qHz
lLLS870xZ30HgalR1Y6oN3XMOToiliu3rjR6bReGDKNxt8f6kfDH7r9AMPgj+0LTzkw5pwBah2w0
9cc1mxMSnuFyPDoLtNdkGKXGtmqdjNptH/XZdSSVVHnZqNkbQ09gJhITbTEy5QG3Z5pb/ZCCWn23
aGSMT4AtOfipYIOV0SOXzveXt9B+L3Q1OiLflvlubsrzFEKhx4lsWzEr1/IxLnkLk8w5f85dz09w
1pxl4m4X6X7OVQ+khMGj7Ar3t8FqeuYMM3KSkq9UPTT7rKbtXDg0ZVHU8Krq4+dw03XOLo0ZYkOd
gyXdUupZcajBAZJYQyE7+ny5TUfL88NOmqq6SaXVujMen8LbAuFNi70/39GxAnAXFg9YYfHfDSCT
SEQSsEvuO0aANoWlCHcZI/4PzNriJ4xAtPoJsyATfsKIpB94IgGTzQEFWMnmQOHu4gGEr9sOjycC
LL743ux4ELBautiZAtHSGBZEArTQrXWmuWD/BrnwaYrgCQAA
Превратите его в исходную форму, скопировав base64 в текстовый файл и запустив:
$ base64 -d test.txt | gzip -cd > test.pdf
md5 сумма окончательного PDF: 156994ee6590ef8421fad1325378906d
Вероятно, решающая часть:
6 0 obj
<</BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height
60 /Length 1790 /Subtype /Image /Type /XObject /Width 60>>
stream
Глядя на него в программе просмотра PDF-файлов, вы увидите исходное изображение. По крайней мере, вы так думаете, но есть небольшие отличия, которые мы сейчас раскроем. Чтобы проверить, как отображается PDF-файл, мы используем три разных механизма рендеринга, чтобы убедиться, что это систематическая ошибка, а не проблема с конкретным механизмом рендеринга.
Призрачный сценарий
$ gs -dNOPAUSE -dBATCH -sDEVICE=png16m -r96 -sOutputFile=gs.png test.pdf
поплер
Мы используем инструмент pdftocairo
из пакета poppler-utils
в Debian и производных.
$ 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
Давайте визуализируем различия:
Можно подумать, что некоторые данные, вероятно, были изменены, когда мы встраивали test.jpg
в контейнер PDF, поэтому давайте извлечем JPEG из PDF:
$ 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
Вывод
Таким образом, очевидно, что JPEG, встроенный в файл PDF, побитно совпадает с исходным JPEG. Тем не менее, рендеринг PDF дает несколько иной результат, чем ввод. Более того: три разных движка PDF дают одинаковую разницу.
Это почему?
Как сделать так, чтобы PDF-файл отображался точно так же, как входной JPEG?
djpeg -dct int
,djpeg -dct fast
иdjpeg -dct float
- person   schedule 18.08.2018djpeg
не смог точно воспроизвести декодирование gs / poppler / mupdf, ноjpegtopnm
смог это сделать. Вариант-dct int
сработал. Как ни странно,djpeg
иjpegtopnm
дают разные результаты с этой опцией ... - person josch   schedule 19.08.2018