欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java在pdf中生成表格的方法

程序员文章站 2024-03-08 10:42:22
1、目标   在pdf中生成一个可变表头的表格,并向其中填充数据。通过泛型动态的生成表头,通过反射动态获取实体类(我这里是user)的get方法动态获得数据,从而达到动态...

1、目标

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

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

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

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

2、所需的jar

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

java在pdf中生成表格的方法

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 <t> void generatepdf(string [] head,list<t> 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 < colnum ; i++)
 {
  table.addcell(createcell(head[i], keyfont, element.align_center));
 }
 
 
 if(null != list && list.size() > 0)
 {
  int size = list.size();
  for(int i = 0 ; i < size ; i++)
  {
  t t = list.get(i);
  for(int j = 0 ; j < colnum ; j ++)
  {
   //获得首字母
   string firstletter = head[j].substring(0,1).touppercase(); 
   
   //获得get方法,getname,getage等
   string getmethodname = "get" + firstletter + head[j].substring(1);
   
   method method;
   try
   {
   //通过反射获得相应的get方法,用于获得相应的属性值
   method = classtype.getmethod(getmethodname, new class[]{});
   try
   {
    system.out.print(getmethodname +":" + method.invoke(t, new class[]{}) +",");
    //添加数据
    table.addcell(createcell(method.invoke(t, new class[]{}).tostring(), textfont));
   }
   catch (illegalargumentexception e)
   {
    e.printstacktrace();
   }
   catch (illegalaccessexception e)
   {
    e.printstacktrace();
   }
   catch (invocationtargetexception e)
   {
    e.printstacktrace();
   } 
   }
   catch (securityexception e)
   {
   e.printstacktrace();
   }
   catch (nosuchmethodexception e)
   {
   e.printstacktrace();
   }
  }
  
  system.out.println("");
  }
 }
 
 try
 {
  //将表格添加到文档中
  document.add(table);
 }
 catch (documentexception e)
 {
  e.printstacktrace();
 }
 
 //关闭流
 document.close();
 }
 
 
 /**
 * 提供外界调用的接口,生成以head为表头,list为数据的pdf
 * @param head //数据表头
 * @param list //数据
 * @return //excel所在的路径
 */
 public <t> string generatepdfs(string [] head,list<t> 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<user> list = new arraylist<user>();
 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)、测试结果

java在pdf中生成表格的方法

9)、文件内容如下

java在pdf中生成表格的方法

4、其他相关链接

生成可变表头excel:

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

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