Имеют ли размеры 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, это не такой простой процесс, как хотелось бы:

  1. Вызовите Ghostscript для рендеринга страниц PDF в растровое изображение. (Знаете ли вы, какое разрешение Ghostscript будет использовать для создания растров?!?)

  2. Запустите команду ImageMagick, чтобы вернуть размеры созданных GS растровых изображений в "пикселях".

Для возврата результатов может потребоваться очень много времени, и результаты зависят от разрешения, выбранного при растеризации страниц PDF.

Это неподходящий инструмент для работы...

(То же самое, что и выше, в основном верно для GDAL, даже если он не использует Ghostscript для растеризации. Но знаете ли вы, какое разрешение по умолчанию GDAL использует при преобразовании векторных PDF-страниц в растр?!?)

Используйте правильный инструмент для работы

PDF-файлы хранят размеры всех страниц в "словаре" с ключом /MediaBox, Этот ключ ДОЛЖЕН присутствовать во всех допустимых файлах PDF.

Имейте в виду, что PDF-файлы также знают (необязательно) концепции /CropBox, /ArtBox, /TrimBox а также /BleedBox, /CropBox значение ключа, если оно присутствует, может заставить программу просмотра PDF скрывать части всей страницы и отображать только ее окно меньшего размера (при печати или просмотре).

Один инструмент командной строки для определения размеров страницы PDF pdfinfo, Эта утилита основана на библиотеке Poppler - поэтому, если вы не хотите запускать внешнюю команду, привяжите свое собственное приложение к этой библиотеке.

pdfinfo намного быстрее:

  1. Он не должен отображать, растеризовывать или полностью интерпретировать PDF-файл.

  2. Он просто выполняет (очень быстрый) поиск словарных записей для измерений.

  3. Эти размеры возвращаются в пунктах. Это устройство происходит из мира 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. Страница 1: 419.535 x 297.644 pts
  2. Страница 2: 297.646 x 419.524 pts
  3. Страница 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 в пикселях?" часть вопроса ОП.

Другие вопросы по тегам