View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.custom.exporter.util;
20  
21  import java.io.ByteArrayOutputStream;
22  import java.io.IOException;
23  import java.util.List;
24  
25  import javax.faces.component.UIColumn;
26  import javax.faces.component.UIComponent;
27  import javax.faces.component.ValueHolder;
28  import javax.faces.component.html.HtmlDataTable;
29  import javax.faces.context.FacesContext;
30  import javax.servlet.ServletOutputStream;
31  import javax.servlet.http.HttpServletResponse;
32  
33  import org.apache.myfaces.custom.util.ComponentUtils;
34  import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
35  
36  import com.lowagie.text.Document;
37  import com.lowagie.text.pdf.PdfPTable;
38  import com.lowagie.text.pdf.PdfWriter;
39  
40  /**
41   * This class is a utility class for serving PDF exporting.
42   */
43  public class PDFExporterUtil {
44  
45      /*
46       * This method is used for setting the response headers of the pdf.
47       */
48      private static void setPDFResponseHeaders(HttpServletResponse response,
49              ByteArrayOutputStream byteArrayStream, String fileName)
50              throws IOException {
51  
52          // setting response headers.
53          response.setHeader("Expires", "0");
54          response.setHeader("Cache-Control",
55                  "must-revalidate, post-check=0, pre-check=0");
56          response.setHeader("Pragma", "public");
57          response.setHeader("Content-disposition", "attachment;filename="
58                  + fileName + ".pdf");
59  
60          // setting the content type.
61          response.setContentType("application/pdf");
62  
63          // the contentlength is needed for MSIE.
64          response.setContentLength(byteArrayStream.size());
65  
66          // write ByteArrayOutputStream to the ServletOutputStream.
67          ServletOutputStream outputStream = response.getOutputStream();
68  
69          byteArrayStream.writeTo(outputStream);
70          outputStream.flush();
71      }
72  
73      /*
74       * This method is used for adding the columns headers to the pdfTable.
75       */
76      private static void generateTableHeader(PdfPTable pdfTable, List columns) {
77  
78          for (int i = 0; i < columns.size(); i++) {
79              UIColumn column = (UIColumn) columns.get(i);
80              UIComponent columnHeaderCell = column.getHeader();
81              if (columnHeaderCell instanceof ValueHolder) {
82                  String cellValue = RendererUtils.getStringValue(FacesContext
83                          .getCurrentInstance(), columnHeaderCell);
84                  pdfTable.addCell(cellValue);
85              }
86          }
87      }
88  
89      /*
90       * This method is used for adding the columns values to the pdfTable.
91       */
92      private static void generateTableContent(FacesContext facesContext,
93              PdfPTable pdfTable, List columns, HtmlDataTable dataTable) {
94  
95          int numberOfColumns = columns.size();
96          int numberOfRows = dataTable.getRowCount();
97          int startFrom = 0;
98          int endAt = numberOfRows;
99          
100         /* fill the table with the data. */
101         for (int i = startFrom; i < endAt; ++i) {
102             dataTable.setRowIndex(i);
103             for (int j = 0; j < numberOfColumns; ++j) {
104                 UIComponent valueHolder = (UIComponent) ((UIColumn) columns
105                         .get(j)).getChildren().get(0);
106                 if (valueHolder instanceof ValueHolder) {
107                     String cellValue = RendererUtils.getStringValue(
108                             FacesContext.getCurrentInstance(), valueHolder);
109                     pdfTable.addCell(cellValue);
110                 }
111             }
112         }
113     }
114 
115     /*
116      * This method is used for creating the PDFTable model.
117      */
118     public static PdfPTable generatePDFTableModel(FacesContext facesContext,
119             HtmlDataTable dataTable) {
120 
121         int numberOfColumns;
122         List columns = null;
123         PdfPTable pdfTable = null;
124 
125 
126         /* getting the HTMLDataTable Columns */
127         columns = ComponentUtils.getHTMLDataTableColumns(dataTable);
128 
129         if (columns.size() == 0) {
130             return null;
131         }
132         else {
133             numberOfColumns = columns.size();
134         }
135 
136         /* creating the PDF Table */
137         pdfTable = new PdfPTable(numberOfColumns);
138 
139         generateTableHeader(pdfTable, columns);
140 
141         generateTableContent(facesContext, pdfTable, columns,
142                 dataTable);
143 
144         return pdfTable;
145     }
146     
147     /**
148      * This method is responsible for writing the PDF to the response stream.
149      * @param facesContext
150      * @param response
151      * @param fileName
152      * @param dataTable
153      */
154     public static void generatePDF(FacesContext facesContext,
155             HttpServletResponse response, String fileName,
156             HtmlDataTable dataTable) throws Exception {
157 
158         int currentRowIndex;
159         Document document = new Document();
160         ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
161         PdfWriter.getInstance(document, byteArrayStream);
162         PdfPTable pdfTable = null;
163         
164         /*
165          * By default if the fileName is not specified, then use the
166          * table id.
167          */
168         if (fileName == null) 
169         {
170             fileName = dataTable.getId();
171         }        
172 
173         currentRowIndex = dataTable.getRowIndex();
174 
175         // generate the PDF table model.
176         pdfTable = generatePDFTableModel(facesContext, dataTable);
177 
178         // open the document and write the generated PDF.
179         document.open();
180         document.add(pdfTable);
181         document.close();
182 
183         // write the response headers.
184         setPDFResponseHeaders(response, byteArrayStream, fileName);
185 
186         dataTable.setRowIndex(currentRowIndex);
187 
188     }
189 }