разрешение из PDFPage? - PullRequest
       5

разрешение из PDFPage?

0 голосов
/ 11 августа 2010

У меня есть документ PDF, созданный путем создания NSImages с размером в 72 точки на дюйм, каждый из которых имеет одно представление, которое измеряется в пикселях.Затем я помещаю эти изображения в PDFPages с помощью initWithImage, а затем сохраняю документ.

Когда я открываю документ, мне нужно разрешение исходного изображения.Однако все прямоугольники, которые дает мне PDFPage, измеряются в точках, а не в пикселях.

Я знаю, что там есть информация, и я полагаю, что могу попытаться проанализировать данные PDF самостоятельно, пройдя черезпример voyeur.app ... но это целая куча усилий, чтобы сделать что-то, что должно быть вполне нормальным ...

Есть ли более простой способ сделать это?

Добавлено:

Я испробовал два метода:

  1. получить данные PDFRepresentation со страницы и использовать их для создания нового NSImage черезinitWithData.Это работает, однако, изображение имеет размер и размер пикселя в 72dpi.

  2. Нарисуйте PDFPage в новый внеэкранный контекст, а затем получите CGImage из этого.Проблема в том, что когда я создаю контекст, мне кажется, что мне уже нужно знать размер в пикселях, что противоречит части цели ...

1 Ответ

3 голосов
/ 18 августа 2010

Есть несколько вещей, которые вы должны понимать о PDF:

  • Система координат PDF находится в точки (1/72 дюйма) по умолчанию.

  • Система координат PDF лишена разрешения. (это ложь в белом - разрешение фактически ограничено 32-битными числами с плавающей запятой).

  • К изображениям в PDF по своей природе не прикреплено никакого разрешения (это ложь белого цвета - изображения, сжатые с помощью JPEG2000, по-прежнему имеют разрешение во встроенных метаданных).

  • Изображение в PDF представляется объектом, который содержит серию выборок, которые хранятся с использованием какого-либо фильтра сжатия.

  • Объекты изображений могут отображаться на странице несколько раз в любом размере.

Поскольку разрешение определяется как количество пикселей (или выборок) на единицу расстояния, разрешение означает только что-то для определенной визуализации изображения на странице. Так что, если вы рендерите конкретное изображение для заполнения страницы, тогда разрешение в dpi будет

xdpi = image_width / (pageWidthInPoints / 72.0);
ydpi = image_height / (pageHeightInPoints / 72.0);

Если изображение не отображается в полный размер страницы, полное решение очень сложно. Adobe предписывает, что изображения должны обрабатываться как 1x1, и что вы изменяете матрицу преобразования страниц, чтобы определить, как их отображать. Означает, что вам потребуется матрица в точке рендеринга изображения, и вам нужно будет протолкнуть точки (0,0), (0, 1), (1,0) через матрицу. Евклидово расстояние между (0, 0) 'и (1, 0)' даст вам ширину в точках, а евклидово расстояние между (0, 0) 'и (0, 1)' даст вам высоту в точках.

Так как вы получили эту матрицу? Ну, вам нужен поток контента для страницы, и вам нужно написать интерпретатор PDF, который может копировать поток контента и отслеживать изменения в CTM. Когда вы достигаете своего изображения, вы извлекаете для него CTM.

Чтобы сделать этот последний шаг, нужно около часа с приличным инструментарием PDF, если вы знакомы с инструментарием. Написание этого инструментария - это работа нескольких человек.

...