読者です 読者をやめる 読者になる 読者になる

Macで自動的に印刷する

自動的に印刷するソリューションを開発したのでメモ。はがきサイズの写真用紙に印刷したいというのが今回の目的。MacのバージョンはOS X Yosemite 10.10.5である。

lprコマンドで印刷する

Macでこういう自動化をしようとすると真っ先にAutomatorAppleScriptが思い浮かぶ。この2つ印刷することは可能なのだが、オプションが選べない。用紙サイズさえ選べないのだ。AppleScriptでオプション選択しようとするとGUIスクリプティングが必要になってちょい手間だし、Automatorも同じだ。その点、lprコマンドはオプションも選べるのでCUIでやる上ではベストな選択肢となる。

システムの構成

今回の自動印刷はAutomatorによってフォルダアクションとシェルスクリプトを組み合わせて実現した。あるフォルダに画像を出力するアプリがあって、その画像をフォルダアクションで取得し、そのままシェルスクリプトに投げる。

今回のコマンド

lpr hoge.png -o PageSize=EPPostcard100x148 -o EPIJ_Medi=65 -o EPIJ_Qual=358 -o EPIJ_OPT_Bi_D=0

lprはMacの印刷コマンドで、こんな感じで使っている。オプション4つをつけている。

  • PageSize:用紙サイズ
  • EPIJ_Medi:用紙種類
  • EPIJ_Qual:印刷品質
  • EPIJ_OPT_Bi_D:高速印刷

オプションはlpoptionsコマンドから調べられる。PageSize以外はすべて今回利用したエプソンのプリンタに依存するオプションだと思う。上で書いたオプションはlpoptions -lで出力された下記のリストから、GUIの印刷ダイアログ(印刷品質のところのキャプチャを下に貼っておく)と照らしあわせて、当たりをつけた。デフォルトの選択肢にアスタリスクがつくのと、数字の大小ではなくダイアログに出てくる順に並んでるから当たりはつけやすい。

EPIJ_Medi/Media Type: *0 56 67 65 59 58 93
EPIJ_Qual/Print Quality: 353 *354 359 355 356 358
EPIJ_OPT_Bi_D/High Speed Printing: 0 *1

f:id:miso_engine:20160329152558p:plain
印刷品質の場合、デフォルトの選択肢が2番目で、ダイアログのデフォルト選択肢も2番目だから"標準"は"354"であることが推測される。最高品質で印刷したいので、高精細に当たると思われる"358"を選んだ。

オプションを詳しく見る

上記の予想の付け方で大体はいいのだが、いかんせんlpoptionsで出力されたオプションの名前と印刷ダイアログの日本語との対応が予想出来ないのもある。そういう場合は、プリンタの設定が書かれたPPD(PostScript Printer Description)ファイルを見ると対応が分かる。
Macの印刷はCUPS(Common Unix Printing System)というAppleが開発をしているオープンソースのシステムによって動いている。このCUPSのヘルプを見たところ、プリンタ毎の設定は、プリンタ毎のPPDファイルから読み込んでいるとのこと。そしてPPDファイルは /etc/cups/ppd/ にあることが分かった。この中にプリンタ名.ppdというファイルが存在するのでそちらを開くとオプションのシステム上での名前と印刷ダイアログでの名前の対応付けが分かるのだ。EPIJ_Qualのところを抜き出すとこんな感じ。"358"は高精細ではなく最高画質でしたね……。

*ja.EPIJ_Qual 353/はやい: ""
*ja.EPIJ_Qual 354/標準: ""
*ja.EPIJ_Qual 359/標準(高発色): ""
*ja.EPIJ_Qual 355/きれい: ""
*ja.EPIJ_Qual 356/高精細: ""
*ja.EPIJ_Qual 358/最高画質: ""

フォルダアクションとシェルスクリプト

Automatorで作成した。
f:id:miso_engine:20160329152742p:plain

for f in "$@"
do
	lpr "$f" -o PageSize=EPPostcard100x148 -o EPIJ_Medi=65 -o EPIJ_Qual=358 -o EPIJ_OPT_Bi_D=0
done

まとめ

EPSONがオプションについての説明をWebに載せてくれてたら……と思いながら作業した。
今回のスクリプトたちはデフォルトのプリンタで印刷することになっていてプリンタの指定はしていない。必要な方は適宜してくだされ。