Unix Tips へ戻る
 
ポストスクリプトプリンタで両面印刷
 

 

通常 UNIXMac では印刷にポストスクリプトプリンタ ( 以後 PS とします ) で印刷を行います. ghostscriptnetatalksamba 等を組み合わせて使うと UNIXMac からでも Windows 用プリンタへの印刷が出来ます ( ドライバが用意されているプリンタに限ります ) が,ここでは Windows 用プリンタについては対象外とし,ポストスクリプトプリンタ ( しかも両面印刷可能な機種 ) を対象とします.

 
 


目次

  1. 両面印刷と綴じ方
  2. 両面印刷と PS ファイル
  3. Redhat Linux での設定
  4. 両面袋とじ印刷の基礎

 
 
 
 
 
 
 
 
 

  1. 両面印刷と綴じ方

 

両面印刷を行う場合,印刷方向を気をつける必要があります. 失敗すると,「ページをめくったら裏側はひっくり返ってる!」 なんて事になってしまいます. まずは印刷方向に関する用語を定義しましょう.

 

 

長辺綴じ 短辺綴じ

 

  • 長編綴じ
     
    文字通り,印刷物の長辺 ( 長方形の長い方の辺 ) で綴じる方法. もしくはその方法で綴じる事を意図して両面印刷した印刷物. 各ページが縦長になっている場合は通常この方法で印刷する.
     
     
     
  • 短編綴じ
     
    印刷物の短辺で綴じる方法. もしくはその方法で綴じる事を意図して両面印刷した印刷物. 各ページが横長になっている場合は通常この方法で印刷する.

 


あまり関係ありませんがついでに両面袋とじ印刷とは何かを説明しましょう.

 

 

  • 両面袋とじ印刷
     
    両面印刷した複数の印刷物を重ね,中央で折り返したときにページ順が正しくなるようにする印刷方法. もしくはその方法で印刷した印刷物. 新聞は両面袋綴印刷の典型的な例と言える. 単に袋綴印刷ともいう.
     
     
    次に例を示します. 8ページの印刷物を2UP ( 縮小して1ページの領域に2ページ分印刷すること ) で次のようなページ順で印刷します.
     

     
    印刷したら2枚を表向きにして1枚目の上に2枚目を重ねます. 重ねたら次のように真ん中で折り返しましょう.
     

     
    これで完了です. ページをめくれば1ページから順番になっていることがわかります.
     

     
    よくわからない場合は一度お試しになることをお勧めします. 上の図は左側で綴じるタイプです. 新聞の場合は右で綴じることになります.

 
 
 
 
 

  2. 両面印刷と PS ファイル

 

通常 PS プリンタと印刷を要求する機械との間ではポストスクリプト言語が使われます. 通常 UNIX で印刷する場合,印刷内容をポストスクリプトファイル ( 以後 PS ファイル ) に変換します. PS ファイルの中身はポストスクリプト言語でかかれています. UNIX は受け取った PS ファイルをそのまま PS プリンタに渡すのが通常です. ( ファイルを自動的に2UPにしたりするなど,加工する場合は別です. )

ではまず PS ファイルの例を挙げます.

 

%!PS-Adobe-1.0 
%%Creator: guppylake.bellcore.com:nsb (Nathaniel Borenstein) 
%%Title: stdin (ditroff) 
%%CreationDate: Tue Nov 30 07:43:41 1993 
%%EndComments 

..(途中略)..

75 p 
%%Trailer 
xt 

xs 

 

PS ファイルの中に「両面印刷しろ」という命令を加えると,両面印刷になります. 両面印刷にするにはファイルの先頭に

 

%!
<< /Duplex true /Tumble false >> setpagedevice

 

を追加します. 上の場合は 長辺綴じ にする場合の指示です.
短辺綴じにするには次の2行をファイルの先頭に追加します.

 

%!
<< /Duplex true /Tumble true >> setpagedevice

 

