2012-05-04 2 views
6

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

"C:\Program Files (x86)\gs\bin\gswin32c.exe" "-dNOPAUSE" "-dNOPROMPT" "-dBATCH" "-sDEVICE=pxlmono" "-Ic:\Program Files (x86)\gs\fonts\;c:\Program Files (x86)\gs\lib\;c:\Program Files (x86)\gs\lib\;" "-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 

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

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

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

Вот пример одного из моих файлов в формате PDF: Sample1.pdf

ответ

2

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

Следующий сценарий постскрипта будет поворачивать документы формата А4, Letter и Legal в портрет. Чтобы заставить его делать другие размеры страниц, отрегулируйте минимальные и максимальные размеры.

%!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 

Этот сценарий постскрипта будет поворачивать документы формата A4, Letter и Legal в альбом Landscape. Единственное различие - значения размера страницы 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 

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

4

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

1) Alter запрос средств массовой информации от пейзажа до портрета

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 ...... prolog.ps работы. ps

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

+0

Я пробовал этот скрипт и не вызывал ошибки, но также не поворачивал страницы. Ниже приведен пример входного файла pdf. [https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28](https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28) – Zig158