热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

java在pdf中生成表格的方法

这篇文章主要介绍了java在pdf中生成表格的方法,需要的朋友可以参考下

1、目标

  在pdf中生成一个可变表头的表格,并向其中填充数据。通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格。

  每天生成一个文件夹存储生成的pdf文件(文件夹的命名是年月日时间戳),如:20151110

  生成的文件可能在毫秒级别,故文件的命名规则是"到毫秒的时间戳-uuid",如:20151110100245690-ece540e5-7737-4ab7-b2d6-87bc23917c8c.pdf

  通过读取properties文件动态获取文件存储的跟目录。

2、所需的jar

  这里通过itex插件进行pdf的生成,需要的jar包括以下几个

3、编码实现

1)、实体类

package com.zcr.until;

public class User 
{
 private String name;
 private int age ;
 private float height;
 private String adress;
 private String sex;
 private String jj;
 
 public String getJj()
 {
 return jj;
 }

 public void setJj(String jj)
 {
 this.jj = jj;
 }

 public User()
 {
 
 }

 public User(String name,int age,float height,String adress,String sex,String jj)
 {
 this.name = name;
 this.age = age;
 this.height = height;
 this.adress = adress;
 this.sex = sex;
 this.jj = jj;
 }
 
 public String getAdress()
 {
 return adress;
 }

 public void setAdress(String adress)
 {
 this.adress = adress;
 }

 public String getSex()
 {
 return sex;
 }

 public void setSex(String sex)
 {
 this.sex = sex;
 }

 
 
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
 public float getHeight() {
 return height;
 }
 public void setHeight(float height) {
 this.height = height;
 }
 
}

2)、properties文件

pdfPath=E\:/appDataPdf
3)、读取properties文件,获取pdf存储的路径

package com.zcr.until;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class GetFilePlace 
{
 /**
 * 读取文件,获取excel保存的根目录
 * @return excel保存的根目录
 */
 public String getFilePath()
 {
 String dir = System.getProperty("user.dir"); //获得tomcat所在的工作路径 
 
 //获取到存储了文件存储位置的filedir.properties 文件路径 --->java Project的文件路径
 String realDir = dir + File.separator + "src" + File.separator +"META-INF" + File.separator + "filedir.properties";
 
     //Web project存储路径
 /*String realDir = dir.substring(0, dir.length()-4) + File.separator +"webapps" + File.separator + "generateExcels" 
   + File.separator + "classes" + File.separator + "META-INF" + File.separator + "config" + File.separator + "filedir.properties";
 */
 return realDir;
 }
 
 /**
 * 获取filePath路径【properities文件】中key对应的值,
 * @param filePath properities文件路径【包含properities文件】
 * @param key 要查找的key值
 * @return key对应的value
 */
 public String GetValueByKey(String filePath, String key) 
 {
  Properties pps = new Properties();
  try {
  InputStream in = new BufferedInputStream (new FileInputStream(filePath)); 
  pps.load(in);
  String value = pps.getProperty(key);
  in.close();
  return value;
  
  }catch (IOException e) {
  e.printStackTrace();
  return null;
  }
 }
 
 /**
 * 查询properities文件中可以对应的存储地点
 * @param key 查询主键
 * @return key对应的存储地址
 */
 public String getFileDirFromProperties(String key)
 {
 return GetValueByKey(getFilePath(),key);
 }

}

4)、获取当天存在的文件路径,不存在则生成一个新的文件夹

package com.zcr.service;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class GenerateFold
{
 /**
 * 查询当前生成的excel需要存在在哪个路径,如果存在则存储在相应的位置,否则生成改目录, 每天生成一个文件夹,文件夹的命名规则为 年月日的时间戳
 * @param foldName 生成excel保存路径
 * @return  现在的excel需要保存路径
 */
 public String getFold(String foldName)
 {
 SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
 
 String todayStr = format.format(Calendar.getInstance().getTime());
 
 String foldPath = foldName + File.separator + todayStr; 
 
 File file = new File(foldPath);
 
 if(!file.exists() && !file.isDirectory())
 {
  System.out.println("不存在");
  file.mkdirs();
 }
 else
 {
  System.out.println("存在");
 }
 return foldPath;
 }

}

5)、生成文件的名字

package com.zcr.until;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.UUID;

/**
 * 生成文件名字
 * @author zcr
 *
 */
public class GenerateFileName
{
 /**
 * 根据文件类别生成文件的名字,文件的命名规则是:文件目录/生成时间-uuid(全球唯一编码).文件类别
 * @param fileDir 文件的存储路径
 * @param fileType 文件的类别
 * @return   文件的名字 
 */
 public String generateFileName(String fileDir,String fileType)
 {
 String saveFileName = "";
 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSS");
 saveFileName += format.format(Calendar.getInstance().getTime());
 
 UUID uuid = UUID.randomUUID(); //全球唯一编码
 
 saveFileName += "-" + uuid.toString();
 saveFileName += "." + fileType;
 
 saveFileName = fileDir + File.separator + saveFileName;
 
 return saveFileName;
 }
}

6)、生成pdf

package com.zcr.service;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import com.zcr.until.GenerateFileName;
import com.zcr.until.GetFilePlace;
import com.zcr.until.User;

/**
 * 生成pdf
 * @author zcr
 * 
 */
public class CreatePdf
{
 Document document = new Document();// 建立一个Document对象

 private static Font headfont;// 设置字体大小
 private static Font keyfont;// 设置字体大小
 private static Font textfont;// 设置字体大小

