今天做财务方面相关数据的导出功能,需要导出PDF和Excel,在项目经理那里得知有一个叫iTextPDF的java框架导出PDF文件很好用,于是拿来玩儿玩儿。

 package com.smart.produce.modules.finance.controller;

 import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;
import com.smart.produce.modules.finance.service.IExportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import java.io.FileOutputStream;
import java.lang.reflect.Method; @Controller
@RequestMapping("${admin.url.prefix}/finance/export")
public class ExportController { @Autowired
private IExportService exportService; private String exportPath = "/static/financeExport"; @ResponseBody
@RequestMapping(value="exportPDF", method={RequestMethod.GET, RequestMethod.POST})
public String expStatementPDF(HttpServletRequest request, String name) {
JSONObject result = new JSONObject();
result.put("code", 0);
result.put("msg", "success");
// 输出文件路径
String filePath = exportPath + "/" + name + ".pdf";
result.put("data", filePath);
String realPath = request.getServletContext().getRealPath("/");
try {
//Step 1—Create a Document.
Rectangle rectangle = new Rectangle(PageSize.A4);
Document document = new Document(rectangle);
document.setMargins(20, 20, 40, 40);
//Step 2—Get a PdfWriter instance.
PdfWriter.getInstance(document, new FileOutputStream(realPath + filePath));
//Step 3—Open the Document.
document.open();
//Step 4—Add content.
Method method = IExportService.class.getDeclaredMethod(name + "Print", new Class[]{Document.class, String.class});
method.invoke(exportService, document, realPath);
//Step 5—Close the Document.
document.close();
} catch(Exception e) {
e.printStackTrace();
result.put("code", -1);
result.put("msg", e.getMessage());
}
return result.toString();
} }

生成文档类

 package com.smart.produce.modules.finance.service.impl;

 import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.smart.produce.modules.basic.entity.Customer;
