在 Struts 中結合 JFreeChart,iText 生成 PDF 報表
本文中向讀者朋友提供了一種 PDF 報表系統的解決方案,并將重點放在如何整合開源框架以實現系統要求,以及如何解決實際開發過程中的疑難問題上,對于廣大的開源框架愛好者和開發人員具有一定的借鑒意義。該報表解決方案主要提供以下功能:
- 用戶圖片上傳
- 根據數據生成柱狀圖,折線圖
- 匯總數據及圖片,最終以 PDF 進行呈現
基于對開源領域中比較成熟的框架的比較,我們最終選擇以 Struts 為基礎,整合 common-fileupload,JFreechart 和 iText,以實現上述的系統功能。下面我們來講述如何整合這些開源框架,建立開發環境。
Struts(http://struts.apache.org/) 是廣泛使用的 MVC 框架,相信很多開發人員都非常熟悉,這不是本文的重點,僅會提及一個技術點,即如何在 Struts 框架中實現文件上傳,將在下文中詳細描述。
Commons-fileupload (http://commons.apache.org/fileupload/) 能與 Servlet 及 Web application 很好地結合,基于對 Http request 的解析,可以被方便靈活地調用,從而提供高性能的文件上傳功能。
JFreeChart(http://www.jfree.org/) 主要是用來制作各種各樣的圖表,包括:餅圖、柱狀圖 ( 普通柱狀圖以及堆棧柱狀圖 )、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。本文中使用的是 jfreechart-1.0.13.jar。
iText(http://itextpdf.com/) 是一個能夠快速產生 PDF 文件的 Java 類庫,與 Servlet 有很好的給合,可以非常方便完成 PDF 輸出,最新的版本是 iText-5.0.4.jar。如果需要在報表中支持中文顯示,還需要下載 iTextAsian.jar。
為完成開發框架的搭建工作,我們需要將上述的幾個開源框架整合到 Eclipse 中。讀者需要通過以上的鏈接下載相應的各個 Jar 包,然后導入到工程的類路徑下。可以參考 Eclipse 的相關資料來完成這些配置操作。
基于 Struts 框架實現文件上傳需要注意以下兩點:
- Form 需要增加屬性: enctype="multipart/form-data"。
如:<form method="post" id="reportForm" enctype="multipart/form-data"> - 需要直接繼承自 Action,而不能是 DispatchAction。
以上兩點需要在開發過程中加以注意,否則使用 ServletFileUpload 的 parseRequest() 方法解析 request 的時候,得不到 Form 中 file 域傳遞的值。JSP 頁面的代碼在這里不再贅述,下面通過代碼及注釋來說明 Commons-fileupload 的使用,讀者可以根據實際需要設定上傳圖片的保存路徑和文件的名稱。
清單 1. 使用 Commons-fileupload 上傳文件
DiskFileItemFactory factory = new DiskFileItemFactory(); // 實例化硬盤文件工廠 factory.setSizeThreshold(8192);// 存放臨時文件的內存大小 String tempPath = request.getRealPath("/") + "/images/temp"; if(!new File(tempPath).isDirectory()) new File(tempPath).mkdirs(); factory.setRepository(new File(tempPath));// 設置上傳路徑 uploadPath = request.getRealPath("/") + "/web/report/images/"; if(!new File(uploadPath).isDirectory()) new File(uploadPath).mkdirs();
// 初始化上傳組件,循環 form 中的所有 input 類型為 file 的 field,上傳文件 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> itr = items.iterator(); while (itr.hasNext()) {// 依次處理每個 form field FileItem item = (FileItem) itr.next(); File savedFile = new File(uploadPath, "imageFileName.jpg"); item.write(savedFile); } </pre>最新的 struts 2.0 已經集成了 JFreechart,作為一種 ResultType 在 Action 中可以直接返回,讀者如果感興趣可以參考其他相關的資源。本文中我們介紹如何基于 Struts 1.x 版本來集成使用 JFreechart。
這里我們封裝了一個實用類 ChartUtil,它繼承自 JFreeChart 的 ServletUtilities 類,來提供本文所述報表方案的所有生成 JFreechart 報表的功能。清單 2 中給出了如何生成一個柱狀圖的方法,該方法的調用將會在清單 6 中看到。
|