Как разделить одну 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 аналогично размеру разделенной страницы. В приведенном выше примере; это должно быть 750x1085.

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

ОБНОВИТЬ
Это пример файла PDF, который я пытаюсь разрезать пополам: PDF FILE TO SPLIT

Я сейчас использую /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 с одинаковым размером.

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

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

Если вы хотите, чтобы какие-либо из них не перекрывали ваши спецификации, удалите строки из "% Copy the boxs" до "% Copy аннотации и ссылки"

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

Другие вопросы по тегам