zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)
    Linux下面配置文件~/.bash_profile
    Java数据结构之回溯算法的递归应用迷宫的路径问题
    Java数据结构之对称矩阵的压缩算法---
    Java数据结构之字符串模式匹配算法---KMP算法2
    Java数据结构之字符串模式匹配算法---KMP算法
    Java数据结构之字符串模式匹配算法---Brute-Force算法
    Java数据结构之表的增删对比---ArrayList与LinkedList之一
    Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
    Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
  • 原文地址:https://www.cnblogs.com/guanghe/p/9713697.html
Copyright © 2011-2022 走看看