    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import static org.opengion.fukurou.util.StringUtil.nval;
    019
    020import java.io.File;
    021
    022import org.opengion.fukurou.util.StringUtil;
    023import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    024import org.opengion.hayabusa.common.HybsSystem;
    025import org.opengion.hayabusa.report2.DocConverter_OOO;
    026
    027/**
    028 * ドキュメントの変換・マージを行うタグです。
    029 *
    030 * 変換を行うことのできる入出力のフォーマット以下の通りです。
    031 *
    032 * [対応フォーマット]
    033 *  入力[Calc(ods)   ,Excel(xls)     ] ⇒ 出力[Calc(ods)   ,Excel(xls)     ,PDF]
    034 *  入力[Writer(odt) ,Word(doc)      ] ⇒ 出力[Writer(odt) ,Word(doc)      ,PDF]
    035 *  入力[Impress(odp),PowerPoint(ppt)] ⇒ 出力[Impress(odp),PowerPoint(ppt),PDF]
    036 *
    037 * 入出力のフォーマットは、入出力ファイルの拡張子により自動判別されます。
    038 * また、入出力ファイル名が同じ場合は何も処理されません。
    039 *
    040 * 入力ファイルを、CSV形式で複数指定することで、複数の入力ファイルをマージして
    041 * 出力することもできます。
    042 *
    043 * ※2 現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。
    044 * ※1 この機能を利用するには、OpenOfficeが正しく設定されている必要があります。
    045 *
    046 * @og.formSample
    047 * ●形式：&lt;og:docConvert fileURL="…" inputFile="…" outputFile="…" /&gt;
    048 * ●body：なし
    049 *
    050 * ●Tag定義：
    051 *   &lt;og:docConvert
    052 *       fileURL            【TAG】操作するファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/])
    053 *       inputFile        ○【TAG】入力ファイル名を指定します(必須)。
    054 *       outputFile       ○【TAG】出力ファイル名を指定します(必須)。
    055 *       delInput           【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])
    056 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    057 *   /&gt;
    058 *
    059 * ●使用例
    060 *    ・Calc(ods)ファイルをPDFに変換
    061 *        &lt;og:docConvert inputFile="temp.ods" outputFile="out.pdf" /&gt;
    062 *
    063 *    ・Excel(xls)ファイルを連結
    064 *        &lt;og:docConvert inputFile="temp1.xls,temp2.xls" outputFile="out.xls" /&gt;
    065 *
    066 * @og.group その他部品
    067 *
    068 * @version  4.0
    069 * @author       Hiroki Nakamura
    070 * @since    JDK5.0,
    071 */
    072public class DocConvertTag extends CommonTagSupport {
    073        /** このプログラムのVERSION文字列を設定します。   {@value} */
    074        private static final String VERSION = "6.4.2.1 (2016/02/05)" ;
    075        private static final long serialVersionUID = 642120160205L ;
    076
    077        private String  fileURL         = HybsSystem.sys( "FILE_URL" );
    078        private String[]inputFile       ;
    079        private String  outputFile      ;
    080        private boolean delInput        ;
    081
    082        /**
    083         * デフォルトコンストラクター
    084         *
    085         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    086         */
    087        public DocConvertTag() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    088
    089        /**
    090         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    091         *
    092         * @return      後続処理の指示( SKIP_BODY )
    093         */
    094        @Override
    095        public int doStartTag() {
    096                return SKIP_BODY ;
    097        }
    098
    099        /**
    100         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    101         *
    102         * @return      後続処理の指示
    103         */
    104        @Override
    105        public int doEndTag() {
    106                debugPrint();
    107
    108                // 出力ファイルで拡張子だけが指定された場合は、入力ファイル名を付加する
    109                if( outputFile.indexOf( '.' ) < 0 ) {
    110                        final int inSufIdx = inputFile[0].lastIndexOf( '.' );
    111                        if( inSufIdx >= 0 ) {
    112                                outputFile = inputFile[0].substring( 0, inSufIdx ) + "." + outputFile;
    113                        }
    114
    115                }
    116
    117                final String directory = HybsSystem.url2dir( fileURL );
    118                String[] input = new String[inputFile.length];
    119                for( int i=0; i<input.length; i++ ) {
    120                        input[i] = StringUtil.urlAppend( directory,inputFile[i] );
    121                }
    122                final String output = StringUtil.urlAppend( directory,outputFile );
    123
    124                // ドキュメント変換
    125                DocConverter_OOO.convert( input, output );
    126
    127                if( delInput ) {
    128                        for( int i=0; i<input.length; i++ ) {
    129                                if( !( new File( input[i] ) ).delete() ) {
    130                                        System.err.println( "入力ファイルの削除に失敗しました。file=[" + input[i] + "]" );
    131                                }
    132                        }
    133                }
    134
    135                return EVAL_PAGE ;
    136        }
    137
    138        /**
    139         * タグリブオブジェクトをリリースします。
    140         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    141         *
    142         */
    143        @Override
    144        protected void release2() {
    145                super.release2();
    146                fileURL         = HybsSystem.sys( "FILE_URL" );
    147                inputFile       = null;
    148                outputFile      = null;
    149                delInput        = false;
    150        }
    151
    152        /**
    153         * 【TAG】操作するファイルのディレクトリを指定します
    154         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。
    155         *
    156         * @og.tag
    157         * この属性で指定されるディレクトリのファイルを操作します。
    158         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    159         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    160         * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。
    161         *
    162         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。
    163         *
    164         * @param       url ファイルURL
    165         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
    166         */
    167        public void setFileURL( final String url ) {
    168                final String furl = nval( getRequestParameter( url ),null );
    169                if( furl != null ) {
    170                        fileURL = StringUtil.urlAppend( fileURL,furl );
    171                }
    172        }
    173
    174        /**
    175         * 【TAG】入力ファイル名を指定します。
    176         *
    177         * @og.tag
    178         * 入力ファイル名を指定します。
    179         *
    180         * 入力ファイルは、CSV形式で複数指定することができます。
    181         * この場合、複数の入力ファイルをマージして出力を行います。
    182         *
    183         * ※現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。
    184         *   また、マージを行う場合、印刷範囲など、ドキュメントに関連する情報は、1つ目のファイルの
    185         *   情報が使用されます。
    186         *
    187         * @param       fname 入力ファイル名
    188         */
    189        public void setInputFile( final String fname ) {
    190                inputFile = getCSVParameter( fname );
    191        }
    192
    193        /**
    194         * 【TAG】出力ファイル名を指定します。
    195         *
    196         * @og.tag
    197         * 出力ファイル名を指定します。
    198         * 出力ファイルには、拡張子のみ(xls,ods等)を指定することもできます。
    199         * この場合、出力ファイル名は、入力ファイル名と同じになります。(拡張子のみが変換される)
    200         *
    201         * @param       fname 出力ファイル名
    202         */
    203        public void setOutputFile( final String fname ) {
    204                outputFile = nval( getRequestParameter( fname ),outputFile );
    205        }
    206
    207        /**
    208         * 【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])。
    209         *
    210         * @og.tag
    211         * ドキュメント変換後、元のファイルを削除するかどうかを指定します。
    212         * 初期値は、false(削除しない)です。
    213         *
    214         * @param       flag 元ファイルの削除 [true:する/false:しない]
    215         */
    216        public void setDelInput( final String flag ) {
    217                delInput = nval( getRequestParameter( flag ),delInput );
    218        }
    219
    220        /**
    221         * このオブジェクトの文字列表現を返します。
    222         * 基本的にデバッグ目的に使用します。
    223         *
    224         * @return このクラスの文字列表現
    225         * @og.rtnNotNull
    226         */
    227        @Override
    228        public String toString() {
    229                return ToString.title( this.getClass().getName() )
    230                                .println( "VERSION"             ,VERSION        )
    231                                .println( "fileURL"             ,fileURL        )
    232                                .println( "inputFile"   ,inputFile              )
    233                                .println( "outputFile"  ,outputFile             )
    234                                .println( "Other..."    ,getAttributes().getAttribute() )
    235                                .fixForm().toString() ;
    236        }
    237}