return to SSR TOP
return to Daemon Lab TOP

FreeBSD+Samba+gsでPDFプリンタ


概要

重機研などが図面をPDFで出していたりしてるように。PDFに出力できると 便利なのは周知の事実でしょう。
そのために、広く使われている、プリンタドライバでPostScript形式のファイルを 作ってGhostScriptを使ってpdfに変換するという方法があります。
それをFreeBSD+Samba環境でエンドユーザにとって楽なように構築する方法のメモです。
もちろん!コンセプトは"全て無料"

はじめに(想定環境)

現在ロ技研のイントラネットサーバの環境は

  • OS:FreeBSD 4.4
  • Sambaによるwindows共有の提供 が、すでにインストールされています。
    まぁ。OSはFreeBSDじゃなくてもUNIX系OSなら殆ど大丈夫でしょう

    どうやって実現するか

    まずはUNIXのレベルでスクリプトに印刷データを流すための偽プリンタを作ります
    ユーザはこの偽プリンタにPS(PostScript)データを流すことによってPDF文章を生成します。
    windowsではサーバではなくクライアント側にプリンタドライバを入れるので、windows クライアント側にPSプリンタドライバを入れればその偽プリンタにPS形式のデータを Samba経由で流してくれます。
    このPS形式データをスクリプトでPDFに変換して適当なファイルに出力することにより。 Sambaの共有上にプリントアウトされた結果としてPDFが出てきているように見えます。

    インストール(サーバ側)

    FreeBSDなので何も考えずにネットからパッケージを落として追加しましょう。
    インストールするソフトは

  • Ghost Script 後は標準で入ってるので大丈夫でしょう。

    偽プリンタを作る

    /etc/printcapに下記のようなコードを追加すればいいです。 ディレクトリは適当に変更してください。なおこのディレクトリは 標準でroot:daemon権限で読み書きできるようにする必要があります。

    ps|pdf:\
        :sh:\
       :lp=/dev/null:mx#0:sd=/usr/spool/output/pdf:\
       :lf=/var/log/lpd-ers-pdf:sr=/var/log/lpd-stat-pdf:if=/usr/local/libexec/if-ps2pdf:
    プリンタの名前は上の例ではpsもしくはpdfですが。趣味に合わせて変えてください。
    |でつなぐことでいくらでも名前を定義できます。
    mx#0は必ずつけてください。印刷データの制限を解除します。
    そうしないと1MBを超えるデータを印刷できません。
    もし、内部の人を信用できないならmx#数字(byte)で最大サイズを指定してください。 if=/usr/local/libexec/if-ps2pdfのファイルパスは今からあなた自身が書く変換用のスクリプトです。

    if-ps2pdfスクリプト

    printcapで指定したフィルタの中身を書きましょう。 私はとりあえずこのようにして使っています。

    #!/bin/sh
    export PATH="/usr/local/bin"
    export TEMP="/usr/tmp/"
    NAME=`/bin/date "+%m_%d-%H_%M_%S"`
    /bin/cat >/usr/pdf/$NAME.ps
    /usr/local/bin/ps2pdf13 /usr/pdf/$NAME.ps /usr/pdf/$NAME.pdf
    /usr/bin/bzip2 -z -k /usr/pdf/$NAME.pdf
    rm /usr/pdf/$NAME.ps
    exit 0
    このスクリプトでは標準入力からPS形式データを受け取るとその時刻のファイル名で PDFファイルを/usr/pdf/に出力するスクリプトです。 ついでにbzip2で圧縮したファイルも生成しています。

    windows側の設定

    Adobeのサイト行ってポストスクリプトプリンタドライバをDLしてきます(無料)
    普通にダブルクリックすればインストールできるのでネットワークプリンタとして \\server\printer名のプリンタドライバとしてインストールします。
    次にプロパティの設定です
    なおwindows 2000の場合、プロパティがセーブできないというエラーをはく場合が ある。そのときはポートなくなっている場合があるので、ポートを追加して 対応してください。

    詳細設定ー>全ページをスプールしてから印刷
    詳細設定ー>標準の設定ー>レイアウトー>ページの順序(逆)
    詳細設定ー>標準の設定ー>レイアウトー>詳細設定ー>PostScriptー>出力オプションー>エラーが軽減するように
    そのように設定するとうまく印刷できるかもしれません(笑
    また、アプリケーションによっては勝手に設定を覚えこんで期待したとおりの設定に するには毎回プリントアウト直前に指定する必要があるものもあります

    運用

    運用はそれといって大変なことはないです。最初にプリンタドライバを 入れてしまえば普通のプリンタですから。
    ただし上のスクリプトの通りならば、*.psファイルが消えたときにちょうど変換終了なのでそれを確認してからpdf文章などを開くように注意しましょう
    また、いつまでたっても変換が完了しないときはgs延々と演算でハマってることが予想されます。

    lprm -P pdf
    など打ってスプールを消してあげましょう。またそれを実行した場合テンポラリファイルが残る場合があるのでたまには消してあげましょう。
    (例にあるスクリプトだと/usr/tmp)