java生成pdf文件
好久没写博客了,前段时间老板让写一个把列表导成pdf的功能,当时我上网查了一下,应该是两种方案。第一种方案就是建立一个pdf模板,然后把数据给它填写进去,这也是我第一次采用的办法,但是呢,这有个特别明显的弊端,就是模板只有一页那么大,因为这是自己建立的,所以就那么大,你数据少的话,一页能装下的那种,用这种是没问题的,但是你要是列表,这就装不下了,它还是一页,下边数据就显示不出来了,所以我又用了第二种方法。第二种办法就灵活了,直接自己在java代码里写标题,自己画table表格,反正一切操作都是在代码里边实现,一切都是动态的,这样就弥补了第一种方案的模板弊端,更加灵活,所以我就采用了第二种方案。
maven包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
java代码
package com.chengxiang.cashieringapi.controller.receipt;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import com.chengxiang.cashieringapi.base.BaseController;
import com.chengxiang.cashieringapi.model.InvoiceEmail;
import com.chengxiang.cashieringapi.model.basic.ExpenseCategory;
import com.chengxiang.cashieringapi.model.basic.PaymentPay;
import com.chengxiang.cashieringapi.model.receipt.FundReceipt;
import com.chengxiang.cashieringapi.service.basic.ExpenseCategoryService;
import com.chengxiang.cashieringapi.service.basic.PaymentPayService;
import com.chengxiang.cashieringapi.service.receipt.FundReceiptService;
import com.chengxiang.cashieringapi.utils.SendCloud;
import com.chengxiang.michain.wallet.common.model.ResponseData;
import com.github.pagehelper.PageInfo;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* The type Pdf report controller.
* 生成pdf
*/
@RestController
@RequestMapping("/test")
public class PDFReportController extends BaseController {
@Autowired
private FundReceiptService fundReceiptService;
@Autowired
private ExpenseCategoryService expensService;
@Autowired
private PaymentPayService payService;
public static final boolean isDeBug = true;
public static final String printPDFpath = "http://www.baidu.com/";
public static final String printPDFpath_test = "http://localhost:8090/pdf/";
public static final String PDF_PRINT_PATH = isDeBug ? printPDFpath : printPDFpath_test;
// 上传地址
public static final String scPDFpath = "D:\\apache-tomcat-slmall\\apache-tomcat-8.5.32-SLMall-Image\\webapps\\";
// public static final String scPDFpath = "D:\\kaifa\\apache-tomcat-7.0.79\\webapps\\pdf\\";
private static Font headfont ;// 设置字体大小
private static Font keyfont;// 设置字体大小
private static Font datefont;// 设置字体大小
private static Font textfont;// 设置字体大小
private static Font explainfont;// 设置字体大小
static{
BaseFont bfChinese;
try {
bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
headfont = new Font(bfChinese, 16, Font.BOLD);// 设置字体大小
keyfont = new Font(bfChinese, 14, Font.BOLD);// 设置字体大小
datefont = new Font(bfChinese, 10, Font.NORMAL);// 设置字体大小
textfont = new Font(bfChinese, 10, Font.NORMAL);// 设置字体大小
explainfont = new Font(bfChinese, 8, Font.UNDEFINED);// 设置字体大小
} catch (Exception e) {
e.printStackTrace();
}
}
public PdfPCell createCell(String value, Font font, int align){
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(value,font));
return cell;
}
public PdfPCell createCell(String value,Font font){
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setPhrase(new Phrase(value,font));
return cell;
}
public PdfPCell createCell(String value,Font font,int align,int colspan,boolean boderFlag){
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setColspan(colspan); // 设置列数
// cell.setRowspan(23); // 设置行数
cell.setPhrase(new Phrase(value,font));
cell.setPadding(3.0f);
if(!boderFlag){
cell.setBorder(0);
cell.setPaddingTop(10.0f);
cell.setPaddingBottom(8.0f);
}
return cell;
}
public PdfPCell createCell1(String value,Font font,int align,int colspan,boolean boderFlag){
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setColspan(colspan); // 设置列数
// cell.setRowspan(23); // 设置行数
cell.setPhrase(new Phrase(value,font));
cell.setBorder(0);
cell.setPadding(2.0f);
if(!boderFlag){
// cell.setBorder(0);
cell.setPaddingTop(10.0f);
// cell.setPaddingBottom(8.0f);
}
return cell;
}
public PdfPTable createTable(int colNumber){
PdfPTable table = new PdfPTable(colNumber);
try{
int maxWidth = 520;
table.setTotalWidth(maxWidth);
// int[] TableWidths = { 15, 40, 15, 20 , 100,100,100,100, 100,100};//按百分比分配单元格宽带
// table.setWidths(TableWidths);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
}catch(Exception e){
e.printStackTrace();
}
return table;
}
public void generatePDF(File file,List<FundReceipt> list) throws Exception{
Document document = new Document();// 建立一个Document对象
try {
PdfWriter writer =PdfWriter.getInstance(document,new FileOutputStream(file));
document.open();
document.setPageSize(PageSize.A4);// 设置页面大小Rectangle
PdfPTable table = createTable(11);
// table.getDefaultCell().setBorder(0);
table.addCell(createCell("收款单", headfont,Element.ALIGN_CENTER,11,false));
// 当前时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
String date=df.format(new Date());
table.addCell(createCell("打印时间:"+date, datefont,Element.ALIGN_RIGHT,11,false));
table.addCell(createCell("店铺号", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("店铺名", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("金额", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("手续费", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("单号", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("类型", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("日期", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("单据号", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("收银员", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("姓名", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("电话", keyfont, Element.ALIGN_CENTER));
String companyCode=getCompanyCode();
PageInfo<ExpenseCategory> pageList=expensService.doSelectAll(1,0,companyCode,"");
List<ExpenseCategory> expenseCategoryList=pageList.getList();
SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
if(list.size()>0){
for(int i=0;i<list.size();i++){
FundReceipt fundReceipt=list.get(i);
table.addCell(createCell(fundReceipt.getShopStoreCode(),textfont));
table.addCell(createCell(fundReceipt.getShopStoreName(), textfont));
table.addCell(createCell(String.valueOf(fundReceipt.getOrderMoney()), textfont));
table.addCell(createCell(String.valueOf(fundReceipt.getFeeMoney()), textfont));
table.addCell(createCell(fundReceipt.getSaleCode(), textfont));
// 费用类别名称
String name="";
if(fundReceipt.getExpenseCode().equals("XS")){
name="销售收款";
}else{
for (ExpenseCategory expense:expenseCategoryList) {
if(fundReceipt.getExpenseCode().equals(expense.getExpenseCode())){
name=expense.getExpenseName();
break;
}
}
}
if(name.equals("")){
name="未知";
}
table.addCell(createCell(name, textfont));
String orderGoodsDate=df1.format(fundReceipt.getOrderGoodsDate());
table.addCell(createCell(orderGoodsDate, textfont));
table.addCell(createCell(fundReceipt.getOrderCode(), textfont));
table.addCell(createCell(fundReceipt.getCashierName(), textfont));
table.addCell(createCell(fundReceipt.getCustomerName(), textfont));
table.addCell(createCell(fundReceipt.getCustomerTelephone(), textfont));
}
}
table.addCell(createCell("技术支持:善良的良小爷", explainfont,Element.ALIGN_RIGHT,11,false));
table.addCell(createCell1("网站:https://www.baidu.com/", explainfont,Element.ALIGN_RIGHT,11,true));
document.add(table);
document.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Select payment pay response data.
* 查询是否填写邮件地址
* @return the response data
*/
@GetMapping("selectPaymentPay")
public ResponseData selectPaymentPay() {
// 从参数表查询收邮件人地址
PaymentPay pay=payService.selectByCompanyCode(getCompanyCode());
if(pay.getEmail()==null || pay.getEmail().equals("")){
return new ResponseData(false);
}
return new ResponseData(true,pay.getEmail());
}
/**
* 创建多级文件夹
* @param file
* @return
*/
private static boolean createFileOrDir(File file) {
System.out.println(file.getPath());
if (file.isDirectory()) {
return file.mkdirs();
}
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
System.out.println(parentFile.getPath());
boolean mkdirs = parentFile.mkdirs();
if (!mkdirs)
return false;
} else {
if (!parentFile.isDirectory()) {
boolean delete = parentFile.delete();
boolean mkdirs = parentFile.mkdirs();
if (!delete || !mkdirs) return false;
}
}
try {
return file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* Print taxpayer pdf response data.
* 输出pdf文件
* @param pageNum the page num
* @param pageSize the page size
* @param orderCode the order code
* @param shopCode the shop code
* @param shopStoreCode the shop store code
* @param startDate the start date
* @param endDate the end date
* @param expenseCode the expense code
* @param cashierId the cashier id
* @return the response data
*/
@GetMapping("pdf")
public ResponseData printTaxpayerPDF(Integer pageNum, Integer pageSize, String orderCode, String shopCode,
String shopStoreCode, String startDate, String endDate, String expenseCode, String cashierId) {
PageInfo<FundReceipt> pageDate = fundReceiptService.listPageAll(pageNum,pageSize,getCompanyCode(),
orderCode,shopCode,shopStoreCode,startDate,endDate,expenseCode,cashierId);
String printFileName = System.currentTimeMillis() + ".pdf";
// pdf文件地址
String pdfUrl=PDF_PRINT_PATH + printFileName;
String pdfUrl1=scPDFpath + printFileName;
File file = new File(pdfUrl1);
try {
if(!file.exists()){ //如果文件夹不存在
// file2.mkdir(); //创建文件夹,这个只能创建一级文件夹,所以弃用
createFileOrDir(file);
}
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
List<FundReceipt> list=pageDate.getList();
try {
// 生成PDF
generatePDF(file,list);
} catch (Exception e) {
e.printStackTrace();
}
// 从参数表查询收邮件人地址
PaymentPay pay=payService.selectByCompanyCode(getCompanyCode());
if(pay==null){
return new ResponseData(false);
}
try {
// 调用邮箱平台接口
SendCloud.send_template(new InvoiceEmail(pdfUrl,pay.getEmail()),"shop_get","","店铺通");
return new ResponseData(true);
} catch (IOException e) {
e.printStackTrace();
return new ResponseData(false);
}
// return new ResponseData(true);
}
public static void main(String[] args) throws Exception {
File file = new File("D:\\kaifa\\apache-tomcat-7.0.79\\webapps\\text.pdf");
file.createNewFile();
// new PDFReportController(file).generatePDF();
}
}
注释:这就是生成pdf的全部代码,里边都有注释,所以只说几个需要注意的点。
- 这段代码是为了创建文件夹,因为你上边写的地址,有时候服务器上会没有,或者是忘了创建这个文件夹了,它就报错了,因为没这个地址,所以这个地址是为了防止此类错误,没有的话给它自动创建文件夹。
File file = new File(pdfUrl1);
try {
if(!file.exists()){ //如果文件夹不存在
// file2.mkdir(); //创建文件夹,这个只能创建一级文件夹,所以弃用
createFileOrDir(file);
}
- 这段代码就是给它生成了一个时间戳,然后这个pdf名就是这个
String printFileName = System.currentTimeMillis() + ".pdf";
- 这段是生成pdf文件以后,给用户发一个邮件,所以需要在系统里边填一下邮箱地址,然后给用户发邮件,邮件里边有这个pdf的url,这个下一篇文章在仔细介绍。
// 调用邮箱平台接口
SendCloud.send_template(new InvoiceEmail(pdfUrl,pay.getEmail()),"shop_get","","店铺通");
return new ResponseData(true);
好,现在来看一下效果
注释:pdf的名就是自己定义的时间戳
注释:里边的宽度啥的都是可以调的,我代码里有注释;样子就是这样,然后可以打印啊啥的,就由用户自己了。
大概就是这个意思,如果大伙儿还有不太清楚的地方,大伙儿可以在下面给我留言,或者发我邮箱邮件,邮箱地址是2978975101@qq.com,如有不足之处,也希望大家提出来,我们一起进步,谢谢大家。