自宅プリンターで両面印刷を自動化!シンプルなBashスクリプトの作り方
私の自宅にはレーザープリンターがあります。Hewlett Packard LaserJet Pro CP1525nwカラープリンターはやや古いモデルですが、何年もの間、安定してカラー印刷をこなしてくれる頼れる働き者です。数年前にRaspberry Piをプリントサーバーとして導入し、家庭内ネットワークに接続しました。
このLaserJetはホームオフィスにとって大きな戦力です。昨年会社を立ち上げて以来、クライアントとの打ち合わせやワークショップ、研修会用の資料印刷には、ずっとこの小さなレーザープリンターにお世話になってきました。
ただ、ひとつだけ不満があります。このプリンターは片面印刷にしか対応していないのです。両面印刷をしたい場合は、カスタムの印刷ジョブを自分で組む必要があり、面倒な手作業が発生します。LibreOfficeでは、まず奇数ページだけを印刷するよう設定し、用紙をセットし直してから、偶数ページを逆順で印刷しなければなりません。

受け取ったPDFを印刷するときも手順は同じです。4ページの文書なら、まず1ページと3ページを印刷し、用紙を入れ替えてから2ページと4ページを逆順に印刷します。GNOMEの印刷ダイアログでは、「ページ設定」から奇数ページのみ/偶数ページのみの印刷を指定します。


どの方法で印刷する場合でも、全体の流れは「奇数ページを印刷 → 印刷済みの用紙をトレイに戻す → 偶数ページを逆順で印刷」です。4ページの文書なら、偶数ページを逆順に印刷することで、3ページの裏に4ページ、1ページの裏に2ページがきれいに収まります。ところが、偶数ページ印刷の際に「逆順」オプションの選択をうっかり忘れると、長い印刷ジョブが一瞬で台無しに。そんなときの悔しさといったらありません。
さらに、奇数ページの文書の扱いも忘れがちです。5ページの文書では、まず1・3・5ページを印刷しますが、用紙をプリンターに戻すときに5ページ目は不要です。1ページと3ページだけをセットしましょう。そうしないと、5ページの裏に4ページ、3ページの裏に2ページが印刷され、1ページの裏は白紙のままになってしまいます。
そこで、作業を簡単かつ確実にするため、両面印刷を自動化するシンプルなBashスクリプトを書きました。これは、奇数ページを印刷した後に用紙の入れ替え(必要なら最終ページの取り外し)を促し、続いて偶数ページを印刷する、いわばラッパー的なスクリプトです。
両面印刷が必要なときは、まず文書をPDFに変換します。これはとても簡単です。LibreOfficeにはツールバーにPDF直接エクスポートのアイコンがあり、ファイル → エクスポート → PDFとしてエクスポートからも同じ操作ができます。その他のアプリケーションにもたいていPDFとして保存機能が備わっています。迷ったときは、GNOMEならプリンターの代わりにPDFファイルへ「印刷」することも可能です。


スクリプトの仕組み
PDFとして保存できたら、あとはBashスクリプトに任せるだけです。中身はlprコマンドを自動化して印刷を楽にするだけのものですが、まず奇数ページを印刷し、用紙の再セットを促し、その後で偶数ページを印刷します。文書のページ数が奇数の場合は、用紙を戻すときに最後のページを取り除くよう注意表示もしてくれます。いたってシンプルです。
スクリプトの中で唯一「プログラミング」らしいのは、ページ数を取得し、それが偶数か奇数かを判定する部分です。とはいえ、どちらも簡単に実装できます。
ページ数の取得にはpdfinfoコマンドを使用します。このコマンドはPDF文書に関する有用な情報を出力してくれます。以下が出力例です。
$ pdfinfo All\ training\ -\ catalog.pdf Creator: Writer Producer: LibreOffice 6.3 CreationDate: Fri Oct 18 16:06:07 2019 CDT Tagged: no UserProperties: no Suspects: no Form: none JavaScript: no Pages: 11 Encrypted: no Page size: 612 x 792 pts (letter) Page rot: 0 File size: 65623 bytes Optimized: no PDF version: 1.5
この出力は解析が非常に容易です。ページ数を取得するには、AWKのワンライナーで「Pages:」で始まる行を探し、2番目のフィールドを表示させます。
pages=$( pdfinfo "$1" | awk '/^Pages:/ {print $2}' )
偶数か奇数かの判定には、剰余演算子(%)を使って2で割った余りを求めます。偶数なら剰余は必ず0、奇数なら1になります。このシンプルなテストにより、文書が奇数ページかどうか、つまり残りを印刷する前に最後のページを取り除く必要があるかどうかを判断できます。
if [ $(( $pages % 2 )) -ne 0 ] ; then
あとは、適切なオプションを付けてlprを呼び出すだけで、print-duplex.shスクリプトは完成です。使用するオプションは、出力先プリンターの指定(lpr -P "HP_LaserJet_CP1525nw")、奇数ページのみの印刷(-o page-set=odd)、偶数ページのみの印刷(-o page-set=even)、そして逆順印刷(-o outputorder=reverse)です。
Bashスクリプト全文
#!/bin/sh
# print-duplex.sh
# 両面印刷用のシンプルなラッパースクリプト
pages=$( pdfinfo "$1" | awk '/^Pages:/ {print $2}' )
cat<<EOF
$1($pages ページ)
-------------------------------------------------------------------------------
まず奇数ページを印刷します
印刷が完了するまでお待ちください...
-------------------------------------------------------------------------------
EOF
lpr -P "HP_LaserJet_CP1525nw" -o page-set=odd "$1"
sleep $pages
cat<<EOF
===============================================================================
印刷済みの用紙を元の出力順のまま(印刷面を下向きにして)トレイに戻し、
ENTERキーを押してください
===============================================================================
EOF
pages=$( pdfinfo "$1" | awk '/^Pages:/ {print $2}' )
if [ $(( $pages % 2 )) -ne 0 ] ; then
echo '!! 最後のページを取り除いてください - この文書は奇数ページです'
fi
echo -n '>'
read x
cat<<EOF
-------------------------------------------------------------------------------
偶数ページを印刷します
印刷が完了するまでお待ちください...
-------------------------------------------------------------------------------
EOF
lpr -P "HP_LaserJet_CP1525nw" -o page-set=even -o outputorder=reverse "$1"
-
星空観察の夜に役立つ!Linuxのナイトビジョン用Bashスクリプト「redscreen.sh」の使い方
Linuxはサーバーや開発者の環境で使われることがよく話題になりますが、実は天文学の分野でも幅広く活用されています。Linux向けには、星図やスカイマップ、望遠鏡駆動システムを制御するインターフェースなど、天体観測に役立つツールが数多く存在します。しかし、天文学者にとって大きな課題のひとつが、暗闇の中で目の順応を保ちながらコンピューターを操作することです。 なぜ「暗順応」を守る必要があるのか 夜間の屋外で観測を行う際、天文学者は「暗順応(ダークアダプテーション)」と呼ばれる目の状態を維持しなければなりません。人間の目が薄暗い環境に完全に慣れるまでには、最大で30分ほどかかるとされています。とこ
-
実用的な5つの例で学ぶBashスクリプト入門チュートリアル
Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この