Java生成PDF之iTextPDF的使用


  今天做財務方面相關數據的導出功能,需要導出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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM