1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
42
43 public class PDFExporterUtil {
44
45
46
47
48 private static void setPDFResponseHeaders(HttpServletResponse response,
49 ByteArrayOutputStream byteArrayStream, String fileName)
50 throws IOException {
51
52
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
61 response.setContentType("application/pdf");
62
63
64 response.setContentLength(byteArrayStream.size());
65
66
67 ServletOutputStream outputStream = response.getOutputStream();
68
69 byteArrayStream.writeTo(outputStream);
70 outputStream.flush();
71 }
72
73
74
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
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
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
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
127 columns = ComponentUtils.getHTMLDataTableColumns(dataTable);
128
129 if (columns.size() == 0) {
130 return null;
131 }
132 else {
133 numberOfColumns = columns.size();
134 }
135
136
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
149
150
151
152
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
166
167
168 if (fileName == null)
169 {
170 fileName = dataTable.getId();
171 }
172
173 currentRowIndex = dataTable.getRowIndex();
174
175
176 pdfTable = generatePDFTableModel(facesContext, dataTable);
177
178
179 document.open();
180 document.add(pdfTable);
181 document.close();
182
183
184 setPDFResponseHeaders(response, byteArrayStream, fileName);
185
186 dataTable.setRowIndex(currentRowIndex);
187
188 }
189 }