Имеют ли размеры PDF смысл в пикселях?
Я тестировал два способа измерения размеров PDF-файлов в пикселях с помощью двух модулей Python - Wand (привязки ImageMagick) и GDAL.
Получение размеров этого PDF возвращает совершенно разные результаты с каждым модулем:
- Жезл сообщает 556x748
- GDAL сообщает 2317x3117.
Является ли один из них "неправильным"? Если я правильно понимаю, размеры PDF в пикселях зависят от устройства - однако, два результата используют одно и то же устройство отображения.
Существуют ли другие факторы, которые могут повлиять на расчет размера PDF в пикселях?
1 ответ
"Wand" и "GDAL" не предназначены для обработки PDF-файлов
Если вы используете Wand (привязки ImageMagick) для обработки PDF-файлов, вы не используете ImageMagick, как вы можете себе представить.
Поскольку ImageMagick не может обрабатывать PDF-файлы самостоятельно - он обрабатывает только растровые изображения.
Для других форматов IM должен полагаться на "делегатов". Делегаты ImageMagick - это внешние сторонние утилиты, которые запускаются ImageMagick для преобразования "чужих" форматов файлов в растровые изображения, которые затем передаются в ImageMagick для дальнейшей работы.
Поэтому, даже если вы хотите определить размеры страниц PDF только с помощью ImageMagick, это не такой простой процесс, как хотелось бы:
Вызовите Ghostscript для рендеринга страниц PDF в растровое изображение. (Знаете ли вы, какое разрешение Ghostscript будет использовать для создания растров?!?)
Запустите команду ImageMagick, чтобы вернуть размеры созданных GS растровых изображений в "пикселях".
Для возврата результатов может потребоваться очень много времени, и результаты зависят от разрешения, выбранного при растеризации страниц PDF.
Это неподходящий инструмент для работы...
(То же самое, что и выше, в основном верно для GDAL, даже если он не использует Ghostscript для растеризации. Но знаете ли вы, какое разрешение по умолчанию GDAL использует при преобразовании векторных PDF-страниц в растр?!?)
Используйте правильный инструмент для работы
PDF-файлы хранят размеры всех страниц в "словаре" с ключом /MediaBox
, Этот ключ ДОЛЖЕН присутствовать во всех допустимых файлах PDF.
Имейте в виду, что PDF-файлы также знают (необязательно) концепции /CropBox
, /ArtBox
, /TrimBox
а также /BleedBox
, /CropBox
значение ключа, если оно присутствует, может заставить программу просмотра PDF скрывать части всей страницы и отображать только ее окно меньшего размера (при печати или просмотре).
Один инструмент командной строки для определения размеров страницы PDF pdfinfo
, Эта утилита основана на библиотеке Poppler - поэтому, если вы не хотите запускать внешнюю команду, привяжите свое собственное приложение к этой библиотеке.
pdfinfo
намного быстрее:
Он не должен отображать, растеризовывать или полностью интерпретировать PDF-файл.
Он просто выполняет (очень быстрый) поиск словарных записей для измерений.
Эти размеры возвращаются в пунктах. Это устройство происходит из мира PostScript: 72 точки эквивалентны 1 дюйму. Так что при разрешении 72 DPI/PPI он также покажет вам "размеры в пикселях"...
Пример (используя связанный PDF из OP)
Я бегу pdfinfo
команда для вашего связанного примера PDF, чтобы определить размеры диапазона страниц 116-117 (используя -f
для первого и -l
для последних страниц диапазона). Команда выполняется за доли секунды:
Вот результаты:
pdfinfo -f 116 -l 117 -box soils-of-manawatu-county-soil-survey-report-30.pdf
Title:
Subject:
Keywords:
Author:
Creator: ABBYY FineReader
Producer:
CreationDate: Tue Dec 18 19:11:50 2007
ModDate: Tue Dec 18 19:11:50 2007
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 117
Encrypted: no
Page 116 size: 957 x 751 pts
Page 116 rot: 0
Page 117 size: 2065 x 2249 pts
Page 117 rot: 0
Page 116 MediaBox: 0.00 0.00 957.00 751.00
Page 116 CropBox: 0.00 0.00 957.00 751.00
Page 116 BleedBox: 0.00 0.00 957.00 751.00
Page 116 TrimBox: 0.00 0.00 957.00 751.00
Page 116 ArtBox: 0.00 0.00 957.00 751.00
Page 117 MediaBox: 0.00 0.00 2065.00 2249.00
Page 117 CropBox: 0.00 0.00 2065.00 2249.00
Page 117 BleedBox: 0.00 0.00 2065.00 2249.00
Page 117 TrimBox: 0.00 0.00 2065.00 2249.00
Page 117 ArtBox: 0.00 0.00 2065.00 2249.00
File size: 2105582 bytes
Optimized: yes
PDF version: 1.2
Как видите, у вашего PDF нет даже идентичных размеров страницы для каждой из 117 страниц!
Теперь давайте попробуем то же самое с командой ImageMagick: ([1])
identify \
-format "%W x %H\n" \
soils-of-manawatu-county-soil-survey-report-30.pdf[115-116]
([1] Примечание: метод нумерации страниц ImageMagick начинается с нуля {первая страница имеет номер '0'} - следовательно, [115-116]
диапазон для страниц 116-117.)
Это займет 6 секунд и вернется:
957 x 751
2065 x 2249
Мне здесь повезло, потому что Ghostscript, похоже, был запущен с параметром разрешения, равным -r72x72
,
Я видел случаи, когда ImageMagick был настроен для использования -r75x75
- что, конечно, будет возвращать разные значения!
Пример использования другого PDF
Следующие примеры сделаны с PDF-файлом, представляющим руководство пользователя для камеры IXUS 850 IS, которое можно найти в Интернете. Я получу информацию только для первых 3 страниц:
pdfinfo -box -l 3 _IXUS_850IS_ADVCUG_EN.pdf
Creator: FrameMaker 6.0
Producer: Acrobat Distiller 5.0.5 (Windows)
CreationDate: Thu Aug 17 16:43:06 2006
ModDate: Tue Aug 22 12:20:24 2006
Tagged: no
UserProperties: no
Suspects: no
Form: AcroForm
JavaScript: no
Pages: 146
Encrypted: no
Page 1 size: 419.535 x 297.644 pts
Page 1 rot: 90
Page 2 size: 297.646 x 419.524 pts
Page 2 rot: 0
Page 3 size: 297.646 x 419.524 pts
Page 3 rot: 0
Page 1 MediaBox: 0.00 0.00 595.00 842.00
Page 1 CropBox: 87.25 430.36 506.79 728.00
Page 1 BleedBox: 87.25 430.36 506.79 728.00
Page 1 TrimBox: 87.25 430.36 506.79 728.00
Page 1 ArtBox: 87.25 430.36 506.79 728.00
Page 2 MediaBox: 0.00 0.00 595.00 842.00
Page 2 CropBox: 148.17 210.76 445.81 630.28
Page 2 BleedBox: 148.17 210.76 445.81 630.28
Page 2 TrimBox: 148.17 210.76 445.81 630.28
Page 2 ArtBox: 148.17 210.76 445.81 630.28
Page 3 MediaBox: 0.00 0.00 595.00 842.00
Page 3 CropBox: 148.17 210.76 445.81 630.28
Page 3 BleedBox: 148.17 210.76 445.81 630.28
Page 3 TrimBox: 148.17 210.76 445.81 630.28
Page 3 ArtBox: 148.17 210.76 445.81 630.28
File size: 6888764 bytes
Optimized: yes
PDF version: 1.4
Как видно из вывода, все три размера страницы (" /MediaBox
") являются 595 x 842 pts
(== А4), но разные /CropBox
Записи ограничивают видимые части страниц для просмотра портов следующих размеров:
- Страница 1:
419.535 x 297.644 pts
- Страница 2:
297.646 x 419.524 pts
- Страница 3:
297.646 x 419.524 pts
Кроме того, первая страница поворачивается на 90 градусов (как видно из строки, говорящей Page 1 rot: 90
).
Теперь давайте сравним, что возвращает моя команда ImageMagick ([2]):
identify -format "%W x %H\n" _IXUS_850IS_ADVCUG_EN.pdf[0-2]
842 x 595
595 x 842
595 x 842
([2] Примечание: IM в моей системе - версия 6.9.0-0 Q16, в которой в качестве делегата используется Ghostscript v9.10. Если вы тестируете то же самое в другой системе с другими версиями IM/GS, ваш выходной может быть разным!)
Таким образом, последний пример может ответить на вопрос: "Есть ли другие факторы, которые могут повлиять на вычисление размера PDF в пикселях?" часть вопроса ОП.