今天做財務方面相關數據的導出功能,需要導出PDF和Excel,在項目經理那里得知有一個叫iTextPDF的java框架導出PDF文件很好用,於是拿來玩兒玩兒。
1 package com.smart.produce.modules.finance.controller; 2
3 import com.alibaba.fastjson.JSONObject; 4 import com.itextpdf.text.Document; 5 import com.itextpdf.text.PageSize; 6 import com.itextpdf.text.Rectangle; 7 import com.itextpdf.text.pdf.PdfWriter; 8 import com.smart.produce.modules.finance.service.IExportService; 9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.stereotype.Controller; 11 import org.springframework.web.bind.annotation.RequestMapping; 12 import org.springframework.web.bind.annotation.RequestMethod; 13 import org.springframework.web.bind.annotation.ResponseBody; 14
15 import javax.servlet.http.HttpServletRequest; 16 import java.io.FileOutputStream; 17 import java.lang.reflect.Method; 18
19 @Controller 20 @RequestMapping("${admin.url.prefix}/finance/export") 21 public class ExportController { 22
23 @Autowired 24 private IExportService exportService; 25
26 private String exportPath = "/static/financeExport"; 27
28 @ResponseBody 29 @RequestMapping(value="exportPDF", method={RequestMethod.GET, RequestMethod.POST}) 30 public String expStatementPDF(HttpServletRequest request, String name) { 31 JSONObject result = new JSONObject(); 32 result.put("code", 0); 33 result.put("msg", "success"); 34 // 輸出文件路徑
35 String filePath = exportPath + "/" + name + ".pdf"; 36 result.put("data", filePath); 37 String realPath = request.getServletContext().getRealPath("/"); 38 try { 39 //Step 1—Create a Document.
40 Rectangle rectangle = new Rectangle(PageSize.A4); 41 Document document = new Document(rectangle); 42 document.setMargins(20, 20, 40, 40); 43 //Step 2—Get a PdfWriter instance.
44 PdfWriter.getInstance(document, new FileOutputStream(realPath + filePath)); 45 //Step 3—Open the Document.
46 document.open(); 47 //Step 4—Add content.
48 Method method = IExportService.class.getDeclaredMethod(name + "Print", new Class[]{Document.class, String.class}); 49 method.invoke(exportService, document, realPath); 50 //Step 5—Close the Document.
51 document.close(); 52 } catch(Exception e) { 53 e.printStackTrace(); 54 result.put("code", -1); 55 result.put("msg", e.getMessage()); 56 } 57 return result.toString(); 58 } 59
60 }
生成文檔類
1 package com.smart.produce.modules.finance.service.impl; 2
3 import com.alibaba.fastjson.JSONArray; 4 import com.alibaba.fastjson.JSONObject; 5 import com.itextpdf.text.*; 6 import com.itextpdf.text.pdf.BaseFont; 7 import com.itextpdf.text.pdf.PdfPCell; 8 import com.itextpdf.text.pdf.PdfPTable; 9 import com.smart.produce.modules.basic.entity.Customer; 10 import com.smart.produce.modules.basic.service.ICustomerService; 11 import com.smart.produce.modules.finance.service.IExportService; 12 import com.smart.produce.modules.finance.service.IFinReceiptService; 13 import com.smart.produce.modules.printorder.service.IOprPrintOrderService; 14 import com.smart.produce.modules.printorder.service.ISettlementService; 15 import com.smart.produce.modules.sys.service.IUserService; 16 import org.springframework.beans.factory.annotation.Autowired; 17 import org.springframework.stereotype.Service; 18
19 import java.util.ArrayList; 20 import java.util.List; 21
22 /**
23 * @Title: PDF輸出 24 * @Description: PDF輸出 25 * @author guanghe 26 * @date 2018-09-26 15:32:08 27 * @version V1.0 28 * 29 */
30 @Service("finExportService") 31 public class ExportServiceImpl implements IExportService { 32
33 @Autowired 34 protected IUserService userService; 35
36 @Autowired 37 protected IOprPrintOrderService oprPrintOrderService; 38
39 @Autowired 40 protected IFinReceiptService finReceiptService; 41
42 @Autowired 43 protected ICustomerService customerService; 44
45 @Autowired 46 protected ISettlementService settlementService; 47
48 // 標題字體
49 private Font simheiBig = null; 50 // 副標題字體
51 private Font simheiMiddle = null; 52 // 表頭字體
53 private Font simhei = null; 54 // 正文字體
55 private Font simfang = null; 56 // 正文加粗字體
57 private Font simfangBold = null; 58
59 //初始化字體
60 protected void initFonts(String realPath) throws Exception{ 61 String fontPath = realPath +"/static/fonts"; 62 if(simhei == null) { 63 BaseFont baseFont = BaseFont.createFont(fontPath + "/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 64 simheiBig = new Font(baseFont, 20); 65 simheiMiddle = new Font(baseFont, 16); 66 simhei = new Font(baseFont, 12); 67 baseFont = BaseFont.createFont(fontPath + "/simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 68 simfang = new Font(baseFont, 10); 69 simfangBold = new Font(baseFont, 10, Font.BOLD); 70 } 71 } 72
73 protected PdfPCell getCell(String content) { 74 Paragraph p = new Paragraph(content, simfangBold); 75 p.setAlignment(Element.ALIGN_CENTER); 76 PdfPCell cell = new PdfPCell(); 77 cell.addElement(p); 78 cell.setBorderColor(BaseColor.LIGHT_GRAY); 79 cell.setFixedHeight(25); 80 cell.setUseAscender(true); 81 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); 82 return cell; 83 } 84
85 @Override 86 public void statementPrint(Document document, String realPath, String dataStr) throws Exception { 87 initFonts(realPath); 88 JSONObject data = JSONObject.parseObject(dataStr); 89 String customerId = data.getString("customerId"); 90 Customer customer = customerService.selectById(customerId); 91 JSONArray detail = data.getJSONArray("detail"); 92 //創建三列的表頭表格
93 PdfPTable tbTitle = new PdfPTable(3); 94 //去掉表頭表格的邊框
95 int wtTitle[] = {30,40,30}; 96 tbTitle.setWidths(wtTitle); 97 tbTitle.getDefaultCell().setBorder(0); 98 //留出空余
99 tbTitle.addCell(""); 100 //添加主標題
101 PdfPCell cellTitle = new PdfPCell(); 102 Paragraph pTitle = new Paragraph(); 103 Chunk chkTitle = new Chunk("對 賬 單", simheiBig); 104 chkTitle.setUnderline(1, -3f); 105 pTitle.add(chkTitle); 106 pTitle.setAlignment(Element.ALIGN_CENTER); 107 cellTitle.addElement(pTitle); 108 cellTitle.setVerticalAlignment(Element.ALIGN_BOTTOM); 109 cellTitle.setBorder(0); 110 tbTitle.addCell(cellTitle); 111 //添加標注
112 PdfPCell cellLabel = new PdfPCell(); 113 Paragraph pLabel = new Paragraph("單據記錄式", simheiMiddle); 114 pLabel.setAlignment(Element.ALIGN_RIGHT); 115 cellLabel.setVerticalAlignment(Element.ALIGN_TOP); 116 cellLabel.setBorder(0); 117 cellLabel.addElement(pLabel); 118 tbTitle.addCell(cellLabel); 119 document.add(tbTitle); 120 //添加空行
121 Paragraph blankRow = new Paragraph(18f, " "); 122 document.add(blankRow); 123 //添加副標題
124 PdfPTable tbSubtitle = new PdfPTable(1); 125 PdfPCell cellSubtitle = new PdfPCell(); 126 Paragraph pSubtitle = new Paragraph("客戶信息", simheiMiddle); 127 cellSubtitle.addElement(pSubtitle); 128 cellSubtitle.setPaddingBottom(5); 129 cellSubtitle.setBorderWidthTop(0); 130 cellSubtitle.setBorderWidthLeft(0); 131 cellSubtitle.setBorderWidthRight(0); 132 cellSubtitle.setBorderWidthBottom(2); 133 tbSubtitle.addCell(cellSubtitle); 134 document.add(tbSubtitle); 135 //添加明細表頭
136 PdfPTable tbNote = new PdfPTable(3); 137 int wtNote[] = {30,40,30}; 138 tbNote.setWidths(wtNote); 139 //添加客戶編號
140 PdfPCell cellNo = new PdfPCell(); 141 Paragraph pNo = new Paragraph("客戶編號:" + customer.getCustomerNo(), simhei); 142 cellNo.addElement(pNo); 143 cellNo.setBorder(0); 144 tbNote.addCell(cellNo); 145 //添加客戶名稱
146 PdfPCell cellName = new PdfPCell(); 147 Paragraph pName = new Paragraph("客戶名稱:" + customer.getCustomerName(), simhei); 148 cellName.addElement(pName); 149 cellName.setBorder(0); 150 tbNote.addCell(cellName); 151 //添加聯系方式
152 PdfPCell cellContact = new PdfPCell(); 153 Paragraph pContact = new Paragraph("聯系電話:" + customer.getPhone(), simhei); 154 pContact.setAlignment(Element.ALIGN_RIGHT); 155 cellContact.addElement(pContact); 156 cellContact.setBorder(0); 157 tbNote.addCell(cellContact); 158 document.add(tbNote); 159 //添加空行
160 document.add(blankRow); 161 //添加明細表格
162 PdfPTable tbDetail = new PdfPTable(7); 163 int wtDetail[] = {7, 18, 15, 15, 15, 15, 15};; 164 tbDetail.setWidths(wtDetail); 165 String heads[] = {"序號", "訂單編號", "訂單日期", "訂單經手", "訂單金額", "已清金額", "未清金額"}; 166 for(int i = 0; i < heads.length; i++) { 167 PdfPCell cellHead = getCell(heads[i]); 168 cellHead.setBackgroundColor(new BaseColor(230,230,230)); 169 tbDetail.addCell(cellHead); 170 } 171 document.add(tbDetail); 172 for(int i = 0; i < detail.size(); i++) { 173 JSONObject item = detail.getJSONObject(i); 174 PdfPTable table = new PdfPTable(7); 175 int width[] = {7, 18, 15, 15, 15, 15, 15}; 176 table.setWidths(width); 177 String num = (i + 1) + ""; 178 List<String> contents = new ArrayList<String>(){{ 179 add(num); 180 add(item.getString("orderNo")); 181 add(item.getString("createDate")); 182 add(item.getJSONObject("createBy").getString("username")); 183 add(item.getString("orderAmount")); 184 add(item.getString("receivedAmount")); 185 add(item.getString("debtAmount")); 186 }}; 187 for(int j = 0; j < contents.size(); j++) { 188 PdfPCell cell = getCell(contents.get(j)); 189 table.addCell(cell); 190 } 191 document.add(table); 192 } 193 } 194
195 @Override 196 public void topupPrint(Document document, String realPath, String dataStr) throws Exception { 197
198 } 199
200 @Override 201 public void receiptPrint(Document document, String realPath, String dataStr) throws Exception { 202 initFonts(realPath); 203 JSONObject data = JSONObject.parseObject(dataStr); 204 } 205
206 @Override 207 public void prestoreExp() { 208
209 } 210
211 @Override 212 public void topupExp() { 213
214 } 215
216 @Override 217 public void receiptExp() { 218
219 } 220
221 @Override 222 public void summaryExp() { 223
224 } 225 }