長辺綴じ にする場合,PS ファイル全体は次に様になります.

 

%!
<< /Duplex true /Tumble false >> setpagedevice
%!PS-Adobe-1.0 
%%Creator: guppylake.bellcore.com:nsb (Nathaniel Borenstein) 
%%Title: stdin (ditroff) 
%%CreationDate: Tue Nov 30 07:43:41 1993 
%%EndComments 

..(途中略)..

75 p 
%%Trailer 
xt 

xs 

 

/Tumble を省略すると私の場合長辺綴じになりました. プリンタのデフォルトなのか,PS の仕様なのか,たまたまなのか, どれなのかはわかりません.

 
 
 
 
 

  3. Redhat Linux での設定

 

Redhat Linux 6.2 は両面印刷の設定は可能なのですが,長辺綴じ/短辺綴じの区別が無く,常に長辺綴じになってしまいます.

私の設定方法が悪いのかどうかは知りませんが,私の場合同じプリンタに対して3つのプリンタ名を用意しています:1つ目は片面印刷用,2つ目は長辺綴じ両面印刷用,3つ目は短辺綴じ両面印刷用です.

どのような設定をしたかを次に説明します.

 

  1. 管理者 ( root ) 権限でログインし,
     
    printtool

    を実行します. GUI ベースのプリンタ管理プログラムが起動しますのでここで3つのプリンタ名を登録します.
     
    1つは片面印刷用の設定にして,残り2つは両面印刷の設定にします. ここではプリンタ名をそれぞれ imdpr, imdpr-dl, imdpr-ds とします.
     
    両面印刷の設定をすると印刷要求として渡された PS ファイルに前節で解説した2行を追加するようになります. ただし長辺綴じにしかしてくれません.
     
    ( 両面印刷設定はプリンタの設定のところで入力フィルタを入力するところで「選択」ボタンを押します.するとフィルタの設定画面になり,そこで両面印刷の設定が可能です. )
     
     
  2. 短辺綴じに対応できるように印刷プログラムの両面印刷の部分を機能強化します.
    /usr/lib/rhs/rhs-printfilters/ps-to-printer.fpi を書き換えます. 以下に変更点を diff の出力結果で示します. ( ダウンロード )
     
    --- ps-to-printer.fpi	Thu Sep 28 18:00:10 2000
    +++ ps-to-printer.fpi2	Thu Sep 28 15:26:31 2000
    @@ -36,7 +36,11 @@
     HEADFILE=`mktemp /tmp/headtmp.XXXXXX`
     
     if [ "$DUPLEX" = "DUPLEX" ]; then
    +  if [ "$DUPLEXORIENTATION" = "LANDSCAPE" ]; then
    +     printf '%%!\n<< /Duplex true /Tumble true >> setpagedevice\n' >$HEADFILE
    +  else
          printf '%%!\n<< /Duplex true >> setpagedevice\n' >$HEADFILE
    +  fi
     elif [ "$DUPLEX" = "SIMPLEX" ]; then
          printf '%%!\n<< /Duplex false >> setpagedevice\n' >$HEADFILE
     fi
    

     
    読み方がわからない方は, ダウンロード し,pstoprinter.patch という名前で保存して,
     
    cd /usr/lib/rhs/rhs-printfilters/
    patch -p1 < pstoprinter.patch

    を実行してください. これによりプリンタの設定ファイルに DUPLEXORIENTATION を追加することにより短辺綴じに対応できるようになります.
     
     
  3. /var/spool/lpd/imdpr-ds/postscript.cfg の書き換え
     
    次のコマンドを実行してください.
     
    cd /var/spool/lpd/imdpr-ds/
    printf "DUPLEXORIENTATION=LANDSCAPE" >> postscript.cfg

    これによりプリンタ設定ファイルに "DUPLEXORIENTATION=LANDSCAPE" が追加されます.
     
     
  4. これで完了です. テスト印刷してそれぞれのプリンタ名で, 片面/両面長辺綴じ/両面短辺綴じ,で印刷できるかどうかを確認してください. Linux での印刷は lp ではなく, lpr になっています.
     
    lpr -P imdpr test.ps
    lpr -P imdpr-dl test.ps
    lpr -P imdpr-ds test.ps

 
 
 
 
 

  4. 両面袋とじ印刷の基礎

 

