KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > it > businesslogic > ireport > export > JRTxtExporter


1 /*
2  * Copyright (C) 2005 - 2006 JasperSoft Corporation. All rights reserved.
3  * http://www.jaspersoft.com.
4  *
5  * Unless you have purchased a commercial license agreement from JasperSoft,
6  * the following license terms apply:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  *
12  * This program is distributed WITHOUT ANY WARRANTY; and without the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
18  * or write to:
19  *
20  * Free Software Foundation, Inc.,
21  * 59 Temple Place - Suite 330,
22  * Boston, MA USA 02111-1307
23  *
24  *
25  *
26  *
27  * JRTxtExporter.java
28  *
29  * Created on 16 aprile 2004, 10.27
30  *
31  */

32
33 package it.businesslogic.ireport.export;
34
35 import java.io.File JavaDoc;
36 import java.io.FileOutputStream JavaDoc;
37 import java.io.IOException JavaDoc;
38 import java.io.OutputStream JavaDoc;
39 import java.io.OutputStreamWriter JavaDoc;
40 import java.io.StringWriter JavaDoc;
41 import java.io.Writer JavaDoc;
42 import java.util.ArrayList JavaDoc;
43 import java.util.Collection JavaDoc;
44 import java.util.Collections JavaDoc;
45 import java.util.Iterator JavaDoc;
46 import java.util.List JavaDoc;
47 import java.util.StringTokenizer JavaDoc;
48 import java.util.Vector JavaDoc;
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 /**
59  *
60  * @author giulio toffoli
61  *
62  * This is a really simple exporter with many assumptions on report.
63  * The report page is divided in a grid of 10 pixel x 10 pixel. In each of this
64  * pixels there is a char.
65  * Elements must be inserted into this grid (so elements must have coords and dims
66  * that are multiple of 10px).
67  *
68  */

69 public class JRTxtExporter extends JRAbstractExporter {
70     
71         /** Creates a new instance of JRPdfExporter */
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     /**
83      *
84      */

85     protected String JavaDoc delimiter = null;
86
87     /**
88      *
89      */

90     protected Writer JavaDoc writer = null;
91     protected JRExportProgressMonitor progressMonitor = null;
92
93     /**
94      *
95      */

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 JavaDoc encoding = (String JavaDoc)parameters.get(JRExporterParameter.CHARACTER_ENCODING);
108         if (encoding == null)
109         {
110             encoding = "ISO-8859-1";
111         }
112         
113                 
114                 String JavaDoc page_rows = (String JavaDoc)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 JavaDoc page_cols = (String JavaDoc)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 JavaDoc 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 JavaDoc sb = (StringBuffer JavaDoc)parameters.get(JRXmlExporterParameter.OUTPUT_STRING_BUFFER);
147         if (sb != null)
148         {
149             try
150             {
151                 writer = new StringWriter JavaDoc();
152                 exportReportToWriter();
153                 sb.append(writer.toString());
154             }
155             catch (IOException JavaDoc 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 JavaDoc e)
168                     {
169                     }
170                 }
171             }
172         }
173         else
174         {
175             writer = (Writer JavaDoc)parameters.get(JRExporterParameter.OUTPUT_WRITER);
176             if (writer != null)
177             {
178                 try
179                 {
180                     exportReportToWriter();
181                 }
182                 catch (IOException JavaDoc e)
183                 {
184                     throw new JRException("Error writing to writer : " + jasperPrint.getName(), e);
185                 }
186             }
187             else
188             {
189                 OutputStream JavaDoc os = (OutputStream JavaDoc)parameters.get(JRExporterParameter.OUTPUT_STREAM);
190                 if (os != null)
191                 {
192                     try
193                     {
194                         writer = new OutputStreamWriter JavaDoc(os, encoding);
195                         exportReportToWriter();
196                     }
197                     catch (IOException JavaDoc e)
198                     {
199                         throw new JRException("Error writing to OutputStream writer : " + jasperPrint.getName(), e);
200                     }
201                 }
202                 else
203                 {
204                     File JavaDoc destFile = (File JavaDoc)parameters.get(JRExporterParameter.OUTPUT_FILE);
205                     if (destFile == null)
206                     {
207                         String JavaDoc fileName = (String JavaDoc)parameters.get(JRExporterParameter.OUTPUT_FILE_NAME);
208                         if (fileName != null)
209                         {
210                             destFile = new File JavaDoc(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 JavaDoc(destFile);
221                         writer = new OutputStreamWriter JavaDoc(os, encoding);
222                         exportReportToWriter();
223                     }
224                     catch (IOException JavaDoc 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 JavaDoc e)
237                             {
238                             }
239                         }
240                     }
241                 }
242             }
243         }
244     }
245
246
247     /**
248      *
249      */

