java在pdf中生成表格的方法_java

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 <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)、测试结果

9)、文件内容如下

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, pdf
表格
java生成pdf表格、java 生成pdf 方法、java poi生成word表格、java生成word 带表格、java生成表格图片,以便于您获取更多的相关知识。

时间: 2024-10-26 11:35:46

java在pdf中生成表格的方法_java的相关文章

Java判断字符串中是否包含中文方法_java

今天和同事在讨论一个问题,需要检查"输入的字符串中是否包含中文",刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英文字符.数字.特殊字符,一时也没想出能匹配该场景的正则表达式,后来在网上搜了下,可以使用Matcher类来解决该问题,大致的代码实现如下: import java.util.regex.Matcher; import java.util.regex.Pattern; public clas

对象-java源码中一个抽象类初始化方法中包含一个super(),该怎么理解

问题描述 java源码中一个抽象类初始化方法中包含一个super(),该怎么理解 package org.apache.http.params; import java.util.Set; /** * Abstract base class for parameter collections. * Type specific setters and getters are mapped to the abstract, * generic getters and setters. * * @si

pdfbox 中读取pdf中的表格

问题描述 pdfbox 中读取pdf中的表格 我有很多pdf要把含有表格和图片的pdf提取出来,用pdfbox把含有图片的已经提取出来了,但是不知道怎么判断pdf中是否存在表格? 解决方案 JAVA PDFBOX 读取PDF表格pdf读取(PDFBox)

coreldraw中画表格的方法

问:Coreldraw中如何插入表格? 答:在Coreldraw中绘制表格的方法很多,并没有绝对的画法,根据各人掌握的方法不同均可以采取不同的措施,只要最终结果达到我们想要的就可以了,当然还要注意效率. 下面介绍几种常用的方法: 1.用方格纸工具画,然后解散群组,再更改自己想要的大小就可以了!这对于比较简单的表格比较适用. 2.是用手绘工具,按cbrl 键,你想画什么就画什么,如如果要画正规,就要配用对齐和变形工具,这方法比较老土,但优点是随意性比较强,缺点是把握性比较差. 3.先打好表头文字,

怎样将pdf中的表格转成Excel

如何将PDF中的表格转换到excel中?PDF文件一般情况下无法进行编辑,要针对PDF文件进行编辑也并非全无办法,我们可以使用AdobeAcrobat来进行编辑,但是必须注册使用,其次的问题是该软件的功能非常庞大,操作起来比较麻烦,不容易上手.因此现在多数会采用将PDF转换成其他格式的文件后再进行操作.用PDF转换成excel转换器是常见的一个转换方式. 迅捷PDF转换器 具体来看看操作步骤: 一.选择转换模式,点击PDF转Excel图标勾选即可. 二.添加文件.点击迅捷PDF转Excel转换软

Asp.Net实现无限分类生成表格的方法(后台自定义输出table)_实用技巧

本文实例讲述了Asp.Net实现无限分类生成表格的方法.分享给大家供大家参考,具体如下: 数据结构 monitor_group monitor_grp_id      monitor_grp_name     parent_id       level               childCount       orderby [int,自动递增]           [nvarchar,not null]      [int,not null]  [int,not null]   [int,

java itext pdf 导出复杂表格,合并单元格问题

问题描述 java itext pdf 导出复杂表格,合并单元格问题 PdfPTable bTable = new PdfPTable(7); PdfPCell cell = null; cell = new PdfPCell(new PdfPCell(new Paragraph("日期",font2))); cell = new Cell(new Cell(new Paragraph("日期",font2))); cell.setRowspan(2); cell

java 传递过程中出现的问题解决方法

java 传递过程中出现的问题解决方法  * 测试conn关闭情况  */ package com.hb.test; import java.sql.connection; /**  *  * @author icecold  */ public class testconn {    static connection conn = null;     public static void main(string[] args)throws exception {         conn =

java中pdf转图片的实现方法_java

JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用. 一.icepdf.有收费版和开源版,几种方法里最推荐的.转换的效果比较好,能识别我手头文件中的中文,就是转换后可能字体的关系部分字间距有点宽.因为,字体支持是要收费的,所以转换的图片会带有官方的水印.去水印的方法可以查看另一篇文章:icepdf去水印方法 1.下载icepdf的架包,并导入项目中,这里用到4个,如下: 2.附上代码例子: String filePath = "c:/test.pdf