2012-05-04 10 views
6

Uso Ghostscript per convertire documenti PDF in PCL per la stampa. Recentemente ho il requisito aggiuntivo che tutte le pagine debbano essere ruotate in verticale prima della stampa. Ho trovato un modo per farlo usando Ghostscript con la seguente funzione di comando e postscript.Ghostscript ruota pagine

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

Contenuto 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 

Il problema è che questa funzione sostituisce tutte le dimensioni di pagina con il formato lettera. I miei documenti sono a volte legali o A4. Ho provato a modificare questa funzione per sostituire le dimensioni del paesaggio con la controparte verticale, ma non sono stato in grado di produrre postscript funzionanti. Ho bisogno di essere indicato nella giusta direzione per produrre l'equivalente postscript del seguente pseudo-codice.

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

Sono consapevole che ci sono modi non Ghostscript di pagine rotanti, ma se posso arrivare a questo lavoro che si adatterebbe bene in mio processo e non sarebbe ridurre le prestazioni.

Ecco un esempio di uno dei miei file pdf: Sample1.pdf

risposta

2

Ho trovato una soluzione praticabile. Non è versatile come speravo, ma ha tutte le mie esigenze.

Il seguente script postscript farà ruotare i documenti A4, Letter e Legal in Portrait. Per farlo fare altri formati di pagina regolare le dimensioni min e max.

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

Questo script PostScript consente di ruotare i documenti A4, Letter e Legal in Landscape. L'unica differenza sono i valori della dimensione della pagina 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 

Questa soluzione si basa fuori il file auto-rotate.ps ho trovato nel codice sorgente per il progetto hylafax. Quel progetto sembra essere autorizzato sotto BSD.

4

PostScript è un linguaggio di programmazione, in modo da poter fare molto con esso. Quello che devi fare qui è ridefinire l'azione di richiedere dimensioni di pagina. Le dimensioni e le pagina sono separati in PostScript, quindi è necessario fare 2 cose:

1) Modificare la richiesta dei media da orizzontale a verticale

2) ruotare il contenuto della pagina

Il più semplice il modo per farlo è ridefinire l'operatore 'setpagedevice'. Ecco un esempio:

/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 

Questo controlla le modifiche di configurazione per vedere se la dimensione della pagina viene alterata, se è ottiene la nuova dimensione, e sembra di vedere se la larghezza> altezza (una semplice definizione del paesaggio). Se ciò è vero, modifica la richiesta scambiando la larghezza e l'altezza, quindi ruota il contenuto della pagina di 90 gradi.

È possibile utilizzare questo con Ghostscript mettendo il contenuto di cui sopra in un file (ad esempio prolog.ps) e quindi eseguire il file prima del proprio lavoro:

gs ...... prolog.ps lavoro. ps

Ho provato questo, ma non con un file di paesaggio come non ne avevo uno a portata di mano. Si noti inoltre che è possibile costruire un programma PostScript che lo sconfiggerà.

+0

Ho provato questo script e non ha prodotto un errore, ma non ha ruotato le pagine. Ecco un esempio di un file pdf di input. [https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28](https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28) – Zig158