250     protected void exportReportToWriter() throws JRException, IOException JavaDoc
251     {
252         List JavaDoc 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     /**
276      *
277      */

278     protected void exportPage(JRPrintPage page) throws JRException, IOException JavaDoc
279     {
280         Vector JavaDoc lines = layoutGrid(page);
281                 
282                 int y = 0;
283         for(y = 0; y < lines.size(); y++)
284         {
285                         String JavaDoc 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     /**
312      *
313      */

314     protected Vector JavaDoc layoutGrid(JRPrintPage page)
315         {
316                 Vector JavaDoc v_lines = new Vector JavaDoc();
317                 
318                 String JavaDoc 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 JavaDoc yCuts = yCuts = new ArrayList JavaDoc();
330                 yCuts.add(new Integer JavaDoc(0));
331                 yCuts.add(new Integer JavaDoc(jasperPrint.getPageHeight()));
332
333                 Integer JavaDoc y = null;
334
335                 Collection JavaDoc elems = page.getElements();
336                 for(Iterator JavaDoc it = elems.iterator(); it.hasNext();)
337                 {
338                             JRPrintElement element = ((JRPrintElement)it.next());
339
340                             if (element instanceof JRPrintText)
341                             {
342                                     y = new Integer JavaDoc(element.getY());
343                                     if (!yCuts.contains(y))
344                                     {
345                                             yCuts.add(y);
346                                     }
347                                     y = new Integer JavaDoc(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 JavaDoc( void_line) );
365                         }
366                         
367                         int actual_cut = ((Integer JavaDoc)(yCuts.get(j))).intValue();
368                         
369                         int lines_used = 1;
370                         // Look for all elements that have Y = actual cut
371
for(Iterator JavaDoc 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                                     // 1. take starting char...
382
int start_at = pt.getX()/CHAR_UNIT_H;
383                                     int len = pt.getWidth()/CHAR_UNIT_H;
384                                     
385                                     String JavaDoc str = pt.getText();
386                                     int line_height = 0;
387                                     if (pt.getHeight() <= CHAR_UNIT_V) // Single line object
388
{
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 JavaDoc( void_line) );
402                                         }
403                                         String JavaDoc line = (String JavaDoc)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 // is a multiline...
410
{
411                                         int max_field_lines = 1;
412
413                                         //Vector field_lines = getFieldLines(line_height + " " + pt.getHeight() + " " + max_field_lines + str,len);
414
Vector JavaDoc field_lines = getFieldLines(str,len);
415                                         
416                                         // For each line, write the right text...
417
int nl = 0;
418                                        for (nl = 0; nl < field_lines.size(); nl++)
419                                        {
420                                            String JavaDoc text = (String JavaDoc)field_lines.elementAt(nl);
421                                            //text = text.replace(' ','*');
422

423                                            //text = field_lines.size()+ " " +text;
424
while (v_lines.size() <= (real_line_num + nl)) v_lines.add( new String JavaDoc( void_line) );
425                                            
426                                            String JavaDoc line = (String JavaDoc)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                 //isRowUsed[y1] = true;
438
//isColUsed[x1] = true;
439
}
440                         }
441                         
442                         real_line_num += lines_used;
443         }
444                 
445                 return v_lines;
446     }
447     
448         protected String JavaDoc replaceLineRegion(String JavaDoc line,int start_at, int len, String JavaDoc 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 JavaDoc getFieldLines(String JavaDoc str, int row_len)
477         {
478             Vector JavaDoc lines = new Vector JavaDoc();
479             
480             StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(str,"\n",false);
481             while (st.hasMoreTokens())
482             {
483                 String JavaDoc token = st.nextToken();
484                 while (token.length() > row_len)
485                 {
486                     // Find the last space before character row_len....
487
String JavaDoc 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             //lines.addElement("" +row_len);
514

515             return lines;
516         }
517 }
518
Popular Tags