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包括以下几个

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:http://www.cnblogs.com/0201zcr/p/4950619.html

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

 

  致谢:感谢您的阅读!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15131.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论