Table of Contents
Oracle ADFの印刷機能にたずさわる機会がありましたので、一部調査した内容を ここでメモしておきます。サンプルコードは Github に登録しています。
1 検証内容
af:showPrintablePageBehavior
タグの使い方- 印刷内容の制御
- IE印刷プレビュー画面を出す
2 af:showPrintablePageBehaviorタグの使い方
af:showPrintablePageBehavior
タグを画面に任意のcommandコンポネントの子コンポネント
として入れれば、そのcommandコンポネントがトリガーされると印刷プレビュー画面が新規ブラ
ウザ画面にて表示される。
3 印刷内容の制御
基本的に全画面(同じjspx)の内容が印刷プレビュー画面に表示される。一部コンポネント
(例: af:menuBar
) は表示しない仕様となっている。またレイアウトコンテナに
af:panelSplitter
や af:panelAccordion
が使用された場合、アクティビティとなってい
るレイアウトアイテムしかが印刷画面に表示しない。 af:showPrintablePageBehavior
タグ
の配置場所にもよります。
また、 f:view
タグの beforePhase
リスナーにて印刷プレビュー画面に表示する内容を
カスタマイズ(非表示制御)することができる。
サンプル DataView.jspx
の定義
サンプル beforePhase
リスナー
public void beforePhaseMethod(PhaseEvent phaseEvent) { System.out.println("---------- phaseEvent -------------"); System.out.println("phaseEvent.getPhaseId():" + phaseEvent.getPhaseId()); //only perform action if RENDER_RESPONSE phase is reached if (phaseEvent.getPhaseId() == PhaseId.RENDER_RESPONSE) { FacesContext fctx = FacesContext.getCurrentInstance(); //check internal request parameter Map requestMap = fctx.getExternalContext().getRequestMap(); // リクエストコンテキストに印刷らしきキーを特定 Object showPrintableBehavior = requestMap.get("oracle.adfinternal.view.faces.el.PrintablePage"); if (showPrintableBehavior != null) { // 印刷画面のカスタマイズ if (Boolean.TRUE == showPrintableBehavior) { // コンポネントIDを用いて隠す処理を実施する UiComponentControlUtil.setUnRendered("mb1", "it1", "it2"); UiComponentControlUtil.callbackJavascript("customPrint();"); } } } }
4 IE印刷プレビュー画面を出す
いい方法が見つからない、とりあえずWebBrowserというIEに含まれたActiveXコンポーネントを 利用します。
function customPrint() { if (getBrowser().indexOf('ie8') !== -1 ) { if(window.ActiveXObject == null || document.body.insertAdjacentHTML == null) { return; } var sWebBrowserCode = '<object width="0" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>'; document.body.insertAdjacentHTML('beforeEnd', sWebBrowserCode); var objWebBrowser = document.body.lastChild; if(objWebBrowser == null) return; objWebBrowser.ExecWB(7, 1); document.body.removeChild(objWebBrowser); } else { window.print(); } // 印刷プレビュー画面閉じる→HTML画面を閉じる window.onfocus = function(){ (window.open('','_self').opener=window).close(); }; }
ブラウザのセキュリティ設定に注意が必要です。