続2:IEの印刷テンプレート

無題


標準Internet Explorerの印刷テンプレート変更の続き。


結論から言うと、shdoclc.dllのリソースを改造することで標準IEの印刷テンプレートを変更することができた。


(1)shdoclc.dllのバックアップを保存する
(2)shdoclc.dllの中のPREVIEW.DLGを改造する
(3)次回再起動時の置換モジュールとして登録
(4)再起動


注意しなければならないのは、shdoclc.dllはシステムファイルになっていて、保護対象になっているためそのままでは書き換えはできない。ブラウザを終了してもアンロードされない。OSのコアとIEモジュールを密結合して抱き合わせさせるのがマイクロソフトの戦略のようだから、これは仕方がないかもしれない。


Windowsではこのようなモジュールを置換するために、次回再起動の際に置換を予約する手段を用意している。本来は利便性を考えると再起動せずに置換できるような仕組みを導入すべきだが・・・
それはさておき、今回はFileCopyというフリーのシステムファイル置換ツールを使ってshdoclc.dllの置換を行った。


今日の実験は縮小レイアウト印刷をやってみた。
IEの印刷でよく嫌われているのが、横方向のはみ出し部分が印刷されない点だろう。
今回印刷レイアウト部分にzoomスタイルを適用して縮小することでページを縮小レイアウト印刷し、横方向のはみ出しに対応できることを確認した。
印刷テンプレートはかなり自由度が高いので、プレビューUIも比較的自由に追加できる。今回は固定の拡大率でのテストだが、プレビュー画面に拡大率を入力させる欄を追加すれば自由に拡大率を変えることも可能だ。

オリジナル
oRule = GetRuleFromSelector(".mRect"); if (oRule == null) { HandleError("'.mRect' rule does not exist!", document.URL, "CPrintDoc::EnsureDocuments"); } oRule.style.marginLeft = left + "in"; oRule.style.marginRight = right + "in"; oRule.style.marginTop = top + "in"; oRule.style.marginBottom = bottom + "in"; oRule.style.width = conWidth + "in"; oRule.style.height = conHeight + "in";
修正
oRule = GetRuleFromSelector(".mRect"); if (oRule == null) { HandleError("'.mRect' rule does not exist!", document.URL, "CPrintDoc::EnsureDocuments"); } oRule.style.marginLeft = left + "in"; oRule.style.marginRight = right + "in"; oRule.style.marginTop = top + "in"; oRule.style.marginBottom = bottom + "in"; zoomRatio = 0.5; oRule.style.width = (conWidth / zoomRatio) + "in"; oRule.style.height = (conHeight / zoomRatio) + "in"; oRule.style.zoom = (zoomRatio * 100) + "%";


【メモ】9/1の日記でファイル名が間違っていたので修正。
PREVIEW.HTM → PREVIEW.DLG