1 32 33 package it.businesslogic.ireport.export; 34 35 import java.io.File ; 36 import java.io.FileOutputStream ; 37 import java.io.IOException ; 38 import java.io.OutputStream ; 39 import java.io.OutputStreamWriter ; 40 import java.io.StringWriter ; 41 import java.io.Writer ; 42 import java.util.ArrayList ; 43 import java.util.Collection ; 44 import java.util.Collections ; 45 import java.util.Iterator ; 46 import java.util.List ; 47 import java.util.StringTokenizer ; 48 import java.util.Vector ; 49 50 import net.sf.jasperreports.engine.export.*; 51 import net.sf.jasperreports.engine.JRAbstractExporter; 52 import net.sf.jasperreports.engine.JRException; 53 import net.sf.jasperreports.engine.JRExporterParameter; 54 import net.sf.jasperreports.engine.JRPrintElement; 55 import net.sf.jasperreports.engine.JRPrintPage; 56 import net.sf.jasperreports.engine.JRPrintText; 57 58 69 public class JRTxtExporter extends JRAbstractExporter { 70 71 72 public JRTxtExporter() { 73 74 } 75 76 int PAGE_ROWS = 61; 77 int PAGE_COLUMNS = 255; 78 int CHAR_UNIT_H = 10; 79 int CHAR_UNIT_V = 20; 80 boolean ADD_FORM_FEED = true; 81 82 85 protected String delimiter = null; 86 87 90 protected Writer writer = null; 91 protected JRExportProgressMonitor progressMonitor = null; 92 93 96 public void exportReport() throws JRException 97 { 98 progressMonitor = (JRExportProgressMonitor)parameters.get(JRExporterParameter.PROGRESS_MONITOR); 99 100 101 setInput(); 102 103 104 setPageRange(); 105 106 107 String encoding = (String )parameters.get(JRExporterParameter.CHARACTER_ENCODING); 108 if (encoding == null) 109 { 110 encoding = "ISO-8859-1"; 111 } 112 113 114 String page_rows = (String )parameters.get(JRTxtExporterParameter.PAGE_ROWS); 115 if (page_rows != null) 116 { 117 PAGE_ROWS = Integer.parseInt(page_rows);; 118 } 119 else 120 { 121 PAGE_ROWS = this.jasperPrint.getPageHeight()/20; 122 } 123 124 String page_cols = (String )parameters.get(JRTxtExporterParameter.PAGE_COLUMNS); 125 if (page_cols != null) 126 { 127 PAGE_COLUMNS = Integer.parseInt(page_cols); 128 } 129 else 130 { 131 PAGE_COLUMNS = this.jasperPrint.getPageWidth() / this.CHAR_UNIT_H; 132 } 133 134 Object add_form_feed = parameters.get(JRTxtExporterParameter.ADD_FORM_FEED); 135 if ( add_form_feed != null ){ 136 137 ADD_FORM_FEED = (add_form_feed+"").equals("true"); 138 } else{ 139 ADD_FORM_FEED = true; 140 } 141 142 143 144 delimiter = ","; 145 146 StringBuffer sb = (StringBuffer )parameters.get(JRXmlExporterParameter.OUTPUT_STRING_BUFFER); 147 if (sb != null) 148 { 149 try 150 { 151 writer = new StringWriter (); 152 exportReportToWriter(); 153 sb.append(writer.toString()); 154 } 155 catch (IOException e) 156 { 157 throw new JRException("Error writing to StringBuffer writer : " + jasperPrint.getName(), e); 158 } 159 finally 160 { 161 if (writer != null) 162 { 163 try 164 { 165 writer.close(); 166 } 167 catch(IOException e) 168 { 169 } 170 } 171 } 172 } 173 else 174 { 175 writer = (Writer )parameters.get(JRExporterParameter.OUTPUT_WRITER); 176 if (writer != null) 177 { 178 try 179 { 180 exportReportToWriter(); 181 } 182 catch (IOException e) 183 { 184 throw new JRException("Error writing to writer : " + jasperPrint.getName(), e); 185 } 186 } 187 else 188 { 189 OutputStream os = (OutputStream )parameters.get(JRExporterParameter.OUTPUT_STREAM); 190 if (os != null) 191 { 192 try 193 { 194 writer = new OutputStreamWriter (os, encoding); 195 exportReportToWriter(); 196 } 197 catch (IOException e) 198 { 199 throw new JRException("Error writing to OutputStream writer : " + jasperPrint.getName(), e); 200 } 201 } 202 else 203 { 204 File destFile = (File )parameters.get(JRExporterParameter.OUTPUT_FILE); 205 if (destFile == null) 206 { 207 String fileName = (String )parameters.get(JRExporterParameter.OUTPUT_FILE_NAME); 208 if (fileName != null) 209 { 210 destFile = new File (fileName); 211 } 212 else 213 { 214 throw new JRException("No output specified for the exporter."); 215 } 216 } 217 218 try 219 { 220 os = new FileOutputStream (destFile); 221 writer = new OutputStreamWriter (os, encoding); 222 exportReportToWriter(); 223 } 224 catch (IOException e) 225 { 226 throw new JRException("Error writing to file writer : " + jasperPrint.getName(), e); 227 } 228 finally 229 { 230 if (writer != null) 231 { 232 try 233 { 234 writer.close(); 235 } 236 catch(IOException e) 237 { 238 } 239 } 240 } 241 } 242 } 243 } 244 } 245 246 247 250 protected void exportReportToWriter() throws JRException, IOException 251 { 252 List pages = jasperPrint.getPages(); 253 if (pages != null && pages.size() > 0) 254 { 255 JRPrintPage page = null; 256 257 for(int i = startPageIndex; i <= endPageIndex; i++) 258 { 259 if (Thread.currentThread().isInterrupted()) 260 { 261 throw new JRException("Current thread interrupted."); 262 } 263 264 page = (JRPrintPage)pages.get(i); 265 266 267 exportPage(page); 268 } 269 } 270 271 writer.flush(); 272 } 273 274 275 278 protected void exportPage(JRPrintPage page) throws JRException, IOException 279 { 280 Vector lines = layoutGrid(page); 281 282 int y = 0; 283 for(y = 0; y < lines.size(); y++) 284 { 285 String s = (""+lines.elementAt(y)); 286 while (s.endsWith(" ")) 287 { 288 s = s.substring(0,s.length()-1); 289 } 290 writer.write( s ) ; 291 writer.write("\n"); 292 } 293 294 while (y < PAGE_ROWS) 295 { 296 writer.write("\n"); 297 y++; 298 } 299 if (ADD_FORM_FEED) 300 { 301 writer.write("\f"); 302 } 303 304 if (progressMonitor != null) 305 { 306 progressMonitor.afterPageExport(); 307 } 308 } 309 310 311 314 protected Vector layoutGrid(JRPrintPage page) 315 { 316 Vector v_lines = new Vector (); 317 318 String void_line = ""; 319 for (int i=0; i<PAGE_COLUMNS; ++i) 320 { 321 void_line += " "; 322 } 323 324 for (int i=0; i< PAGE_ROWS ; ++i) 325 { 326 v_lines.add(void_line += " "); 327 } 328 329 List yCuts = yCuts = new ArrayList (); 330 yCuts.add(new Integer (0)); 331 yCuts.add(new Integer (jasperPrint.getPageHeight())); 332 333 Integer y = null; 334 335 Collection elems = page.getElements(); 336 for(Iterator it = elems.iterator(); it.hasNext();) 337 { 338 JRPrintElement element = ((JRPrintElement)it.next()); 339 340 if (element instanceof JRPrintText) 341 { 342 y = new Integer (element.getY()); 343 if (!yCuts.contains(y)) 344 { 345 yCuts.add(y); 346 } 347 y = new Integer (element.getY() + element.getHeight()); 348 if (!yCuts.contains(y)) 349 { 350 yCuts.add(y); 351 } 352 } 353 } 354 355 Collections.sort(yCuts); 356 int yCellCount = yCuts.size() - 1; 357 358 int real_line_num = 0; 359 360 for(int j = 0; j < yCellCount; j++) 361 { 362 if (v_lines.size() <= real_line_num) 363 { 364 v_lines.add( new String ( void_line) ); 365 } 366 367 int actual_cut = ((Integer )(yCuts.get(j))).intValue(); 368 369 int lines_used = 1; 370 for(Iterator it = elems.iterator(); it.hasNext();) 372 { 373 JRPrintElement element = ((JRPrintElement)it.next()); 374 375 if (element instanceof JRPrintText) 376 { 377 JRPrintText pt = (JRPrintText)element; 378 379 if ( pt.getY() == actual_cut) 380 { 381 int start_at = pt.getX()/CHAR_UNIT_H; 383 int len = pt.getWidth()/CHAR_UNIT_H; 384 385 String str = pt.getText(); 386 int line_height = 0; 387 if (pt.getHeight() <= CHAR_UNIT_V) { 389 390 if (str.length() > len) 391 { 392 str = str.substring(0,len); 393 } 394 395 if (pt.getY()/CHAR_UNIT_V > real_line_num) 396 { 397 real_line_num = pt.getY()/CHAR_UNIT_V; 398 } 399 if (v_lines.size() <= real_line_num) 400 { 401 v_lines.add( new String ( void_line) ); 402 } 403 String line = (String )v_lines.elementAt( real_line_num ); 404 405 406 line = replaceLineRegion(line,start_at,len,str,pt.getTextAlignment()); 407 v_lines.setElementAt(line, real_line_num); 408 } 409 else { 411 int max_field_lines = 1; 412 413 Vector field_lines = getFieldLines(str,len); 415 416 int nl = 0; 418 for (nl = 0; nl < field_lines.size(); nl++) 419 { 420 String text = (String )field_lines.elementAt(nl); 421 423 while (v_lines.size() <= (real_line_num + nl)) v_lines.add( new String ( void_line) ); 425 426 String line = (String )v_lines.elementAt( real_line_num + nl ); 427 line = replaceLineRegion(line,start_at,len,text,pt.getTextAlignment()); 428 v_lines.setElementAt(line, real_line_num + nl ); 429 if (nl > lines_used) lines_used = nl; 430 } 431 432 433 434 } 435 } 436 437 } 440 } 441 442 real_line_num += lines_used; 443 } 444 445 return v_lines; 446 } 447 448 protected String replaceLineRegion(String line,int start_at, int len, String str, byte alignment) 449 { 450 int side = 0; 451 if (alignment == net.sf.jasperreports.engine.JRAlignment.HORIZONTAL_ALIGN_CENTER) 452 { 453 side = len - str.length(); 454 if (side > 0) 455 { 456 side = side/2; 457 } 458 } 459 460 for (int k=0; k < side; ++k) 461 { 462 str = " "+str; 463 } 464 465 if (alignment == net.sf.jasperreports.engine.JRAlignment.HORIZONTAL_ALIGN_RIGHT) 466 { 467 while (str.length() < len) str = " "+str; 468 } 469 470 while (str.length() < len) str += " "; 471 472 return line.substring(0,start_at) + str + line.substring(start_at+len); 473 } 474 475 476 public Vector getFieldLines(String str, int row_len) 477 { 478 Vector lines = new Vector (); 479 480 StringTokenizer st = new StringTokenizer (str,"\n",false); 481 while (st.hasMoreTokens()) 482 { 483 String token = st.nextToken(); 484 while (token.length() > row_len) 485 { 486 String tmp_line = token.substring(0, row_len); 488 int li = tmp_line.lastIndexOf(' '); 489 if (token.charAt(row_len) == ' ') 490 { 491 lines.addElement(tmp_line); 492 token = token.substring(row_len).trim(); 493 } 494 else if (li == -1) 495 { 496 lines.addElement(tmp_line); 497 token = token.substring(row_len).trim(); 498 } 499 else 500 { 501 tmp_line = token.substring(0, li); 502 lines.addElement(tmp_line); 503 token = token.substring(li+1).trim(); 504 } 505 506 } 507 if (token.trim().length() > 0) 508 { 509 if (lines.size() == 0) lines.addElement(token); 510 else lines.addElement(token.trim()); 511 } 512 } 513 515 return lines; 516 } 517 } 518 | Popular Tags |