Java生成PDF之iTextPDF的使用
今天做财务方面相关数据的导出功能,需要导出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的使用的更多相关文章
- Java 生成pdf表格文档
最近在工作做一个泰国的项目,应供应商要求,需要将每天的交易生成pdf格式的报表上传到供应商的服务器,特此记录实现方法.废话不多说,直接上代码: THSarabunNew.ttf该文件是泰国字体自行网上 ...
- JAVA 生成PDF报表()
许多应用程序都要求动态生成 PDF 文档.这些应用程序涵盖从生成客户对帐单并通过电子邮件交付的银行到购买特定的图书章节并以 PDF 格式接收这些图书章节的读者.这个列表不胜枚举.在本文中,我们将使用 ...
- Java生成PDF报表
一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 iText是著名的开放 ...
- java生成PDF文件(itext)
itextpdf-5.4.3.jar下载地址: http://www.kuaipan.cn/file/id_58980483773788178.htm 导入itextpdf-5.4.3.jar ToP ...
- 电子凭证 : Java 生成 Pdf
来源:蛙牛, my.oschina.net/lujianing/blog/894365 如有好文章投稿,请点击 → 这里了解详情 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中 ...
- java生成pdf
介绍 本篇博客主要是为了介绍如何使用:flying-saucer+itext+freemark实现导出复杂点的pdf文件. 思路 先把pdf的内容以html形式准备好 使用freemarker将htm ...
- java生成PDF,并下载到本地
1.首先要写一个PDF工具类,以及相关工具 2.PDF所需jar包 iText是一种生成PDF报表的Java组件 freemarker是基于模板来生成文本输出 <dependency> & ...
- Java生成PDF文件(转)
原文地址:https://www.cnblogs.com/shuilangyizu/p/5760928.html 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iT ...
- [itext]Java生成PDF文件
一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...
随机推荐
- AndroidWear开发之下载SDK[Android W/Android L]
Android L Developer Preview SDK发布了,但是天朝还是无法更新到.打开SDK Manager依旧一成不变,这时候就需要利器了. 第一步: 打开Goagent,不要说不知道什 ...
- JS-两周内自动登录功能
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- log4j和commons- logging(好文整理转载)
一 :为什么同时使用commons-logging和Log4j?为什么不仅使用其中之一? Commons-loggin的目的是为 “所有的Java日志实现”提供一个统一的接口,它自身的日志功能平常弱( ...
- Java实现远程服务生产与消费(RPC)的4种方法-RMI,WebService,HttpClient,RestTemplate
目录 一. 通过rmi实现远程服务的生产与消费 远程服务提供者实现. 创建rmi-provider项目(Maven) 远程服务消费者实现 创建rmi-consumer项目 二. 通过WebServic ...
- AVG
AVG([ DISTINCT | ALL ] expr) [ OVER(analytic_clause) ] SELECT MANAGER_ID, LAST_NAME, ...
- Python 自学积累(二)
1. onfigParser 模块用于操作配置文件 注:Parser汉译为“解析”之意. 配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数( ...
- mongodb拆库分表脚本
脚本功能: 1. 将指定的报告文件按照指定的字段.切库切表策略切分 2. 将切分后的文件并发导入到对应的Mongodb中 3. 生成日志文件和done标识文件 使用手册: -h 打印帮助信息,并 ...
- Tomcat 400错误 问题集锦
1.前后台参数类型不一致 上图错误提示就是客户端发送的请求不能找到你的具体的页面或者地址,这是Spring MVC抛出的错误,这样我们就要进行参数的检查,一定是JSP提交的参数和Controller里 ...
- PHP获取目录和的方法通过魔术变量;通过超级全局变量;通过相关函数等等:
<?php /** * PHP获取路径或目录实现 * @link http://www.phpddt.com */ //魔术变量,获取当前文件的绝对路径 echo "__FILE__: ...
- LINQ中的连接(join)用法示例
Linq中连接主要有组连接.内连接.左外连接.交叉连接四种.各个用法如下. 1. 组连接 组连接是与分组查询是一样的.即根据分组得到结果. 如下例,根据publisther分组得到结果. 使用组连接的 ...