import com.smart.produce.modules.basic.service.ICustomerService;
import com.smart.produce.modules.finance.service.IExportService;
import com.smart.produce.modules.finance.service.IFinReceiptService;
import com.smart.produce.modules.printorder.service.IOprPrintOrderService;
import com.smart.produce.modules.printorder.service.ISettlementService;
import com.smart.produce.modules.sys.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.ArrayList;
import java.util.List; /**
* @Title: PDF输出
* @Description: PDF输出
* @author guanghe
* @date 2018-09-26 15:32:08
* @version V1.0
*
*/
@Service("finExportService")
public class ExportServiceImpl implements IExportService { @Autowired
protected IUserService userService; @Autowired
protected IOprPrintOrderService oprPrintOrderService; @Autowired
protected IFinReceiptService finReceiptService; @Autowired
protected ICustomerService customerService; @Autowired
protected ISettlementService settlementService; // 标题字体
private Font simheiBig = null;
// 副标题字体
private Font simheiMiddle = null;
// 表头字体
private Font simhei = null;
// 正文字体
private Font simfang = null;
// 正文加粗字体
private Font simfangBold = null; //初始化字体
protected void initFonts(String realPath) throws Exception{
String fontPath = realPath +"/static/fonts";
if(simhei == null) {
BaseFont baseFont = BaseFont.createFont(fontPath + "/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
simheiBig = new Font(baseFont, 20);
simheiMiddle = new Font(baseFont, 16);
simhei = new Font(baseFont, 12);
baseFont = BaseFont.createFont(fontPath + "/simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
simfang = new Font(baseFont, 10);
simfangBold = new Font(baseFont, 10, Font.BOLD);
}
} protected PdfPCell getCell(String content) {
Paragraph p = new Paragraph(content, simfangBold);
p.setAlignment(Element.ALIGN_CENTER);
PdfPCell cell = new PdfPCell();
cell.addElement(p);
cell.setBorderColor(BaseColor.LIGHT_GRAY);
cell.setFixedHeight(25);
cell.setUseAscender(true);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
return cell;
} @Override
public void statementPrint(Document document, String realPath, String dataStr) throws Exception {
initFonts(realPath);
JSONObject data = JSONObject.parseObject(dataStr);
String customerId = data.getString("customerId");
Customer customer = customerService.selectById(customerId);
JSONArray detail = data.getJSONArray("detail");
//创建三列的表头表格
PdfPTable tbTitle = new PdfPTable(3);
//去掉表头表格的边框
int wtTitle[] = {30,40,30};
tbTitle.setWidths(wtTitle);
tbTitle.getDefaultCell().setBorder(0);
//留出空余
tbTitle.addCell("");
//添加主标题
PdfPCell cellTitle = new PdfPCell();
Paragraph pTitle = new Paragraph();
Chunk chkTitle = new Chunk("对 账 单", simheiBig);
chkTitle.setUnderline(1, -3f);
pTitle.add(chkTitle);
pTitle.setAlignment(Element.ALIGN_CENTER);
cellTitle.addElement(pTitle);
cellTitle.setVerticalAlignment(Element.ALIGN_BOTTOM);
cellTitle.setBorder(0);
tbTitle.addCell(cellTitle);
//添加标注
PdfPCell cellLabel = new PdfPCell();
Paragraph pLabel = new Paragraph("单据记录式", simheiMiddle);
pLabel.setAlignment(Element.ALIGN_RIGHT);
cellLabel.setVerticalAlignment(Element.ALIGN_TOP);
cellLabel.setBorder(0);
cellLabel.addElement(pLabel);
tbTitle.addCell(cellLabel);
document.add(tbTitle);
//添加空行
Paragraph blankRow = new Paragraph(18f, " ");
document.add(blankRow);
//添加副标题
PdfPTable tbSubtitle = new PdfPTable(1);
PdfPCell cellSubtitle = new PdfPCell();
Paragraph pSubtitle = new Paragraph("客户信息", simheiMiddle);
cellSubtitle.addElement(pSubtitle);
cellSubtitle.setPaddingBottom(5);
cellSubtitle.setBorderWidthTop(0);
cellSubtitle.setBorderWidthLeft(0);
cellSubtitle.setBorderWidthRight(0);
cellSubtitle.setBorderWidthBottom(2);
tbSubtitle.addCell(cellSubtitle);
document.add(tbSubtitle);
//添加明细表头
PdfPTable tbNote = new PdfPTable(3);
int wtNote[] = {30,40,30};
tbNote.setWidths(wtNote);
//添加客户编号
PdfPCell cellNo = new PdfPCell();
Paragraph pNo = new Paragraph("客户编号:" + customer.getCustomerNo(), simhei);
cellNo.addElement(pNo);
cellNo.setBorder(0);
tbNote.addCell(cellNo);
//添加客户名称
PdfPCell cellName = new PdfPCell();
Paragraph pName = new Paragraph("客户名称:" + customer.getCustomerName(), simhei);
cellName.addElement(pName);
cellName.setBorder(0);
tbNote.addCell(cellName);
//添加联系方式
PdfPCell cellContact = new PdfPCell();
Paragraph pContact = new Paragraph("联系电话:" + customer.getPhone(), simhei);
pContact.setAlignment(Element.ALIGN_RIGHT);
cellContact.addElement(pContact);
cellContact.setBorder(0);
tbNote.addCell(cellContact);
document.add(tbNote);
//添加空行
document.add(blankRow);
//添加明细表格
PdfPTable tbDetail = new PdfPTable(7);
int wtDetail[] = {7, 18, 15, 15, 15, 15, 15};;
tbDetail.setWidths(wtDetail);
String heads[] = {"序号", "订单编号", "订单日期", "订单经手", "订单金额", "已清金额", "未清金额"};
for(int i = 0; i < heads.length; i++) {
PdfPCell cellHead = getCell(heads[i]);
cellHead.setBackgroundColor(new BaseColor(230,230,230));
tbDetail.addCell(cellHead);
}
document.add(tbDetail);
for(int i = 0; i < detail.size(); i++) {
JSONObject item = detail.getJSONObject(i);
PdfPTable table = new PdfPTable(7);
int width[] = {7, 18, 15, 15, 15, 15, 15};
table.setWidths(width);
String num = (i + 1) + "";
List<String> contents = new ArrayList<String>(){{
add(num);
add(item.getString("orderNo"));
add(item.getString("createDate"));
add(item.getJSONObject("createBy").getString("username"));
add(item.getString("orderAmount"));
add(item.getString("receivedAmount"));
add(item.getString("debtAmount"));
}};
for(int j = 0; j < contents.size(); j++) {
PdfPCell cell = getCell(contents.get(j));
table.addCell(cell);
}
document.add(table);
}
} @Override
public void topupPrint(Document document, String realPath, String dataStr) throws Exception { } @Override
public void receiptPrint(Document document, String realPath, String dataStr) throws Exception {
initFonts(realPath);
JSONObject data = JSONObject.parseObject(dataStr);
} @Override
public void prestoreExp() { } @Override
public void topupExp() { } @Override
public void receiptExp() { } @Override
public void summaryExp() { }
}

Java生成PDF之iTextPDF的使用的更多相关文章

  1. Java 生成pdf表格文档

    最近在工作做一个泰国的项目,应供应商要求,需要将每天的交易生成pdf格式的报表上传到供应商的服务器,特此记录实现方法.废话不多说,直接上代码: THSarabunNew.ttf该文件是泰国字体自行网上 ...

  2. JAVA 生成PDF报表()

    许多应用程序都要求动态生成 PDF 文档.这些应用程序涵盖从生成客户对帐单并通过电子邮件交付的银行到购买特定的图书章节并以 PDF 格式接收这些图书章节的读者.这个列表不胜枚举.在本文中,我们将使用 ...

  3. Java生成PDF报表

    一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 iText是著名的开放 ...

  4. java生成PDF文件(itext)

    itextpdf-5.4.3.jar下载地址: http://www.kuaipan.cn/file/id_58980483773788178.htm 导入itextpdf-5.4.3.jar ToP ...

  5. 电子凭证 : Java 生成 Pdf

    来源:蛙牛, my.oschina.net/lujianing/blog/894365 如有好文章投稿,请点击 → 这里了解详情 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中 ...

  6. java生成pdf

    介绍 本篇博客主要是为了介绍如何使用:flying-saucer+itext+freemark实现导出复杂点的pdf文件. 思路 先把pdf的内容以html形式准备好 使用freemarker将htm ...

  7. java生成PDF,并下载到本地

    1.首先要写一个PDF工具类,以及相关工具 2.PDF所需jar包 iText是一种生成PDF报表的Java组件 freemarker是基于模板来生成文本输出 <dependency> & ...

  8. Java生成PDF文件(转)

    原文地址:https://www.cnblogs.com/shuilangyizu/p/5760928.html 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iT ...

  9. [itext]Java生成PDF文件

    一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...

随机推荐

  1. php学习十一:组合

    我们在类当中我往往会用到一些对象,此时的继承就无法满足我们的需求,这个时候我们需要用到组合.继承如果是is..a的关系,那么组合就是has...a的关系,直接在本类里面声明即可,不过声明的是一个对象 ...

  2. 跳表 SkipList

    跳表是平衡树的一种替代的数据结构,和红黑树不同,跳表对树的平衡的实现是基于一种随机化的算法,这样就使得跳表的插入和删除的工作比较简单.     跳表是一种复杂的链表,在简单链表的节点信息之上又增加了额 ...

  3. Swift - 多线程GCD详解

    //  GCD详解 //  目录: //  1. 创建GCD队列(最常用) //  2. 自定义创建队列 //  3. 使用多线程实现延迟加载 //  4. 使用多线程实现重复(循环) //  5. ...

  4. Ant教程

    安装ant,去http://ant.apache.org下载 配置环境变量(前提是配置了java环境变量) ANT_HOME G:\Software\ant1.9.7 //ant根目录 在PATH后添 ...

  5. 无法远程访问Mysql

    1.故障状态 [root@server02 ~]# mysql -utuser -h192. -p Enter password: ERROR (HY000): Can't connect to My ...

  6. JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金)

    第一: 限制只能是整数 <input type = "text" name= "number" id = 'number' onkeyup= " ...

  7. Firefox不能加载TinyMCE的问题

    不知Firefox的哪个版本开始,经常不能正常加载TinyMCE. 经过分析发现,出问题时总是停留在加载advhr插件(tiny_mce/plugins/advhr/editor_plugin.js) ...

  8. fastBoot使用

    fastBoot使用 作者:李老师,华清远见嵌入式学院讲师. 1.1. 使用Fastboot方式烧写 在安卓手机中Fastboot是一种比Recovery更底层的刷机模式.Fastboot是一种线刷, ...

  9. Django 的 Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使用: 1.定义规则: from ...

  10. request对象的常用属性和方法

    request的属性 /* 1.HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数.详情请参考 QueryDict 对象. 2.HttpRequest.POST ...