 static
 {
 //中文格式
 BaseFont bfChinese;
 try
 {
  // 设置中文显示
  bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
  headfOnt= new Font(bfChinese, 10, Font.BOLD);// 设置字体大小
  keyfOnt= new Font(bfChinese, 8, Font.BOLD);// 设置字体大小
  textfOnt= new Font(bfChinese, 8, Font.NORMAL);// 设置字体大小
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 }
 
 /**
 * 文成文件
 * @param file 待生成的文件名
 */
 public CreatePdf(File file)
 {
 document.setPageSize(PageSize.A4);// 设置页面大小
 try
 {
  PdfWriter.getInstance(document, new FileOutputStream(file));
  document.open();
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 }
 
 public CreatePdf()
 {
 
 }
 
 public void initFile(File file)
 {
 document.setPageSize(PageSize.A4);// 设置页面大小
 try
 {
  PdfWriter.getInstance(document, new FileOutputStream(file));
  document.open();
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 }
 

 int maxWidth = 520;
 
 /**
 * 为表格添加一个内容
 * @param value  值
 * @param font  字体
 * @param align  对齐方式
 * @return  添加的文本框
 */
 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;
 }
 
 /**
 * 为表格添加一个内容
 * @param value  值
 * @param font  字体
 * @return  添加的文本框
 */
 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;
 }

 /**
 * 为表格添加一个内容
 * @param value  值
 * @param font  字体
 * @param align  对齐方式
 * @param colspan 占多少列
 * @return  添加的文本框
 */
 public PdfPCell createCell(String value, Font font, int align, int colspan)
 {
 PdfPCell cell = new PdfPCell();
 cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
 cell.setHorizontalAlignment(align);
 cell.setColspan(colspan);
 cell.setPhrase(new Phrase(value, font));
 return cell;
 }
 
 /**
 * 为表格添加一个内容
 * @param value  值
 * @param font  字体
 * @param align  对齐方式
 * @param colspan 占多少列
 * @param boderFlag 是否有有边框
 * @return  添加的文本框
 */
 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.setPhrase(new Phrase(value, font));
 cell.setPadding(3.0f);
 if (!boderFlag)
 {
  cell.setBorder(0);
  cell.setPaddingTop(15.0f);
  cell.setPaddingBottom(8.0f);
 }
 return cell;
 }

 /**
 * 创建一个表格对象
 * @param colNumber 表格的列数
 * @return  生成的表格对象
 */
 public PdfPTable createTable(int colNumber)
 {
 PdfPTable table = new PdfPTable(colNumber);
 try
 {
  table.setTotalWidth(maxWidth);
  table.setLockedWidth(true);
  table.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.getDefaultCell().setBorder(1);
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 return table;
 }

 public PdfPTable createTable(float[] widths)
 {
 PdfPTable table = new PdfPTable(widths);
 try
 {
  table.setTotalWidth(maxWidth);
  table.setLockedWidth(true);
  table.setHorizontalAlignment(Element.ALIGN_CENTER);
  table.getDefaultCell().setBorder(1);
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 return table;
 }

 public PdfPTable createBlankTable()
 {
 PdfPTable table = new PdfPTable(1);
 table.getDefaultCell().setBorder(0);
 table.addCell(createCell("", keyfont));
 table.setSpacingAfter(20.0f);
 table.setSpacingBefore(20.0f);
 return table;
 }

 public  void generatePDF(String [] head,List list,int colNum) 
 {
 Class classType = list.get(0).getClass();
 
 // 创建一个只有5列的表格
 PdfPTable table = createTable(colNum);

 // 添加备注,靠左,不显示边框
 table.addCell(createCell("APP信息列表:", keyfont, Element.ALIGN_LEFT, colNum,false));
 
 //设置表头
 for(int i = 0 ; i  0)
 {
  int size = list.size();
  for(int i = 0 ; i  String generatePDFs(String [] head,List list)
 {
 final String FilePath = "pdfPath";
 String saveFilePathAndName = "";
 
 //获得存储的根目录
 String savePath = new GetFilePlace().getFileDirFromProperties(FilePath);
 
 //获得当天存储的路径,不存在则生成当天的文件夹
 String realSavePath = new GenerateFold().getFold(savePath);
 
 saveFilePathAndName = new GenerateFileName().generateFileName(realSavePath,"pdf");
 
 File file = new File(saveFilePathAndName);
 try
 {
  file.createNewFile();
 }
 catch (IOException e1)
 {
  // TODO Auto-generated catch block
  e1.printStackTrace();
 }
  initFile(file);
 try
 {
  file.createNewFile(); //生成一个pdf文件
 }
 catch (IOException e)
 {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 new CreatePdf(file).generatePDF(head,list,head.length);
 
 return saveFilePathAndName;
 }

}

7)、测评函数 

 public static void main(String[] args) 
 {
 System.out.println("begin");
 
 String [] head = {"name","sex","adress","height","age","jj"};
 
 List list = new ArrayList();
 User user1 = new User("zhangsan",1,1.1f,"北京","男","AA");
 User user2 = new User("lisi",22222,3.2f,"上海","女","BB");
 
 list.add(user1);
 list.add(user2);
 
 
 String filePath = new CreatePdf().generatePDFs(head,list);
 System.out.println(filePath);
 System.out.println("end");
 }

8)、测试结果

9)、文件内容如下

4、其他相关链接

生成可变表头excel:http://www.cnblogs.com/0201zcr/p/4950619.html

读取excel:java使用POI批量导入excel数据的方法

java如何在pdf中生成表格,我相信通过这个简单实例演示有了大概的认识,大家可以动手去试验一下,看看会不会达到预想的效果。


推荐阅读
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
xieyuhua
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有