Методы для рендеринга PDF-файла в файл растрового изображения NSImage с очень высоким разрешением

Мне нужно преобразовать PDF-файл в изображение с очень высоким разрешением (скажем, до и даже более 100 000 * 80 000 пикселей).

Мне удалось сделать это, не выходя из оперативной памяти, разделив визуализацию на несколько фрагментов, а затем визуализируя каждый с помощью NSOperationQueue, в основном отрисовывая представление pdf NSImage в новый NSImage с помощью drawInRect: fromRect: operation: дробь: а затем сохраняя представление TIFFRepresentation в файл.

Все хорошо, многоядерно и быстро, и я почти доволен. В любом случае мне нужно будет снова присоединить эти фрагменты после их рендеринга, чтобы получить один файл TIFF.

Я бы попытался объединить файлы с помощью NSInputStream и NSOutputStream, но поскольку каждый файл является полным представлением TIFF, объединение необработанных байтов приведет к нечитаемому файлу изображения. Есть ли способ объединить файлы изображений вместе без их полной загрузки в RAM, т.е. без использования методов NSImage?

В противном случае я мог бы сохранить необработанные байты пикселей вместо представлений tiff, а затем присоединить их с помощью NSInputStream / NSOutputStream, но тогда как я мог бы преобразовать весь файл байтов в узнаваемый TIFF, снова не загружая огромную вещь в RAM?


person Fabio Cionini    schedule 22.09.2010    source источник
comment
Мне любопытно, зачем вам такое большое изображение - какой PDF-файл может содержать столько информации? Другой вариант - извлечь изображение с разрешением ниже желаемого (100 МБ - 1 ГБ без сжатия), используя технику, которую я описываю ниже, а затем использовать какое-нибудь приложение для редактирования фотографий, чтобы масштабировать его до большего размера. Это может дать вам почти такое же изображение. Я хотел бы услышать, что это за приложение!   -  person Fred Hamilton    schedule 24.11.2010
comment
приложение предназначено для преобразования векторной графики в очень большие растровые изображения для создания отпечатков с высоким разрешением размером с обои. типографии нужны изображения в формате TIFF, и она не может напрямую обрабатывать векторную графику. это должно выполняться в коде, используя API-интерфейсы Cocoa, а не вручную.   -  person Fabio Cionini    schedule 24.11.2010


Ответы (1)


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

Инструкции основаны на Acrobat 9 Reader (более ранние и более поздние версии также должны работать, если в них есть инструмент «Снимок» / «Marquee Select») в Windows XP. Я полагаю, что это применимо к большинству других платформ, на которых работает Adobe Reader. (Теперь, когда я думаю об этом, вполне может быть альтернативное программное обеспечение для отображения PDF, которое действительно может делать это без каких-либо уловок. Может быть, что-то основанное на ghostscript?) В любом случае я знаю, что это работает:

  1. Увеличивайте PDF-файл до тех пор, пока изображение на вашем мониторе не будет иметь требуемое разрешение в пикселях. Если вы пытаетесь захватить изображение с большим количеством пикселей, чем есть на вашем мониторе (это единственная причина использовать этот метод), вы будете видеть только часть изображения на своем экране.
  2. При необходимости прокрутите, чтобы найти угол PDF-файла, который вы хотите сохранить.
  3. Выберите инструмент «Снимок / выделение».
  4. Щелкните угол, удерживайте кнопку мыши нажатой (перетащите-выберите) и переместите мышь в противоположный угол окна.
  5. Экран начнет автоматическую прокрутку к противоположному углу изображения. Это может занять некоторое время, но это произойдет.
  6. Когда вы дойдете до противоположного края, уберите палец с мыши, и в буфере обмена должно появиться изображение с высоким разрешением.

Теперь, в зависимости от «размера» исходного изображения (Acrobat будет увеличивать масштаб только до 6400% от исходного размера на основе информации о разрешении на дюйм в PDF-файле), этот метод может теоретически позволить вам получить до 100k x 80k пикселей. Для большинства современных ПК он разваливается из-за того, что вам понадобится достаточно ОЗУ для хранения 22 ГБ данных изображения в вашем буфере копирования ...

person Fred Hamilton    schedule 24.11.2010
comment
кхм, мне очень жаль, но если вы внимательно прочитаете вопрос, вы обнаружите, что речь идет о методе, позволяющем сделать это программно с использованием API-интерфейсов Cocoa, а не вручную с помощью Acrobat или еще ... - person Fabio Cionini; 24.11.2010
comment
Верно, но если вы внимательно прочитаете мой ответ, я пойму, что он, вероятно, не удовлетворит ваши потребности. Я надеялся, что мой ответ / метод могут быть полезны некоторым людям, которые наткнулись на этот вопрос (как и я), основываясь на более общем предмете, и не возражают против небольшого ручного труда. - person Fred Hamilton; 25.11.2010