2012-05-04 129 views
6

Uso Ghostscript para convertir documentos PDF a PCL para imprimir. Recientemente, tengo el requisito adicional de que todas las páginas se deben rotar a Vertical antes de imprimir. He encontrado una manera de hacerlo usando Ghostscript con el siguiente comando y la función PostScript.Ghostscript rotar páginas

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

Contenido de 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 

El problema es que esta función sustituye a todos los tamaños de página con tamaño de letra. Mis documentos son a veces legales o A4. He intentado modificar esta función para reemplazar los tamaños de paisaje con su contraparte vertical, pero no he podido producir una posdata funcional. Necesito apuntar en la dirección correcta para producir el equivalente postscript del siguiente pseudo código.

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

Soy consciente de que hay maneras no Ghostscript de páginas de rotación, pero si puedo conseguir que esto funcione que encajaría muy bien en mi proceso y no reduciría el rendimiento.

Este es un ejemplo de uno de mis archivos pdf: Sample1.pdf

Respuesta

2

Encontré una solución factible. No es tan versátil como esperaba, pero cumple todos mis requisitos.

El siguiente script de postscript rotará documentos A4, Letter y Legal a Portrait. Para que haga otros tamaños de página, ajuste los tamaños mínimo y máximo.

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

Este script postcript rotará A4, Carta y documentos legales a Horizontal. La única diferencia es los valores de tamaño de página 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 

Esta solución está basada en el archivo auto-rotate.ps que encontré en el código fuente para el proyecto hylafax. Ese proyecto parece tener licencia bajo BSD.

4

PostScript es un lenguaje de programación, por lo que se puede hacer mucho con ella. Lo que debe hacer aquí es redefinir la acción de solicitar tamaños de página. El tamaño y el contenido de la página están separados en PostScript, por lo que tienen que hacer 2 cosas:

1) Alterar la solicitud medios de horizontal a vertical

2) girar el contenido de la página

El más simple La forma de hacerlo es redefinir el operador 'setpagedevice'. He aquí un ejemplo:

/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 

Esto comprueba los cambios de configuración para ver si se está alterando el tamaño de página, si es que se pone el nuevo tamaño, y mira a ver si la anchura> altura (una simple definición del paisaje). Si eso es cierto, altera la solicitud al intercambiar el ancho y el alto, y luego gira el contenido de la página 90 grados.

Se puede usar esta Ghostscript poniendo el contenido de arriba en un archivo (por ejemplo prolog.ps) y luego ejecutar ese archivo antes de que su propio puesto de trabajo:

gs ...... prolog.ps trabajo. ps

He intentado esto, pero no con un archivo de paisaje ya que no tenía uno a mano. Tenga en cuenta también que es posible construir un programa PostScript que lo vencerá.

+0

Intenté esta secuencia de comandos y no produjo un error, pero tampoco rotó las páginas. Aquí hay una muestra de un archivo pdf de entrada. [https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28](https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28) – Zig158