Страницы в Ghostscript поворот

Я использую Ghostscript для преобразования PDF-документов в PCL для печати. Недавно у меня появилось дополнительное требование, что все страницы должны быть повернуты на портрет перед печатью. Я нашел способ сделать это с помощью Ghostscript со следующей командой и функцией postscript.

"C:Program Files (x86)gsbingswin32c.exe" "-dNOPAUSE" "-dNOPROMPT" "-dBATCH" "-sDEVICE=pxlmono" "-Ic:Program Files (x86)gsfonts;c:Program Files (x86)gslib;c:Program Files (x86)gslib;" "-r300" "-sOutputFile=C:EXPORTFILE_e542e04f-5e84-4c8e-9b41-55480cd5ec52.cache" "rotate612x792.ps" "C:EXPORTFILE_3a5de9da-d9ca-4562-8cb6-10fb8715385a.cache"

содержание rotate612x792.ps

%! Rotate Pages
<< /Policies << /PageSize 5 >> 
   /PageSize [612 792] 
   /InputAttributes currentpagedevice 
   /InputAttributes get mark exch {1 index /Priority eq not {pop << /PageSize [612 792] >>} if }  forall >>
   >> setpagedevice

проблема в том, что эта функция заменяет все размеры страницы размером буквы. Мои документы иногда являются законными или A4. Я попытался изменить эта функция заменяет размеры ландшафта их портретным аналогом, но не смогла создать функционирующий postscript. Мне нужно указать в правильном направлении, чтобы создать постскриптум, эквивалентный следующему псевдокоду.

for(each page)
{
   if(PageSize == [792 612])
       PageSize = [612 792];
}

Я знаю, что есть не-Ghostscript способы поворота страниц, но если я смогу заставить это работать, это будет хорошо вписываться в мой процесс и не уменьшит производительность.

вот пример одного из моих PDF файлы: примеров-sample1.формат PDF

3 ответов


PostScript-это язык программирования, поэтому вы можете многое с ним сделать. Здесь вам нужно переопределить действие запроса размеров страниц. Размер страницы и содержание разделены в PostScript, поэтому вам нужно сделать 2 вещи:

1) измените запрос мультимедиа с ландшафта на портрет

2) повернуть содержимое страницы

самый простой способ сделать это-переопределить оператор 'setpagedevice'. Вот пример:

/oldsetpagedevice /setpagedevice load def %% copy original definition

/setpagedevice {
  dup /PageSize known {                   %% Do we have a page size redefinition ?
    dup /PageSize get                     %% get the array if so
    aload pop                             %% get elements remove array copy
    gt {                                  %% is width > height ?
      dup /PageSize get aload             %% get size array, put content on stack
      3 1 roll                            %% roll stack to put array at back
      exch                                %% swap width and height
      3 -1 roll                           %% bring array back to front of stack
      astore                              %% put swapped elements into array
      /PageSize exch                      %% put key on stack and swap with value
      2 index                             %% copy the original dict
      3 1 roll                            %% move dict to back of stack
      put                                 %% put new page size array in dict
      90 rotate                           %% rotate content 90 degrees anti-clockwise
    } if
  } if
  oldsetpagedevice                        %% call the original definition
} bind def

этот проверяет изменения конфигурации, чтобы увидеть, изменяется ли размер страницы, если он получает новый размер, и смотрит, если ширина > высота (простое определение ландшафта). Если это правда, то он изменяет запрос, меняя ширину и высоту, а затем поворачивает содержимое страницы на 90 градусов.

вы можете использовать это с Ghostscript, поместив вышеуказанное содержимое в файл (например, prolog.ps), а затем запуск этого файла перед вашей собственной работой:

gs ...... пролог.ПС работа.ps

Я пробовал это, но не с ландшафтным файлом, поскольку у меня его не было. Обратите внимание также, что можно построить программу PostScript, которая победит это.


Я нашел приемлемое решение. Он не так универсален, как я надеялся, но он соответствует всем моим требованиям.

следующий скрипт postscript повернет A4, письмо и юридические документы на портрет. Чтобы заставить его делать другие размеры страниц, настройте минимальные и максимальные размеры.

%!PS
  %   Sequence to set up for a single page size, auto fit all pages.
  %   Autorotate A4 Letter and Legal page sizes to Portrait
  << /Policies << /PageSize 3 >>
     /InputAttributes currentpagedevice /InputAttributes get    %current dict
     dup { pop 1 index exch undef } forall    % remove all page sizes
     dup 0 << /PageSize [ 595 0 612 99999 ] >> put    % [ min-w min-h max-w max-h ]
  >> setpagedevice

этот скрипт postscript будет вращать A4, письмо и юридические документы в ландшафт. Единственное различие-это значения размера страницы Min/Max.

%!PS
  %   Sequence to set up for a single page size, auto fit all pages.
  %   Autorotate A4 Letter and Legal page sizes to Landscape
  << /Policies << /PageSize 3 >>
     /InputAttributes currentpagedevice /InputAttributes get    %current dict
     dup { pop 1 index exch undef } forall    % remove all page sizes
     dup 0 << /PageSize [ 0 595 99999 612 ] >> put    % [ min-w min-h max-w max-h ]
  >> setpagedevice

это решение основано на автоматический поворот.ps файл, который я нашел в исходном коде для hylafax. Этот проект, по-видимому, лицензирован под BSD.


хотя Zig158 ответ работает хорошо, с тех пор появилась новая опция - dFIXEDMEDIA ведьма работает для любого размера бумаги, а не только для a4.

посмотреть Ghostscript bug tracker для получения дополнительной информации.