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

У меня есть 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.

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


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


Ответы (1)


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

Ваша основная проблема заключается в том, что исходный файл 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 }', любые поля, которые вы не хотите сохранять, вы можете удалить из этой строки.

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

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

person KenS    schedule 07.01.2014
comment
Привет @KenS. Означает ли это, что когда я пытаюсь изменить параметры Box, он просто возвращает их обратно и заменяет мои настройки? На самом деле я собираюсь использовать LINUX для запуска этой команды, и я использую PHP для вызова команды. Можете ли вы помочь мне с решением этого? Дело в том, что мне понадобится PHP для вызова команды для разделения файла. Я действительно открыт для предложений и решений. Спасибо. - person SandoMarco; 07.01.2014
comment
Да, параметры Box в файлах PDF переопределяют параметры из ваших операций pdfmark. Если вы посмотрите в gs/Resources/Init, вы найдете файл с именем pdf_main.ps. Есть несколько мест, где вы можете изменить это в зависимости от того, что вы хотите сделать. Вместо того, чтобы пытаться поместить это в комментарии, я отредактировал свой ответ..... - person KenS; 07.01.2014