Страницы в 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 для получения дополнительной информации.