6

Ghostscriptを使用してPDFドキュメントを印刷用のPCLに変換します。最近、印刷する前にすべてのページを縦向きに回転させる必要があるという追加の要件があります。次のコマンドと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

問題は、この関数がすべてのページサイズを文字サイズに置き換えることです。私の文書は時々合法またはA4です。この関数を変更して、横向きのサイズを対応する縦向きのサイズに置き換えようとしましたが、機能するポストスクリプトを作成できませんでした。次の擬似コードに相当する追記を作成するには、正しい方向を指す必要があります。

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

ページを回転させるGhostscript以外の方法があることは承知していますが、これを機能させることができれば、プロセスにうまく適合し、パフォーマンスが低下することはありません。

これが私のPDFファイルの1つのサンプルです: Sample1.pdf

4

3 に答える 3

4

PostScriptはプログラミング言語であるため、多くのことを実行できます。ここで行う必要があるのは、ページサイズを要求するアクションを再定義することです。PostScriptではページサイズとコンテンツが分離されているため、次の2つのことを行う必要があります。

1)メディアリクエストを横向きから縦向きに変更します

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度回転します。

上記のコンテンツをファイル(prolog.psなど)に入れ、自分のジョブの前にそのファイルを実行することで、Ghostscriptでこれを使用できます。

gs ...... prolog.ps job.ps

私はこれを試しましたが、手元にあるものがなかったため、ランドスケープファイルでは使用しませんでした。これを打ち負かすPostScriptプログラムを構築することも可能であることに注意してください。

于 2012-05-05T09:17:37.920 に答える
3

実行可能な解決策を見つけました。思ったほど用途が広いわけではありませんが、すべての要件を満たしています。

次の追記スクリプトは、A4、レター、および法的文書をポートレートにローテーションします。他のページサイズを実行するには、最小サイズと最大サイズを調整します。

%!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、レター、および法的文書を横向きにローテーションします。唯一の違いは、最小/最大ページサイズの値です。

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

このソリューションは、 hylafaxプロジェクトのソースコードで見つけたauto-rotate.psファイルに基づいています。そのプロジェクトはBSDの下でライセンスされているようです。

于 2012-05-07T18:25:45.640 に答える
1

Zig158の回答はうまく機能していますが、それ以降、新しいオプションが登場しました。-dFIXEDMEDIAwitchは、a4だけでなく、どの用紙サイズでも機能します。

詳細については、 Ghostscriptバグトラッカーを参照してください。

于 2018-07-05T05:46:00.340 に答える