大数据培训新三板挂牌机构 股票代码:837906 | EN CN
Java是什么?
Java历史
Java语言特点
C++ VS Java比较
Java工厂设计模式
Java抽象工厂模式
Java单例模式
Java建造者(Builder)模式
Java原型模式
Java适配器模式
Java桥接模式
Java获取网络文件大小
Java套接字到单一的客户端
Java连接套接字
Java URL部分
Java URL连接日期
Java下载网页
Java主机指定IP地址
Java确定本地IP地址
Java检查端口占用
Java查找代理服务器设置
Java创建Socket
Java线程实例
Java检查线程活着
Java如何检查一个线程停止或没有?
Java解决死锁实例
Java如何获取正在运行的线程的优先级?
Java如何监视线程的状态?
Java获取线程名称
Java线程生产者消费者问题
Java如何设置线程的优先级?
Java如何停止线程一会儿?
Java如何暂停线程?
Java获取线程ID
Java如何检查线程的优先级?
Java显示所有正在运行的线程?
Java显示线程状态
Java中断一个线程
Java Applet实例
Java创建Applet
Java使用Applet创建横幅
Java使用Applet显示时钟?
Java在一个Applet创建不同形状
Java如何使用Applet填充形状的颜色?
Java使用Applet跳转到一个链接
Java在Applet创建事件监听器
Java使用Applet显示图像
Java使用Applet在新窗口中打开链接
Java使用Applet播放声音?
Java使用Applet读取文件
Java使用Applet写入文件
Java中Swing应用程序applet
Java简单的图形用户界面-GUI
Java以不同的字体显示文本
Java使用GUI画一条线
Java创建框架-frame
Java使用GUI显示多边形
Java在矩形中显示文本
Java GUI显示不同形状
Java如何绘制GUI实心矩形?
Java创建GUI透明光标
Java检查GUI平滑处理状态
Java在框架中显示颜色
Java GUI显示饼图
Java使用图形用户界面绘制文本
Java编辑表-table
Java 使用prepared语句
Java使用保存点和回滚
Java同时执行数据库多个SQL命令
Java使用行方法
Java使用列方法
Java正则表达式实例
Java将字符串分割
Java搜索重复单词
Java查找出现的单词
Java最后一个词的索引
Java模式匹配
Java删除空格
Java匹配电话号码
Java计数组词
Java搜索词组
Java拆分正则表达式
Java替换第一个出现字符串
Java检查日期格式
Java验证电子邮件地址格式
Java替换所有匹配字符串
Java使每个单词的第一个字母大写
从XML创建SqlSessionFactory实例
不使用XML来创建SqlSessionFactory
从SqlSessionFactory获取SqlSession
映射SQL语句
作用域和生命周期
Mapper XML配置
properties元素
Settings元素
typeAliases 元素
typeHandlers元素
理解CacheLine与写出更好的JAVA
Java核心技术点之动态代理
更好的使用JAVA线程池
理解Java中字符流与字节流的区别
深入分析Java方法反射的实现原理
关于Java面试,你应该准备这些知识点
Java内存模型
2017年你不能错过的Java类库
Leakcanary Square的一款Android/Java内存泄漏检测工具
Java Synchronised机制
Java核心技术点之注解
JVM(8):JVM知识点总览-高级Java工程师面试必备
JVM(3):Java GC算法 垃圾收集器
JVM(1):Java 类的加载机制
解决ActiveMQ中,Java与C++交互中文乱码问题
关于Java Collections的几个常见问题
Java I/O 总结
JVM源码分析之Java对象的创建过程
JVM源码分析之Java类的加载过程
Java GC的那些事(下)
Java GC的那些事(上)
java对象头的HotSpot实现分析
面试的角度诠释Java工程师(一)
面试的角度诠释Java工程师(二)
框架开发之Java注解的妙用
谈谈Java反射机制
Java并发:volatile内存可见性和指令重排
死磕Java并发:Java内存模型之happens-before
死磕Java并发:深入分析volatile的实现原理
死磕Java并发:深入分析synchronized的实现原理
Java 10 可能对 Lambda 表达式进行升级
G1垃圾回收器中的字符串去重(Java 8 Update 20)
Java RESTful框架的性能比较
理解RxJava的线程模型
继续了解Java的纤程库 – Quasar
Java中的纤程库 – Quasar
Java豆瓣电影爬虫——抓取电影详情和电影短评数据
Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
Java Lambda表达式初探
Java中的陷阱题
Java 9的这一基本功能,你可能从未听过
关于Java并发编程的总结和思考
几种简单的负载均衡算法及其Java代码实现
JAVA虚拟机关闭钩子(Shutdown Hook)
Java 脚本化编程指南
Java Scripting API 使用示例
Java 8 的 Nashorn 脚本引擎教程
如何开始使用 Java 机器学习
CognitiveJ —— Java 的图像分析库
Java 性能优化的五大技巧
Java 解惑:Comparable 和 Comparator 的区别
Google Java编程风格指南
java NIO详解
Java 异常处理的误区和经验总结
Java语法糖(4):内部类
Java语法糖(3):泛型
Java语法糖(2):自动装箱和自动拆箱
Java消息队列任务的平滑关闭
Java语法糖(1):可变长度参数以及foreach循环原理
2016最流行的Java EE服务器
自己写一个java.lang.reflect.Proxy代理的实现
java 如何在pdf中生成表格
如何防止单例模式被JAVA反射攻击
java虚拟机 jvm 局部变量表实战
聊聊并发-Java中的Copy-On-Write容器
java.lang.Instrument 代理Agent使用
Java开发者需要了解的移动开发编程语言
13个不容错过的Java项目
2016年7款最佳 Java 框架推荐
Java 开发者值得关注的 11 个技术博客
Redmonk发布Java框架流行度调研结果
Java 8开发的4大顶级技巧
GitHub漫游指南:10个值得你关注的Java项目
除了Guava,Java开发者还值得了解的5个谷歌类库
Java中创建对象的5种不同方法
Java性能优化全攻略
奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?
11个最值得Java开发者收藏的网站
Java的常见误区与细节
对Java意义重大的7个性能指标
Java调优经验谈
关于Java并发编程的总结和思考
HDFS Federation设计动机与基本原理
《Effective STL》学习笔记(第三部分)
《Effective STL》学习笔记(第二部分)
《Effective STL》学习笔记(第一部分)
数据结构之位图
Thrift使用指南
Cassandra概要介绍
Cassandra部署与安装
Cassandra客户端
Cassandra数据模型
Cassandra中的各种策略
数据结构之树状数组
数据结构之伸展树
数据结构之后缀数组
数据结构之堆
浅析MRv1与MRv2的API兼容性
Apache Tez最新进展
运行在YARN上的计算框架
从传统操作系统角度理解Hadoop YARN

java 如何在pdf中生成表格

于2017-05-10由小牛君创建

分享到:


1、目标

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

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

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

通过读取properties文件动态获取文件存储的跟目录。获取方式可查看:http://www.cnblogs.com/0201zcr/p/4700418.html

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)、文件内容如下

4、其他相关链接

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

读取excel:http://www.cnblogs.com/0201zcr/p/4656779.html