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 * ●形式:<og:docConvert fileURL="…" inputFile="…" outputFile="…" /> 048 * ●body:なし 049 * 050 * ●Tag定義: 051 * <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 * /> 058 * 059 * ●使用例 060 * ・Calc(ods)ファイルをPDFに変換 061 * <og:docConvert inputFile="temp.ods" outputFile="out.pdf" /> 062 * 063 * ・Excel(xls)ファイルを連結 064 * <og:docConvert inputFile="temp1.xls,temp2.xls" outputFile="out.xls" /> 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) または、2文字目が、 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}