理系学生日記

おまえはいつまで学生気分なのか

ブラウザから印刷ダイアログなしで印刷したい

Web ページに「印刷」ボタンを用意してボタン押下したらそのまま自分のオフィスで印刷したいんだという要望はよくあるわけですが、印刷ダイアログを飛ばしてそのままプレビューや印刷をしたいという要望が生じるケースがあります。印刷ダイアログで OK ボタンとか押すのメンドくせーからとにかく印刷できれば良いんだ的な。 これ、一見普通の要望に見えますが、一定の前提条件を満たさなければ実現するのは結構厄介です。というのも、このケースにおいて印刷を行うプリンタというのはサーバサイドではなくクライアントPCと接続されているものなので、ブラウザからプリンタを制御するということになってしまうためです。

実際、JavaScript にも標準で window.print があるんですが、これは印刷するというよりは印刷するためのダイアログを出すというもので、さすがにそのまま印刷するってことはできません。

で、これを実現しようと調べていたんですが、さすがに ActiveX を使用しないといけないようで、ということは IE 限定になります。 クソみたいに古い記事としては以下がありまして、ムムム 2016 年になってこれを実装するのか…という…。

document.body.insertAdjacentHTML("beforeEnd",
    "<object id=\"idWBPrint\" width=0 height=0 classid=\"clsid:8856F961-340A-11D0-A96B-00C04FD705A2\">
    </object>");
  idWBPrint.ExecWB(6, 1);
  idWBPrint.outerHTML = "";

まぁ、上記がおそらくは今でも使用されているパターンかと思います。

でまぁ、これを実現するためのものとして、ScriptX というものがあります。

これ、結構 Web ベースの印刷ツールとしては結構有名どころなようでして、結局は内部で ActiveX を使用しているので IE でしか動かないんですが、IE だと相当古いバージョンから IE11 までで動作するようです。

対象とするブラウザが IE のみに限定できるんであれば、1 つの選択肢にはなりそうですね。ちなみに Edge は ActiveX 使えないので、今後はなかなか厳しいのかもしれません。

ライセンスは有料なんですが、スゴい基本的な機能は無料で使えます。 たとえば、プレビューや、(ダイアログなしで)Web ページを印刷する、とかですね。

使い方としては、HTML で以下のようなタグを挟んでおきます。これを IE で見ると、ScriptX のダウンロードとインストールが可能になります。

<!-- MeadCo ScriptX -->
<object id="factory" style="display:none"
  classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
  codebase="http://[your path here]/smsx.cab#Version=7,7,0,20">
</object>

この後、プレビューをしたければ以下のような関数を定義してボタンのハンドラに設定してやれば、勝手にプレビューが表示されます。

function btn_preview_onclick(portrait) {
  factory.printing.header = "This is MeadCo";
  factory.printing.footer = "Printing by ScriptX";
  factory.printing.portrait = portrait;
  factory.printing.leftMargin = 1.0;
  factory.printing.topMargin = 1.0;
  factory.printing.rightMargin = 1.0;
  factory.printing.bottomMargin = 1.0;
  factory.printing.Preview();
}

同様に、印刷だったら以下のようなメソッドで可能です。

function btn_print_onclick() {
  factory.printing.header = "This is MeadCo";
  factory.printing.footer = "Printing by ScriptX";
  factory.printing.portrait = false;
  factory.printing.leftMargin = 1.0;
  factory.printing.topMargin = 1.0;
  factory.printing.rightMargin = 1.0;
  factory.printing.bottomMargin = 1.0;
  factory.printing.Print(false);
}

まぁ、なかなか使用するケースってのは無いと思いますね、はい。l