    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.hayabusa.common.HybsSystem;
    024import org.opengion.hayabusa.report2.DocConverter_OOO;
    025
    026/**
    027 * ドキュメントの変換・マージを行うタグです。
    028 *
    029 * 変換を行うことのできる入出力のフォーマット以下の通りです。
    030 *
    031 * [対応フォーマット]
    032 *  入力[Calc(ods)   ,Excel(xls)     ] ⇒ 出力[Calc(ods)   ,Excel(xls)     ,PDF]
    033 *  入力[Writer(odt) ,Word(doc)      ] ⇒ 出力[Writer(odt) ,Word(doc)      ,PDF]
    034 *  入力[Impress(odp),PowerPoint(ppt)] ⇒ 出力[Impress(odp),PowerPoint(ppt),PDF]
    035 *
    036 * 入出力のフォーマットは、入出力ファイルの拡張子により自動判別されます。
    037 * また、入出力ファイル名が同じ場合は何も処理されません。
    038 *
    039 * 入力ファイルを、カンマ区切りで複数指定することで、複数の入力ファイルをマージして
    040 * 出力することもできます。
    041 *
    042 * ※2 現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。
    043 * ※1 この機能を利用するには、OpenOfficeが正しく設定されている必要があります。
    044 *
    045 * @og.formSample
    046 * ●形式：&lt;og:docConvert fileURL="…" inputFile="…" outputFile="…" /&gt;
    047 * ●body：なし
    048 *
    049 * ●Tag定義：
    050 *   &lt;og:docConvert
    051 *       fileURL            【TAG】操作するファイルのディレクトリを指定します (初期値:FILE_URL[=filetemp/])
    052 *       inputFile        ○【TAG】入力ファイル名を指定します(必須)。
    053 *       outputFile       ○【TAG】出力ファイル名を指定します(必須)。
    054 *       delInput           【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])
    055 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    056 *   /&gt;
    057 *
    058 * ●使用例
    059 *    ・Calc(ods)ファイルをPDFに変換
    060 *        &lt;og:docConvert inputFile="temp.ods" outputFile="out.pdf" /&gt;
    061 *
    062 *    ・Excel(xls)ファイルを連結
    063 *        &lt;og:docConvert inputFile="temp1.xls,temp2.xls" outputFile="out.xls" /&gt;
    064 *
    065 * @og.group その他部品
    066 *
    067 * @version  4.0
    068 * @author       Hiroki Nakamura
    069 * @since    JDK5.0,
    070 */
    071public class DocConvertTag extends CommonTagSupport {
    072        //* このプログラムのVERSION文字列を設定します。   {@value} */
    073        private static final String VERSION = "5.1.6.0 (2010/05/06)" ;
    074
    075        private static final long serialVersionUID = 516020100506L ;
    076
    077        private String  fileURL         = HybsSystem.sys( "FILE_URL" );
    078        private String[]inputFile       = null;
    079        private String  outputFile      = null;
    080        private boolean delInput        = false;
    081
    082        /**
    083         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    084         *
    085         * @return      後続処理の指示( SKIP_BODY )
    086         */
    087        @Override
    088        public int doStartTag() {
    089                return ( SKIP_BODY );
    090        }
    091
    092        /**
    093         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    094         *
    095         * @return      後続処理の指示
    096         */
    097        @Override
    098        public int doEndTag() {
    099                debugPrint();
    100
    101                // 出力ファイルで拡張子だけが指定された場合は、入力ファイル名を付加する
    102                if( outputFile.indexOf( '.' ) < 0 ) {
    103                        int inSufIdx = inputFile[0].lastIndexOf( '.' );
    104                        if( inSufIdx >= 0 ) {
    105                                outputFile = inputFile[0].substring( 0, inSufIdx ) + "." + outputFile;
    106                        }
    107
    108                }
    109
    110                String directory = HybsSystem.url2dir( fileURL );
    111                String[] input = new String[inputFile.length];
    112                for( int i=0; i<input.length; i++ ) {
    113                        input[i] = StringUtil.urlAppend( directory,inputFile[i] );
    114                }
    115                String output = StringUtil.urlAppend( directory,outputFile );
    116
    117                // ドキュメント変換
    118                DocConverter_OOO.convert( input, output );
    119
    120                if( delInput ) {
    121                        for( int i=0; i<input.length; i++ ) {
    122                                if( !( new File( input[i] ) ).delete() ) {
    123                                        System.err.println( "入力ファイルの削除に失敗しました。file=[" + input[i] + "]" );
    124                                }
    125                        }
    126                }
    127
    128                return( EVAL_PAGE );
    129        }
    130
    131        /**
    132         * タグリブオブジェクトをリリースします。
    133         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    134         *
    135         */
    136        @Override
    137        protected void release2() {
    138                super.release2();
    139                fileURL         = HybsSystem.sys( "FILE_URL" );
    140                inputFile       = null;
    141                outputFile      = null;
    142                delInput        = false;
    143        }
    144
    145        /**
    146         * 【TAG】操作するファイルのディレクトリを指定します
    147         *              (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])。
    148         *
    149         * @og.tag
    150         * この属性で指定されるディレクトリのファイルを操作します。
    151         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    152         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    153         * (初期値:システム定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])。
    154         *
    155         * @param       url ファイルURL
    156         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
    157         */
    158        public void setFileURL( final String url ) {
    159                String furl = nval( getRequestParameter( url ),null );
    160                if( furl != null ) {
    161                        char ch = furl.charAt( furl.length()-1 );
    162                        if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
    163                        fileURL = StringUtil.urlAppend( fileURL,furl );
    164                }
    165        }
    166
    167        /**
    168         * 【TAG】入力ファイル名を指定します。
    169         *
    170         * @og.tag
    171         * 入力ファイル名を指定します。
    172         *
    173         * 入力ファイルは、カンマ区切りで複数指定することができます。
    174         * この場合、複数の入力ファイルをマージして出力を行います。
    175         *
    176         * ※現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。
    177         *   また、マージを行う場合、印刷範囲など、ドキュメントに関連する情報は、1つ目のファイルの
    178         *   情報が使用されます。
    179         *
    180         * @param       fname 入力ファイル名
    181         */
    182        public void setInputFile( final String fname ) {
    183                inputFile = getCSVParameter( fname );
    184        }
    185
    186        /**
    187         * 【TAG】出力ファイル名を指定します。
    188         *
    189         * @og.tag
    190         * 出力ファイル名を指定します。
    191         * 出力ファイルには、拡張子のみ(xls,ods等)を指定することもできます。
    192         * この場合、出力ファイル名は、入力ファイル名と同じになります。(拡張子のみが変換される)
    193         *
    194         * @param       fname 出力ファイル名
    195         */
    196        public void setOutputFile( final String fname ) {
    197                outputFile = nval( getRequestParameter( fname ),outputFile );
    198        }
    199
    200        /**
    201         * 【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])。
    202         *
    203         * @og.tag
    204         * ドキュメント変換後、元のファイルを削除するかどうかを指定します。
    205         * (初期値:false(削除しない))
    206         *
    207         * @param       flg 出力元のファイルを削除するかどうか名
    208         */
    209        public void setDelInput( final String flg ) {
    210                delInput = nval( getRequestParameter( flg ),delInput );
    211        }
    212
    213        /**
    214         * このオブジェクトの文字列表現を返します。
    215         * 基本的にデバッグ目的に使用します。
    216         *
    217         * @return このクラスの文字列表現
    218         */
    219        @Override
    220        public String toString() {
    221                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    222                                .println( "VERSION"             ,VERSION        )
    223                                .println( "fileURL"             ,fileURL        )
    224                                .println( "inputFile"   ,inputFile              )
    225                                .println( "outputFile"  ,outputFile             )
    226                                .println( "Other..."    ,getAttributes().getAttribute() )
    227                                .fixForm().toString() ;
    228        }
    229}