2012-05-04 2 views
6

J'utilise Ghostscript pour convertir des documents PDF en PCL pour l'impression. Récemment, j'ai l'exigence supplémentaire que toutes les pages doivent être tournés vers Portrait avant l'impression. J'ai trouvé un moyen de le faire en utilisant Ghostscript avec la commande suivante et la fonction postscript.Ghostscript rotate pages

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

Contenu 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 

Le problème est que cette fonction remplace toutes les tailles de page avec la taille de la lettre. Mes documents sont parfois légaux ou A4. J'ai essayé de modifier cette fonction pour remplacer les tailles de paysage avec leur contrepartie portrait, mais je n'ai pas réussi à produire postscript fonctionnel. J'ai besoin d'être pointé dans la bonne direction pour produire l'équivalent postscript du pseudo code suivant.

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

Je suis conscient qu'il existe des moyens non-Ghostscript de rotation des pages, mais si je peux obtenir ce travail il cadrerait bien dans mon processus et ne serait pas réduire les performances.

Voici un échantillon d'un de mes fichiers pdf: Sample1.pdf

Répondre

2

J'ai trouvé une solution réalisable. Ce n'est pas aussi polyvalent que je l'espérais, mais il répond à toutes mes exigences.

Le script postscript suivant fera pivoter les documents A4, Lettre et Légal vers Portrait. Pour l'obtenir pour faire d'autres tailles de page, ajustez les tailles min et 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 

Ce script PostScript fera pivoter les documents A4, Lettre et Légal vers Paysage. La seule différence est les valeurs de taille de page 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 

Cette solution est basé sur le fichier auto-rotate.ps j'ai trouvé dans le code source du projet hylafax. Ce projet semble être sous licence BSD.

4

PostScript est un langage de programmation, de sorte que vous pouvez faire beaucoup avec elle. Ce que vous devez faire ici est de redéfinir l'action de la demande de tailles de page. La taille de la page et le contenu sont séparés en PostScript, vous devez donc faire 2 choses:

1) Modifier la demande médiatique du paysage au portrait

2) tourner le contenu de la page

Le plus simple La manière de le faire est de redéfinir l'opérateur 'setpagedevice'. Voici un exemple:

/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 

test vérifie les modifications de configuration pour voir si la taille de la page est en cours de modification, si elle est elle obtient la nouvelle taille, et cherche à voir si la largeur> hauteur (une définition simple du paysage). Si cela est vrai, il modifie la requête en inversant la largeur et la hauteur, puis fait pivoter le contenu de la page de 90 degrés.

Vous pouvez l'utiliser avec Ghostscript en mettant le contenu ci-dessus dans un fichier (par exemple prolog.ps), puis en exécutant ce fichier avant votre travail:

gs ...... prolog.ps emploi. Je l'ai essayé, mais pas avec un fichier paysage car je n'en avais pas un à portée de main. Notez également qu'il est possible de construire un programme PostScript qui va le vaincre.

+0

J'ai essayé ce script et il n'a pas produit d'erreur, mais il n'a pas non plus fait pivoter les pages. Voici un exemple d'un fichier pdf d'entrée. [https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28](https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28) – Zig158