ここでは両面袋とじ印刷の基礎を解説します. 両面袋とじ印刷が何かわからない方はこちらをどうぞ.

両面袋とじ印刷を行うには2つの問題を解決しなければなりません.

  • 複雑なページの再配置
  • 2UP ( 縮小して1ページに2ページ分印刷する )

いったん出力して手動で並び替えて ( 縮小機能・両面印刷機能付きの ) コピー機をつかって印刷しても良いですが,これらの処理をコンピュータ内で行ってから両面印刷可能なプリンタで出力するという方法もあります. 後者のほうが楽&紙の無駄が無いですので後者の方法を解説します. それではまず上記2つの問題を自動的に解決してくれるフリーソフトを紹介します.

psbook は両面袋とじ印刷用の複雑なページの再配置を行ってくれます. 特に引数を指定する必要はなく,入力された PS ファイルから自動的に総ページ数を計算し,そのページ数に見合った方式で再配置を行ってくれます. 総ページ数が4の倍数でない場合,最大3ページまで白紙のページを追加します.
なお, psbook は左綴じ ( 新聞と逆 ) しかできません. 右綴じにする場合については後述します.

psnup は2UPの処理を行ってくれます. 2UPだけでなく4UPなどもおこないます. -2 オプションを渡すと2UPにしてくれます.

 

psbook test.ps | psnup -2 > test.out.ps

これは test.ps を両面袋とじ印刷用に処理した結果を test.out.ps というファイル名で保存する場合です.

 

a2ps test.txt | psbook | psnup -2 | lpr -P imdpr-ds

これは a2ps というテキストを PS ファイルに変換するソフトの出力結果を両面袋とじ印刷用に処理し,imdpr-ds という名前のプリンタに出力します. 通常 a2ps は何もオプションを渡さないと2UPにしてしまいますので -p オプションで2UPにしないようにしています. ( ページを並べ替えてから2UPしなければならないからです. )

 

psbook,psnup は共に ps-utils というフリーソフトウェアに含まれます.
ftp://ftp.iij.ad.jp/pub/TeX/CTAN/support/psutils/ 等からダウンロードできます.
対応OSは Sun-3 以降, Solaris 2.3 以降, HPUX 7.0 以降 Ultirix 4.0以降, Irix 4.1 以降, MSDOS 6.0 以降, WindowsNT 3.5 以降などとなっているようです. インストール方法は省略します.

 


右綴じするには, psbook で処理して左綴じにした後 ( かつ psnup で処理する前 ) に,ページの順序を逆 ( 1,2,…,8 → 8,…,2,1 ) にする処理を追加します.

ページ順を逆にするのには ps-utils に入っている, pstops を使います. たとえば psbook 処理後のページ数が8ページだった場合,次のように実行します.

 

pstops 8:7,6,5,4,3,2,1,0 test.in.ps test.out.ps

 

8: は 8 ページ単位に処理しろという支持です. 以降はページ 0 〜 7 を出力する順番に並べます. ( このコマンドに関しては詳しくは説明しません. )

さてこの方法だと ps ファイルのページ数が異なる毎に引数を指定しなおす必要があり,面倒です. そこで思い切って psbook を改造して,右綴じに対応できるようにしましょう. psbook.c があるディレクトリに移動して次のパッチを実行します. ( ダウンロード )

 

--- psbook.c	Wed Oct  4 14:34:31 2000
+++ psbook.new.c	Wed Oct  4 15:11:54 2000
@@ -3,7 +3,7 @@
  * rearrange pages in conforming PS file for printing in signatures
  *
  * Usage:
