Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как разделить одну страницу PDF пополам по вертикали с помощью ghostscript

Автор вопроса: SandoMarcoОтветов: 1

У меня есть pdf в альбомной ориентации и это "Разворот страницы".

  1. Мне нужно разделить страницу пополам по вертикали посередине.

    Я использовал эту настройку, чтобы разрезать pdf пополам: этот получает левую часть страницы

    "C:\Program Files (x86)\gs\gs9.10\bin\gswin32c.exe" -o output.pdf
    -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dSubsetFonts=true -dEmbedAllFonts=true -g 750x1085 -c
    "<</BeginPage{0.95 0.96 scale 20 22 translate}>> setpagedevice" "<</PageOffset [0 0]>> setpagedevice"  -f input.pdf
    
  2. Приведенная выше команда работает нормально. Теперь моя проблема заключается в том, что мне нужно установить Mediabox, Cropbox, Bleedbox, Trimbox и Artbox, аналогичные размеру разделенной страницы. В приведенном выше примере; должно быть 750х1085.

    Какой должна быть правильная команда/настройки для запуска на GS, чтобы Mediabox, Cropbox, Bleedbox, Trimbox и artbox имели одинаковые размеры?

ОБНОВЛЕНИЕ
Это образец PDF-файла, который я пытаюсь разрезать пополам: ФАЙЛ PDF ДЛЯ РАЗДЕЛЕНИЯ

Сейчас я использую /PAGE pdfmark, и это команда, которую я пытаюсь использовать:

     "C:\Program Files (x86)\gs\gs9.10\bin\gswin32c.exe" -o output.pdf -sDEVICE=pdfwrite -dNOPAUSE -dBATCH
    -dSAFER -dUseCropbox -dSubsetFonts=true -dEmbedAllFonts=true -g7500x10850
    -c "[/CropBox [0 0 750 1085] /PAGES pdfmark"
    "[/MediaBox [0 0 750 1085] /PAGES pdfmark"
    "[/TrimBox [0 0 750 1085] /PAGES pdfmark"
    "[/BleedBox [0 0 750 1085] /PAGES pdfmark"
    "[/ArtBox [0 0 750 1085] /PAGES pdfmark"
    "<</BeginPage{0.95 0.96 scale 20 22 translate}>> setpagedevice"
    "<</PageOffset [0 0]>> setpagedevice"
    -f input.pdf

Я до сих пор не могу добиться одинакового размера Cropbox, MediaBox, TrimBox, BleedBox, ArtBox.

Какими должны быть правильные настройки команды?

  • По крайней мере, MediaBox уже должен быть размером с указанный носитель, а другие поля обычно не устанавливаются. Если вы хотите установить их, вам нужно будет использовать pdfmark /PAGE. KenS 03.01.2014
  • @KenS Я в замешательстве. а например в моем коде выше? Куда вставить метку /PAGE pdf? SandoMarco 06.01.2014
  • Вы помещаете его в командную строку, окруженную ключами -c и -f, так как это PostScript. KenS 06.01.2014
  • Привет @KenS. Спасибо за ответ. Очень признателен. Но я немного запутался, применяя /PAGE pdfmark к команде. Я пытался добавить его между -c и -f, но есть ошибка: /unmatchedmark в --pdfmark--. Я только что начал использовать ghostscript и запутался в различных настройках команд. Возможно, вы можете помочь мне с настройками, которые я должен добавить в команду, которую я дал выше? Я также пытаюсь исследовать в Интернете, как использовать pdfmark, но безуспешно. Я все еще потерян. Большое спасибо! SandoMarco 06.01.2014
  • Какие параметры вы указали в pdfmark? Это оператор PostScript, поэтому вам нужно добавить все параметры перед его вызовом. Несколько аналогично уже используемому вами setpagedevice. Вы можете получить копию ссылки на pdfmark здесь: adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/ KenS 06.01.2014
  • @KenS Спасибо за ссылку. Действительно очень помог мне как-то понять pdfmark. Я обновил свой вопрос выше. Я добавил настройки для pdfmark и до сих пор не могу настроить BOXES. Что-то не так с моей командой? Это правильно? SandoMarco 07.01.2014

pdfsplitghostscriptissuu

Ответы

Ответ 1 · KenS

Переходя к ответу здесь, комментарии слишком малы.

Ваша основная проблема заключается в том, что исходный файл PDF уже содержит все параметры Box, которые вы пытаетесь изменить. Интерпретатор Ghostscript PDF для определенных классов устройств вывода сохранит эти поля, записав на устройство собственную версию метки pdfmark. Поскольку это происходит после вашего pdfmark, он заменяет ваш.

К сожалению, нет никакого механизма, чтобы отключить это. Кроме того, поскольку вы используете Windows, у вас есть ресурсы, встроенные в файловую систему ПЗУ, поэтому вы не можете легко изменить их.

Так что на данный момент вы ничего не можете с этим поделать. Если вам удобно загружать исходный код и вмешиваться в PostScript, дайте мне знать, и я думаю, что смогу дать вам решение (вам не нужно пересобирать GS, но ресурсы PostScript недоступны отдельно).

РЕДАКТИРОВАТЬ, чтобы включить некоторые предлагаемые обходные пути

В pdf_main.ps:

% Test whether the current output device handles pdfmark.
/.writepdfmarkdict 1 dict dup /pdfmark //null put readonly def
/.writepdfmarks {   % - .writepdfmarks <bool>
  currentdevice //.writepdfmarkdict .getdeviceparams
  mark eq { //false } { pop pop //true } ifelse
  systemdict /DOPDFMARKS known or
} bind def

Вы можете изменить /.writepdmarks так:

/.writepdfmarks {   % - .writepdfmarks <bool>
    false
} bind def

Но обратите внимание, что ряд других вещей перестанет выводиться в выходной файл PDF.

Вместо этого вы можете посмотреть код в pdf_showpage_finish:

/pdfshowpage_finish {   % <pagedict> pdfshowpage_finish -
   save /PDFSave exch store
...
...
  .writepdfmarks {

        % Copy the boxes.
    { /CropBox /BleedBox /TrimBox /ArtBox } {
      2 copy pget {
        % .pdfshowpage_Install transforms the user space do same here with the boxes
        oforce_elems
        2 { Page pdf_cached_PDF2PS_matrix transform 4 2 roll } repeat
        normrect_elems 4 index 5 1 roll fix_empty_rect_elems 4 array astore
        mark 3 1 roll {/PAGE pdfmark} stopped {cleartomark} if
      } {
        pop
      } ifelse
    } forall

Вы можете изменить строку '{ /CropBox /BleedBox /TrimBox /ArtBox }', любые поля, которые вы не хотите сохранять, вы можете удалить из этой строки.

Если вы хотите, чтобы любая из них не переопределяла ваши спецификации, удалите строки с "% Копировать поля" до "% Копировать аннотации и ссылки".

Обратите внимание, что это только работает в системе, где ресурсы не встроены в файловую систему ПЗУ или где ресурсы, по крайней мере, доступны на диске, а путь к файлам ресурсов указан с помощью - Я переключаюсь.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы