業務でイントラサイトのページを自動的に印刷する必要があったので調べてみると、MeadCo’s ScriptXというIEで使えるよさげなActiveXコントロールを見つけたのでいろいろ試してみた。有料版もあるようだけど、無料で用紙の方向(縦か横)、ヘッダとフッタ、マージンの指定、さらにダイアログを出さない印刷もできるのでかなり有用に使える。歴史あるツールらしく、調べてみたら結構古いサイトばかりヒットした。ただ、ActiveXコントロールってIE10以降や64ビットの端末では動かないイメージがあるので、古いサイトばかり引っかかるということは最新のIEやWindowsでは動かないんじゃ・・・と心配していたものの、あっさり動いた。同梱していたヘルプHTMLによると、Windows2000以上、IE6以上で動作するよう(英語で書いてあるのでちゃんとは読めていない)。こんなすごい便利なツールがあるのに今まで知らなかった。
参考:IEの印刷設定をActiveXコントロールとJavascriptで行う方法 – 星屋工作室ブログ
参考:ブラウザで印刷時のヘッダ・用紙の向き・用紙マージンを操る
参考:ScriptXでWebページ印刷設定 | ブログ | ソフトウェア開発なら福岡市のくじらシステム開発│Web人事考課システム│情報共有システム
使う前にまずダウンロードしてくる必要があります。公式サイトのDownloadページ右側の『Click to Download』というボタンをクリックすると『ScriptXClientKit.msi』というインストーラファイルをダウンロードできるので、そのファイルをダブルクリックしてインストール。多分、Cドライブの『Program Files』フォルダ(もしくは『Program Files (x86)』フォルダ)に『MeadCo ScriptX Resource Kit』というフォルダができるので、その下の『redist』フォルダ内の『smsx.cab』が印刷制御に使うActiveXコントロールです(他はよく分かりません。ScriptX.msiは再インストール用で、cleansx.exeは昔のScriptXで使われていたファイルのアンインストール用のファイルっぽい)
次に、印刷するHTMLファイルを作成し、その中に下記のように記述してScriptXを読み込むobjectタグを追加します。
<object id="factory" style="display:none" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" codebase="smsx.cab#Version=7,5,0,20"> </object>
調べてみるとどこもcodebase属性のパスはいろいろ調べてみると、ほとんどのサイトでは絶対パスで書かれてあるようだけど相対パスでもOKなよう。今回はHTMLファイルと同じ階層に置くことに。
印刷制御の指定は下記のような感じになります。
function scriptxPrint(){ // ScriptXが読み込めているか。読み込めていなければreturn if(!factory.printing){ return; } // ヘッダの指定(詳しくは後述) factory.printing.header = "&d &t&b&w&b&p/&P"; // フッタの指定(詳しくは後述) factory.printing.footer = "&D &T&b&u&b&&"; // 用紙の方向 true:縦 false:横 factory.printing.portrait = false; // マージンの指定 factory.printing.leftMargin = 1.0; factory.printing.topMargin = 2.0; factory.printing.rightMargin = 3.0; factory.printing.bottomMargin = 4.0; // 印刷実行 ture:印刷ダイアログあり false:印刷ダイアログなし factory.printing.Print(true); } scriptxPrint();
printing.Printの第一引数は印刷ダイアログを出すかどうかの指定。いろいろ調べてみるとtrueの場合はださないと書いてあるサイトがいくつかあったのだけど、trueだとダイアログを出すが正しいはず(昔は逆だったのだろうか?)。第二引数の指定もあるようですが、よく分かってません。多分、フレームがあるHTMLについての指定だと思います(参考:MeadCo’s ScriptX:Print)。また、『factory.printing.Preview();』と指定することにより、印刷プレビューを表示することもできます。
ヘッダとフッタで使える特殊記号は下記の通りです。
- &w:印刷するページのタイトル
- &u:印刷するページのアドレス
- &d:現在の日付。コントロールパネルの地域設定で変わるようで、日本だと/で区切った日付になるはず
- &D:現在の日付。コントロールパネルの地域設定で変わるようで、日本だと○年○月○日となる
- &t:現在の時刻。コントロールパネルの地域設定で変わるようで、日本だと:で区切った時刻表記
- &T:現在の時刻。:で区切った時間。つまり、日本だと&tと同じ
- &p:現在のページ番号
- &P:総ページ数
- &&:アンパサンド(&)
また、ヘッダやフッタ中に&bが一つあると、&bを境に左側の文字列は左寄せ、右側の文字列は右寄せとなる。&bが二つあると、一つ目の左側の文字列は右寄せ、&bに挟まれてる文字列は中央寄せ、二つ目の右側の文字列は右寄せとなる。
サンプル用のページはこちら
最初にIEで開くと下記のようにインストールを促すダイアログが表示されると思うので、インストールボタンを押します(その後、ユーザーアカウント制御のダイアログがでたら『はい』をクリック)。
そうすると、ScriptXを使わない場合、印刷プレビューは下記のように表示されていましたが、
ScriptXを使うと下記のようになりました。
なお、factory.printing.Printメソッドの第一引数をfalseにしているのに印刷ダイアログが表示されるということがあると思います(ちなみに、そのダイアログで『キャンセル』をクリックするとなぜかJavaScriptエラーになる)。これは、[ツール]の[インターネットオプション]の[セキュリティ]の[信頼済みサイト]に対象ページのドメインを追加することにより、ダイアログがでなくなります(参考:ScriptXで印刷ダイアログが表示されないようにしたい)。インターネットに一般公開するわけではなく、イントラネットで必要だったなので、この設定作業はたいした問題になりません。こういうのがあって本当によかったです。
そもそもこういうのって、CSSでできてくれたら一番ありがたいんですよね。今回のサンプルページでも指定しているpage-break-inside(その要素内の改ページを避ける指定。今回はセルの途中で改ページが起こらないように指定している)というプロパティは印刷専用のプロパティなわけだし、なんで印刷の向きやマージンを指定できるプロパティがないのかと(一応、あるにはあるっぽい:size-スタイルシートリファレンス)。ヘッダやフッタの指定もJavaScriptで指定できたらいいのに。
コメント