Printer Job Language(略称: PJL[1])は、ヒューレット・パッカード社(Hewlett Packard)によって策定されたプリンタジョブを制御する言語。
リコー社、ゼロックス社、キヤノン社のプリンタをはじめ、ヒューレット・パッカード社以外であってもこのPJLの記述を解釈できる、対応したプリンタがある[2][3]。
基幹業務系の開発などで、事務処理の種類に応じて直接プリンタを制御して、Aの処理はインナートレイに排紙する、Bの処理はホチキスしてフィニッシャートレイに排紙する、といった印刷に関する一連のすべてを予め事務処理に組み込んで自動化することができる[4]。
- プリンタにセットされている用紙のうち、どの用紙を使うのかを指定する、といった印刷する内容(プリンタジョブ)をどうするのか、ということを指示(制御)する記述方法(言語)である。
- プリンタが機能に対応していれば、プリンタ内蔵ハードディスクへのアクセスといった高度な操作が可能な言語である。
- プリンタは印字方式(インクジェット方式、レーザーゼログラフィ方式、ドットインパクト方式など)に合わせてメーカーが独自にプリンター言語(特に有名なのは1ページ単位を基本とするレーザープリンタで、ページ記述言語という種類のものがある[5])を制定して[6]、Windowsではプリンタドライバーでプリンター言語を生成してプリンターへ送信して印字しているが、PJLは「プリンター言語」を『プリンタがどう扱うかを制御する為』のものである。
- プリンタが高機能であり対応していれば、プリンタの環境設定や印刷ジョブ管理、さらにはプリンタ内部のファイルシステム操作に対応している。
- 特に近年の高機能化された複合機(MFP、いわゆるコピー機)にはプリンタ機能が搭載されており、PJLでの操作に対応している。特に利用者の認証機能や遠隔操作、機密文書をはじめとした文書の蓄積・検索・印刷機能、インターネットによりスマートホンや遠隔地からの操作に対応したりしている共有機能の搭載など多機能化による経緯から、企業で複合機でどのような文書が印刷されたか、印刷登録された文書があれば機密文書の漏洩など、PJLを利用した複合機への攻撃が懸念されている。[7]
- 具体的には、PDFファイルをPDF(PostScript)対応プリンターで印字するケースでは、PJLで用紙サイズ、排出先トレイの指定、白黒・カラーのどちらで印字するか、解像度といったこと、最後に「次にPDFです」と記述してプリンターへ送信、または直接送信する。
- そしてPDFファイルそのものをプリンターへ送信すると、先の設定にしたがって印刷される。
- 誤解が多いが、PDFファイルそのもの(PDFの仕様)はA3やB5といった用紙種類の概念を持っていない(PDFの設定に無い)が、PDFにはサイズ(横何センチ、縦何センチ)というのは設定があり、設定されているのでPDF印刷ソフトやPDFダイレクト印刷対応プリンタはそのサイズから用紙サイズを類推して、合致する用紙を自動選択しているにすぎない。[8]
- PJL言語に準拠したメーカー仕様に独自に機能拡張し、印刷する複数の文書の間に「別の用紙を挿入する機能(合紙機能)をプログラム」したりできるようにしている[4]。
- リコー社ではRicoh Specificとして RPJL と呼称し、ゼロックス社では XPJL[9] として呼称している。
- PJLそのものは @PJL SET 【要素】 = 【値】の記述の羅列であるので、言語ではあるが、単に必要なことを箇条書きすればよいものにすぎない簡便さがある。
- どのような【要素】と【値】に対応しているかは、プリンタの性能や機能に応じて、メーカーがそれぞれ独自に設定している為、メーカーの仕様書またはWindowsなどでドライバーがプリンターへ送信する文字列を知る必要がある。
- 具体的には、汎用的な用紙サイズのほかに、プリンターによってはフィニッシャーと呼ばれるホチキスをする機能が付いている機種があり、【要素】ホチキスを【値】「しない・左に2つ・左上に斜めに1つ・左上に横向きに1つ」というように独自のものがある。
- 記述は基本的に、PJLの開始を示し、PJLで要素の羅列を示し、次に印刷内容となる「プリンター言語」の種類を示す、という先頭の3段階。次いでプリンター言語。そして最後にPJLで印刷ジョブの終了を示す、という3つに区分けされる。
- PJLの開始の示し方は、ESCという16進数で1Bの文字コードを1文字目にして、続いて %-12345X を記述し改行コードが続く。
- PJLの要素の羅列の示し方は、@PJL SET PUNCH = OFF を記述し改行コードが続く。
- PJLを終了しページ記述言語の記述に移行するときは、@PJL ENTER LANGUAGE = 言語名 改行コード と記述する。
- 次にPDFファイルのデータが続く場合は、@PJL ENTER LANGUAGE = PDF 改行コード となる。このコマンド以降は、PDFファイル(Postscript)の記述となる。
- これはプリンタが対応している「プリンター言語」なので、キヤノン社であれば @PJL ENTER LANGUAGE = LIPS 改行コードが続き、LIPSで記述された印刷内容が続くことで、プリンターはPJLの設定に従って印刷内容を白黒で印刷するなど、制御する。
印刷送信の他に、プリンタステータスの取得(搭載しているトレイの種類など)をサポートしている[10]。16進数で1Bを<ESC>、改行コードを<CR><LF>と表現し、以下の文字列をプリンタへ送信する。
<ESC>%-12345X@PJL <CR><LF>
@PJL ECHO 09:10:09.1 08-22-00 <CR><LF>
@PJL INFO INTRAYS <CR><LF>
<ESC>%-12345X
すると、プリンタからは以下のようにプリンタ搭載トレイの種類を返す[1]。
@PJL ECHO 09:10:09.1 08-22-00<CR><LF>
<FF>
@PJL INFO INTRAYS [8 TABLE]<CR><LF>
INTRAY NAME<CR><LF>
INTRAY 1 "UPPER TRAY"<CR><LF>
INTRAY 2 "RED PAPER"<CR><LF>
INTRAY 3 "PAPER RED"<CR><LF>
INTRAY 4 "PREPRINT"<CR><LF>
INTRAY 5 "TRAY A1"<CR><LF>
INTRAY 6 "TRAY B1"<CR><LF>
INTRAY 7 "TRAY C1"<CR><LF>
INTRAY 8 "TRAY D1"<CR><LF>
<FF>
プリンタが返す文字列をどのように受け取るか、というのはネットワーク対応プリンタであればFTP接続によって、というのがある。
ハードディスク搭載のプリンタなどで、プリンタが高機能であればプリンタ内部のファイル操作が可能であり FSDIRLIST といったファイルシステム操作のPJLコマンドが利用可能であるなど、言語としての側面を強く持つ。
具体的には以下のようにすることで
<ESC>%-12345X@PJL INFO FILESYS
VOLUME TOTAL SIZE FREE SPACE LOCATION LABEL STATUS
0: 2929683456 2922577920 HDD READ-WRITE
のように、ハードディスクのボリューム番号、利用可能容量などが返される。
複合機(MFP、いわゆるコピー機)では、IPAの「デジタル複合機のセキュリティに関する調査報告書」にて、「PJLコマンドを悪用した攻撃(ディレクトリ・トラバーサル)」の具体例が示されている。
手順としては極めて簡素なもので、PJLコマンドでファイル名「passwd.txt」を探し、これをダウンロードするというものである[7]。
対策としては、このような印刷以外の機能についてはプリンターや複合機がPJLのどの命令に対応しているかといった情報は探しても見つかりにくい為、複合機に対してジョブデータを投入できるホストを特定のプリントスプールサーバやスキャンとファクスのゲートウェイサーバなどに限定する方法が示されているにすぎないが、インターネットから誰もがアクセス可能な状態にしてしまっている複合機があり、2010年の調査ではこのような複合機を位置マッピングした結果、日本、台湾、アメリカ、ヨーロッパなどで国土の全域に渡って設置されていた[11]ので、使用者の根本的なセキュリティーに対する認識の甘さにも原因がある。[12]
また、関連してPostScriptも攻撃に利用可能であり、開発者は注意が必要とされている。