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 final String directory = HybsSystem.url2dir( fileURL ); 117 String[] input = new String[inputFile.length]; 118 for( int i=0; i<input.length; i++ ) { 119 input[i] = StringUtil.urlAppend( directory,inputFile[i] ); 120 } 121 final String output = StringUtil.urlAppend( directory,outputFile ); 122 123 // ドキュメント変換 124 DocConverter_OOO.convert( input, output ); 125 126 if( delInput ) { 127 for( int i=0; i<input.length; i++ ) { 128 if( !( new File( input[i] ) ).delete() ) { 129 System.err.println( "入力ファイルの削除に失敗しました。file=[" + input[i] + "]" ); 130 } 131 } 132 } 133 134 return EVAL_PAGE ; 135 } 136 137 /** 138 * タグリブオブジェクトをリリースします。 139 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 140 * 141 */ 142 @Override 143 protected void release2() { 144 super.release2(); 145 fileURL = HybsSystem.sys( "FILE_URL" ); 146 inputFile = null; 147 outputFile = null; 148 delInput = false; 149 } 150 151 /** 152 * 【TAG】操作するファイルのディレクトリを指定します 153 * (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])。 154 * 155 * @og.tag 156 * この属性で指定されるディレクトリのファイルを操作します。 157 * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、 158 * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、 159 * (初期値:システム定数のFILE_URL[={@og.value SystemData#FILE_URL}])。 160 * 161 * @og.rev 6.4.2.1 (2016/02/05) URLの最後に、"/" を追加する処理を廃止。 162 * 163 * @param url ファイルURL 164 * @see org.opengion.hayabusa.common.SystemData#FILE_URL 165 */ 166 public void setFileURL( final String url ) { 167 final String furl = nval( getRequestParameter( url ),null ); 168 if( furl != null ) { 169 fileURL = StringUtil.urlAppend( fileURL,furl ); 170 } 171 } 172 173 /** 174 * 【TAG】入力ファイル名を指定します。 175 * 176 * @og.tag 177 * 入力ファイル名を指定します。 178 * 179 * 入力ファイルは、CSV形式で複数指定することができます。 180 * この場合、複数の入力ファイルをマージして出力を行います。 181 * 182 * ※現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。 183 * また、マージを行う場合、印刷範囲など、ドキュメントに関連する情報は、1つ目のファイルの 184 * 情報が使用されます。 185 * 186 * @param fname 入力ファイル名 187 */ 188 public void setInputFile( final String fname ) { 189 inputFile = getCSVParameter( fname ); 190 } 191 192 /** 193 * 【TAG】出力ファイル名を指定します。 194 * 195 * @og.tag 196 * 出力ファイル名を指定します。 197 * 出力ファイルには、拡張子のみ(xls,ods等)を指定することもできます。 198 * この場合、出力ファイル名は、入力ファイル名と同じになります。(拡張子のみが変換される) 199 * 200 * @param fname 出力ファイル名 201 */ 202 public void setOutputFile( final String fname ) { 203 outputFile = nval( getRequestParameter( fname ),outputFile ); 204 } 205 206 /** 207 * 【TAG】ドキュメント変換後、元のファイルを削除するかどうかを指定します(初期値:false[=削除しない])。 208 * 209 * @og.tag 210 * ドキュメント変換後、元のファイルを削除するかどうかを指定します。 211 * 初期値は、false(削除しない)です。 212 * 213 * @param flag 元ファイルの削除 [true:する/false:しない] 214 */ 215 public void setDelInput( final String flag ) { 216 delInput = nval( getRequestParameter( flag ),delInput ); 217 } 218 219 /** 220 * このオブジェクトの文字列表現を返します。 221 * 基本的にデバッグ目的に使用します。 222 * 223 * @return このクラスの文字列表現 224 * @og.rtnNotNull 225 */ 226 @Override 227 public String toString() { 228 return ToString.title( this.getClass().getName() ) 229 .println( "VERSION" ,VERSION ) 230 .println( "fileURL" ,fileURL ) 231 .println( "inputFile" ,inputFile ) 232 .println( "outputFile" ,outputFile ) 233 .println( "Other..." ,getAttributes().getAttribute() ) 234 .fixForm().toString() ; 235 } 236}