• java 如何在pdf中生成表格


    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

      致谢:感谢您的阅读!

  • 相关阅读:
    使用ConcurrentHashMap需要知道的细节
    并查集(Union-Find)
    LeetCode2
    补充之前博客的几种排序--希尔排序、堆排序、归并排序
    左式二叉堆
    优先队列的一种实现--堆ADT
    开放地址法散列表ADT
    分离链表法散列ADT
    AVL树
    二叉查找树ADT--C语言描述
  • 原文地址:https://www.cnblogs.com/0201zcr/p/4952174.html
Copyright © 2020-2023  润新知