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
の定義
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version='1.0' encoding='UTF-8'?> | |
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" | |
xmlns:f="http://java.sun.com/jsf/core" | |
xmlns:h="http://java.sun.com/jsf/html" | |
xmlns:af="http://xmlns.oracle.com/adf/faces/rich"> | |
<jsp:directive.page contentType="text/html;charset=UTF-8"/> | |
<!--★beforePhaseリスナーの登録 --> | |
<f:view beforePhase="#{pageFlowScope.DataViewBean.beforePhaseMethod}"> | |
<af:document id="d1"> | |
<af:form id="f1"> | |
<af:resource type="javascript" source="/js/CustomPrint.js"/> | |
<af:panelStretchLayout id="psl1"> | |
<f:facet name="bottom"> | |
<af:panelGroupLayout layout="scroll" | |
xmlns:af="http://xmlns.oracle.com/adf/faces/rich" | |
id="pgl2"> | |
<af:panelGroupLayout id="pgl3"> | |
<!-- ★印刷ボタンの定義 --> | |
<af:commandButton text="印刷" id="cb1" | |
inlineStyle="font-size:large;"> | |
<af:showPrintablePageBehavior/> | |
</af:commandButton> | |
</af:panelGroupLayout> | |
</af:panelGroupLayout> | |
</f:facet> | |
<f:facet name="center"> | |
<af:table var="row" rowBandingInterval="0" id="t1" | |
value="#{pageFlowScope.DataViewBean.dataList}"> | |
<af:column sortable="false" headerText="列1" id="c2" width="200"> | |
<af:outputText value="#{row.col1}" id="ot5"/> | |
</af:column> | |
<af:column sortable="false" headerText="列2" id="c5" width="200"> | |
<af:outputText value="#{row.col2}" id="ot1"/> | |
</af:column> | |
<af:column sortable="false" headerText="列3" id="c1" width="200"> | |
<af:outputText value="#{row.col3}" id="ot3"/> | |
</af:column> | |
<af:column sortable="false" headerText="列4" id="c3" width="200"> | |
<af:outputText value="#{row.col4}" id="ot2"/> | |
</af:column> | |
</af:table> | |
</f:facet> | |
<f:facet name="start"/> | |
<f:facet name="end"/> | |
<f:facet name="top"> | |
<af:panelGroupLayout id="pgl1" layout="horizontal"> | |
<af:outputLabel value="印刷プレビューテスト" id="ol1" inlineStyle="font-size:xx-large;"/> | |
<!-- ★以降は印刷しないように --> | |
<af:menuBar id="mb1"> | |
<af:menu text="menu 1" id="m1"/> | |
<af:menu text="menu 2" id="m2"/> | |
<af:menu text="menu 3" id="m3"/> | |
</af:menuBar> | |
<af:inputText label="Label 1" id="it1"/> | |
<af:inputText label="Label 2" id="it2"/> | |
</af:panelGroupLayout> | |
</f:facet> | |
</af:panelStretchLayout> | |
</af:form> | |
</af:document> | |
</f:view> | |
</jsp:root> |
サンプル 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(); }; }
ブラウザのセキュリティ設定に注意が必要です。