Вопрос или проблема
Давайте возьмем лист бумаги формата DIN A4 в формате PNG с https://www.a4-size.com/download/335/?tmstv=1739899566. После распаковки полученного архива мы получим a4-size-portrait-pixels-600dpi.png. Давайте изучим его:
$ exiftool a4-size-portrait-pixels-600dpi.png
ExifTool Version Number : 12.57
File Name : a4-size-portrait-pixels-600dpi.png
Directory : .
File Size : 5.2 kB
File Modification Date/Time : 2020:08:28 10:46:09+02:00
File Access Date/Time : 2025:02:18 18:47:15+01:00
File Inode Change Date/Time : 2025:02:18 18:43:03+01:00
File Permissions : -rw-r--r--
File Type : PNG
File Type Extension : png
MIME Type : image/png
Image Width : 4961
Image Height : 7016
Bit Depth : 1
Color Type : Palette
Compression : Deflate/Inflate
Filter : Adaptive
Interlace : Noninterlaced
Palette : 255 255 255
Image Size : 4961x7016
Megapixels : 34.8
Как видим, теги разрешения/плотности отсутствуют. Давайте добавим их, используя https://unix.stackexchange.com/a/791125:
$ dpi=600 && exiftool -o a4-size-portrait-pixels-600dpi.exiftool.png -XResolution=$dpi -YResolution=$dpi -ResolutionUnit=inches -PixelsPerUnitX=$(( dpi * 10000 / 254 )) -PixelsPerUnitY="$(( dpi * 10000 / 254 ))" -PixelUnits=meters a4-size-portrait-pixels-600dpi.png
1 image files created
Но теперь:
$ convert a4-size-portrait-pixels-600dpi.exiftool.png -density 600 a4-size-portrait-pixels-600dpi.exiftool.convert.pdf
$ pdfinfo a4-size-portrait-pixels-600dpi.exiftool.convert.pdf
Title: a4-size-portrait-pixels-600dpi.exiftool.convert
Producer: https://imagemagick.org
CreationDate: Tue Feb 18 18:55:03 2025 CET
ModDate: Tue Feb 18 18:55:03 2025 CET
Custom Metadata: no
Metadata Stream: no
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 1
Encrypted: no
Page size: 234.378 x 331.465 pts
Page rot: 0
File size: 35775 bytes
Optimized: no
PDF version: 1.3
Как видим, размер страницы неверен. В постскриптных пунктах правильный размер должен был быть 595 × 842 pts.
Что здесь происходит? Мы слишком много используем exiftool+convert, или convert просто ошибается?
Мы можем предположить, что нам не нужно указывать плотность/разрешение в цепочке инструментов более одного раза. Однако (в идеальном мире) вы должны иметь возможность сколько угодно раз указывать, насколько большой у вас пиксель или точка (в нашем случае 1/600 дюйма в ширину и 1/600 дюйма в высоту) для любого инструмента в цепочке.
Ответ на ваш вопрос должен быть НЕТ. Это потому, что в указанном png-файле отсутствует информация о разрешении или плотности. Вы должны заметить, что в вашем выводе exiftool
это не указано. Формат png это позволяет, но в основном только для указания, если ваши пиксели не квадратные.
Я подозреваю, что либо:
- вы неправильно задали параметры
convert
. - вы неправильно интерпретировали вывод
pdfinfo
. convert
неправильно обработал параметры.
Я подозреваю первое. Не стоит указывать это дважды.
Ответ или решение
Как ИТ-эксперт, я хотел бы предложить детальный анализ возникшей проблемы с использованием ImageMagick и PNG-файлов в связке с метаданными разрешения и плотности.
Теория
Формат PNG хотя и поддерживает метаданные разрешения, в действительности, большинство PNG-файлов не содержит этой информации, поскольку основное назначение формата заключает в себе хранение растровых данных с минимальной сжатием и потерей качества. Следовательно, если PNG-файл изначально не содержит данных о разрешении, любой инструмент, включая convert
из ImageMagick, может испытывать трудности в правильной интерпретации физического размера изображения при преобразовании в форматы, где такие данные необходимы, например PDF.
Пример
Рассмотрим шаги, описанные в вашем вопросе:
- Получение PNG-файла: Исходный PNG-файл загружен без метаданных разрешения.
- Использование ExifTool: С помощью команды
exiftool
вы добавили метаданные разрешения в ваш PNG-файл, включив параметры-XResolution
,-YResolution
и другие соответствующие ключи. - Использование Convert: После добавления информации о разрешении, вы преобразовали измененный PNG-файл в PDF, используя
convert
с флагом-density 600
.
Однако, несмотря на это, конечный PDF-файл имел неправильный размер страницы, выраженный в PostScript точках.
Применение
На основании этого примера можно сделать несколько выводов и рекомендаций:
-
Диагностика проблемы:
- Формат PNG, как правило, не занимается управлением метаданными разрешения, отсюда возможные проблемы с преобразованием в другие форматы, такие как PDF.
- ExifTool позволяет добавлять метаданные, но необходимо убедиться, что такие изменения корректно воспринимаются ImageMagick.
- Возникает необходимость в дополнительной проверке выходного файла, поскольку даже после видимой модификации, инструменты обработки изображений могут не учитывать корректировки.
-
Корректное использование инструментов:
- Во-первых, следует проверить параметры командной строки для
convert
: малейшая ошибка в параметрах может привести к неправильному результату. - Обратите внимание на использование флага
-density
вconvert
. Он должен интерпретироваться как инструкции к установке разрешения на файл, а не обязательно к изменению физического размера изображения. Может возникнуть конфликт между встроенными метаданными и явными параметрамиdensity
.
- Во-первых, следует проверить параметры командной строки для
-
Рекомендуемые действия:
- Убедитесь, что метаданные установлены корректно с использованием HexEditor или аналогичного инструмента, чтобы вручную проверить, как метаданные сохранены в PNG-файле.
- Повторите процедуру, но с иной последовательностью: установите разрешение в
convert
после загрузки файла, чтобы проверить, действительно ли проблема в компоновке инструментов. - Попробуйте есть ли ли такая же проблема при использовании других инструментов соответствия файлов, таких как Photoshop, GIMP и так далее, чтобы исключить возможность ошибки.
Завершая, основной проблемой, возможно, является дуэль между явно задаваемыми вами параметрами и встроенными методами интерпретации, которые используют различные инструменты в цепочке преобразования. Хотя каждый инструмент может предлагать отличные уровни совместимости с определённым типом файла, нередко необходимо перепроверить настройки и удостовериться, что метаданные правильно распознаются и интерпретируются на каждом из этапов обработки.