2012-05-04 32 views
6

Używam Ghostscript do konwertowania dokumentów PDF na PCL w celu drukowania. Ostatnio mam dodatkowy wymóg, aby przed drukowaniem wszystkie strony zostały obrócone do pozycji Portret. Znalazłem sposób, aby to zrobić za pomocą Ghostscript z następującą funkcją polecenia i post script.Strony Ghostscript obracają się

"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" 

Zawartość 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 

Problemem jest to, że funkcja ta zastępuje wszystkie rozmiary stron na wielkość liter. Moje dokumenty są czasem legalne lub A4. Próbowałem zmodyfikować tę funkcję, aby zastąpić rozmiary krajobrazu ich odpowiednikami w postaci portretu, ale nie były w stanie stworzyć działającego postscriptu. Muszę być wskazany we właściwym kierunku, aby stworzyć ekwiwalent postscriptowy następującego pseudokodu.

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

Zdaję sobie sprawę, że istnieją sposoby na stronach wirujących non-Ghostscript, ale jeśli mogę to zadziałało by to ładnie pasuje do mojego procesu, a nie zmniejszyć wydajność.

Oto przykład jednego z moich plików PDF: Sample1.pdf

Odpowiedz

2

Znalazłem działające rozwiązanie. Nie jest tak uniwersalny, jak miałem nadzieję, ale spełnia wszystkie moje wymagania.

Poniższy skrypt postscriptowy zamienia dokumenty A4, Letter i Legal na Portret. Aby uzyskać inne rozmiary strony, dostosuj minimalne i maksymalne rozmiary.

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

Ten skrypt postscriptowy spowoduje obrócenie dokumentów A4, Letter i Legal do Landscape. Jedyną różnicą jest wartość rozmiaru strony minimalnej/maksymalnej.

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

Rozwiązanie to opiera się plik auto-rotate.ps znalazłem w kodzie źródłowym projektu hylafax. Ten projekt wydaje się być licencjonowany w ramach BSD.

4

PostScript jest językiem programowania, dzięki czemu można zrobić wiele z nim. To, co musisz zrobić, to na nowo zdefiniować akcję żądania wielkości stron. Rozmiar strony i treść są oddzielone w PostScript, więc trzeba zrobić 2 rzeczy:

1) Alter żądanie mediów z poziomego na pionowy

2) obracać zawartość strony

Najprostszy sposobem na to jest ponowne zdefiniowanie operatora "setpagedevice". Oto przykład:

/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 

ten sprawdza zmiany konfiguracyjne, aby zobaczyć czy rozmiar strony jest zmieniany, jeśli jest to dostaje nowy rozmiar, i sprawdza, czy szerokość> wysokość (prosta definicja krajobrazu). Jeśli to prawda, zmienia zapytanie, zmieniając szerokość i wysokość, a następnie obraca zawartość strony o 90 stopni.

Możesz użyć tego programu Ghostscript, umieszczając powyższy zawartość w pliku (np prolog.ps), a następnie uruchomić ten plik przed własnym pracy:

GS ...... prolog.ps pracę. ps

Próbowałem tego, ale nie z plikiem krajobrazu, ponieważ nie miałem go w ręce. Zauważ także, że możliwe jest skonstruowanie programu PostScript, który to pokona.

+0

Próbowałem tego skryptu i nie spowodowało błędu, ale również nie obróciło stron. Oto próbka wejściowego pliku PDF. [https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28](https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28) – Zig158

Powiązane problemy