Akira's Tech Notes

Java/JVM | GNU/Linux | Emacs/Lisp | 知的好奇心駆動

header-icon
ネイティブでない日本語で思い付くことや気になることをダラダラ書く、体裁とかは気にしない。読みづらいと感じた時に随時更新する。

[検証]ADF印刷プレビュー機能

Oracle ADFの印刷機能にたずさわる機会がありましたので、一部調査した内容を ここでメモしておきます。サンプルコードは Github に登録しています。

1 検証内容

  1. af:showPrintablePageBehavior タグの使い方
  2. 印刷内容の制御
  3. IE印刷プレビュー画面を出す

2 af:showPrintablePageBehaviorタグの使い方

af:showPrintablePageBehavior タグを画面に任意のcommandコンポネントの子コンポネント として入れれば、そのcommandコンポネントがトリガーされると印刷プレビュー画面が新規ブラ ウザ画面にて表示される。

3 印刷内容の制御

基本的に全画面(同じjspx)の内容が印刷プレビュー画面に表示される。一部コンポネント (例: af:menuBar ) は表示しない仕様となっている。またレイアウトコンテナに af:panelSplitteraf: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(); 
  };
}

ブラウザのセキュリティ設定に注意が必要です。

Comments