- *       psbook [-q] [-s] [infile [outfile]]
+ *       psbook [-q] [-s] [-e] [infile [outfile]]
  */
 
 #include "psutil.h"
@@ -12,9 +12,11 @@
 void usage()
 {
    fprintf(stderr, "%s release %d patchlevel %d\n", prog, RELEASE, PATCHLEVEL);
-   fprintf(stderr, "Usage: %s [-q] [-s] [infile [outfile]]\n",
+   fprintf(stderr, "Usage: %s [-q] [-s] [-e] [infile [outfile]]\n",
 	   prog);
    fprintf(stderr, "        must be positive and divisible by 4\n");
+   fprintf(stderr, "       -e : output a right-side binded booklet.\n");
+   fprintf(stderr, "            This is for east-asia countries.\n");
    fflush(stderr);
    exit(1);
 }
@@ -25,6 +27,7 @@
      char *argv[];
 {
    int signature = 0;
+   int rightSideBind = 0;
    int currentpg, maxpage;
 
    infile = stdin;
@@ -40,6 +43,9 @@
 	 case 'q':	/* quiet */
 	    verbose = 0;
 	    break;
+	 case 'e':	/* right-side binding */
+	    rightSideBind = 1;
+	    break;
 	 case 'v':	/* version */
 	 default:
 	    usage();
@@ -74,22 +80,42 @@
    writeheader(maxpage);
    writeprolog();
    writesetup();
-   for (currentpg = 0; currentpg < maxpage; currentpg++) {
-      int actualpg = currentpg - currentpg%signature;
-      switch(currentpg%4) {
-      case 0:
-      case 3:
-	 actualpg += signature-1-(currentpg%signature)/2;
-	 break;
-      case 1:
-      case 2:
-	 actualpg += (currentpg%signature)/2;
-	 break;
+   if (!rightSideBind){
+      for (currentpg = 0; currentpg < maxpage; currentpg++) {
+         int actualpg = currentpg - currentpg%signature;
+         switch(currentpg%4) {
+         case 0:
+         case 3:
+	    actualpg += signature-1-(currentpg%signature)/2;
+	    break;
+         case 1:
+         case 2:
+	    actualpg += (currentpg%signature)/2;
+	    break;
+         }
+         if (actualpg < pages)
+	    writepage(actualpg);
+         else
+	    writeemptypage();
+      }
+   }else{ /* right-side binding */
+      for (currentpg = maxpage - 1; 0 <= currentpg; currentpg--) {
+         int actualpg = currentpg - currentpg%signature;
+         switch(currentpg%4) {
+         case 0:
+         case 3:
+	    actualpg += signature-1-(currentpg%signature)/2;
+	    break;
+         case 1:
+         case 2:
+	    actualpg += (currentpg%signature)/2;
+	    break;
+         }
+         if (actualpg < pages)
+	    writepage(actualpg);
+         else
+	    writeemptypage();
       }
-      if (actualpg < pages)
-	 writepage(actualpg);
-      else
-	 writeemptypage();
    }
    writetrailer();

 

まず,以上をファイルにセーブします. ファイル名を psbook.patch とします. セーブしたら psbook.c があるディレクトリに移動して,

 

patch -p1 < psbook.patch

 

を実行し,後は再度コンパイル/インストールを実行します.

これで pstops 無しに右綴じにする事が出来るようになりました. 実行する際には -e オプションを与えると右綴じになるように出力します. 例えば,

 

psbook -e test.ps | psnup -2 > test.out.ps

 

と実行します.

 
 
 
 
 

 

Copyright (C)   1999-2003   いまでぃ    All Rights Reserved.
本ホームページに掲載・使用されている全ての画像及び文章の無断使用・転載を禁止します(除右下のバナー)。
本ホームページの内容について いまでぃ は一切保証いたしません。
本ホームページはリンクフリーです。

製作  いまでぃ  
最終更新日  2003/02/16
Unix Tips へ戻る