Рендеринг всего медиа-блока страницы PDF в файл png с использованием ghostscript - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь отобразить страницы PDF в файлы png, используя Ghostscript v9.02. Для этого я использую следующую командную строку:

gswin32c.exe -sDEVICE=png16m -o outputFile%d.png mypdf.pdf

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

В документации Ghostscript сказано, что по умолчанию отображается медиа-окно документа, но в моем случае это не работает. Кто-нибудь знает, как я могу добиться рендеринга всего медиа-блока с помощью ghostscript?
Может ли быть так, что для файлового устройства png отображается только поле кадрирования? Может быть, я забыл конкретную команду?

Например, этот pdf содержит некоторые регистрационные метки вне поля обрезки, которых нет в выходном png-файле. Еще немного информации об этом pdf:

  • медиа-бокс:
    • ширина: 667
    • высота: 908 баллов
  • ящик для культур:
    • ширина: 640
    • высота: 851

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Хорошо, теперь, когда Реверс переформулировал свою проблему в том, что он ищет «универсальный код», позвольте мне попробовать еще раз.

Проблема с «универсальным кодом» заключается в том, что существует много «законных» формальных представлений операторов «CropBox», которые могут появиться в PDF. Все перечисленное ниже возможно и правильно и задает одинаковые значения для CropBox страницы:

  • /CropBox[10 20 500 700]

  • /CropBox[ 10 20 500 700 ]

  • /CropBox[10 20 500 700 ]

  • /CropBox [10 20 500 700]

  • /CropBox [ 10 20 500 700 ]

  • /CropBox [ 10.00 20.0000 500.0 700 ]

  • /CropBox [    
              10    
              20    
              500    
              700    
             ] 

То же самое верно для ArtBox, TrimBox, BleedBox, CropBox и MediaBox. Для этого вам необходимо «нормализовать» представление * Box внутри исходного кода PDF, если вы хотите его отредактировать.

Первый шаг: «нормализация» исходного кода PDF

Вот как вы это делаете:

  1. Загрузка qpdf для вашей платформы ОС.
  2. Запустите эту команду для вашего ввода PDF:
    qpdf --qdf input.pdf output.pdf

output.pdf теперь будет иметь вид нормализованной структуры (аналогично последнему примеру, приведенному выше), и его будет легче редактировать, даже с помощью редактора потоков, такого как sed.

Второй шаг: убрать все лишние * вставки

Далее вам нужно знать, что единственная необходимая * коробка - это MediaBox. Этот ДОЛЖЕН присутствовать, другие являются необязательными (в определенном порядке приоритетов). Если остальные отсутствуют, по умолчанию используются те же значения, что и MediaBox. Поэтому для достижения вашей цели мы можем просто удалить весь код, связанный с ними. Мы сделаем это с помощью sed.

Этот инструмент обычно устанавливается во всех системах Linux - в Windows загрузите и установите его с gnuwin32.sf.net . (Не забудьте установить именованные «зависимости», если вы решите использовать файл .zip вместо Setup .exe).

Теперь запустите эту команду:

  1. sed.exe -i.bak -e "/CropBox/,/]/s#.# #g" output.pdf

Вот что должна делать эта команда:

  • -i.bak говорит sed редактировать исходный файл встроенным образом, а также создавать файл резервной копии с суффиксом .bak (на случай, если что-то пойдет не так).
  • /CropBox/ указывает первую строку адреса для обработки с помощью sed.
  • /]/ указывает последнюю строку адреса для обработки с помощью sed.
  • s говорит sed делать замены для всех строк от первой до последней адресуемой строки.
  • #.# #g сообщает sed, какой тип замены нужно сделать: заменить каждый произвольный символ ('.') в адресном пространстве пробелами (''), глобально ('g').

Мы заменяем все символы пробелами (вместо «ничто», то есть удаляем их), потому что в противном случае мы получили бы жалобы на «повреждение файла PDF», так как счетчик ссылок на объекты и длины потоков изменились бы.

Третий шаг: запустите команду Ghostscript

Вы уже достаточно хорошо это знаете:

gswin32c.exe -sDEVICE=png16m -o outputImage_%03d.png output.pdf

Все три шага сверху можно легко записать в сценарий, который я оставлю вам для вашего удовольствия.

0 голосов
/ 23 июня 2011

Во-первых, давайте избавимся от недоразумений. Вы написали:

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

Это не правильно. Если CropBox меньше, чем MediaBox, то должен отображаться только CropBox (не MediaBox). И это именно то, как оно было разработано, чтобы работать. В этом вся идея концепции CropBox ...


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

Чтобы вручную обработать PDF-файл, на который вы ссылались:

  1. Откройте PDF в хорошем текстовом редакторе (который не мешает существующим соглашениям EOL и не жалуется на двоичные части в файле).
  2. Поиск всех точек в файле, которые содержат ключевое слово /CropBox.
  3. Поскольку у вас есть только одна страница в PDF, она должна найти только одно место.
  4. Это может выглядеть как /CropBox [12.3456 78.9012 345.67 890.123456].
  5. Теперь отредактируйте эту часть, избегая добавления (или потери от) числа уже существующих символов:
  6. Установите желаемое значение: /CropBox [0.00000 0.00000 667.00 908.000000]. (Вы можете использовать пробелы вместо моих .0000.. частей, но если я это сделаю, редактор SO их съест, и вы не увидите то, что я напечатал изначально ...)
  7. Сохраните файл под новым именем.
  8. В программе просмотра PDF теперь должен отображаться полный MediaBox (согласно вашей спецификации).
  9. Когда вы конвертируете новый файл с Ghostscript в PNG, будет видна большая страница.
...