itext使用模板生成pdf文件

转载自:http://blog.csdn.net/flyfeifei66/article/details/6739957

用pdf模板生成pdf文档很简单,首先需要手动做个pdf模板,上面有很多的类似html里的text域的东西,

给他们起好名字,在程序里填充就可以了。虽然由于不会做模板(实际上由于短时间无法去熟悉使用Adobe Acrobat )

而没有用到此篇文章(转载的别人的)(只好手动生成),但是感觉写的还是不错的。贴出来,以便将来用到了查看。

首先要定义一个DataBean接口,代码如下:

public interface DataBean {  

它是空的,表示是一个存储数据的接口,你也可以不要它,但是面向接口编程是个好的习惯。

将来就用它里面的数据来填充pdf表单。

比如说你有一个pdf模板文件,假设要一个字段xm,代码如下:

[java]  view plain  copy
 print ?
  1. public class DataBeanImpl implements DataBean    
  2. {    
  3.     private String  xm;    
  4.     
  5.     public String getXm() {    
  6.         return xm;    
  7.     }    
  8.     public void setXm(String xm) {    
  9.         this.xm = xm;    
  10.     }    
  11. }    

下面就要进行pdf处理了,第一个方法是根据一个模板文件和databean生成一个pdf文件,代码如下:

[java]  view plain  copy
 print ?
  1. /**  
  2.  * 根据一个databean,处理一个pdf文件,  
  3.  * @param templatefile //模板文件路径  
  4.  * @param destfile     //目标文件路径  
  5.  * @param databean     //数据接口的实现   
  6.  */    
  7. public void getPdfFile(String templatefile,String destfile,DataBean databean)throws IOException, DocumentException{    
  8.     String TemplatePDF=templatefile;    
  9.     PdfReader reader = new PdfReader(TemplatePDF);    
  10.     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destfile));    
  11.     AcroFields form = stamper.getAcroFields();   
  12.     DataBean db = databean;    
  13.     List<String> fieldnames = this.getFieldName(db);   
  14.     for(int i=0;i<fieldnames.size();i++){    
  15.         String tmpname = fieldnames.get(i);    
  16.         String value = this.getFieldValue(tmpname, db);    
  17.         form.setField(tmpname, value);    
  18.     }     
  19.     stamper.setFormFlattening(true);    
  20.     stamper.close();            
  21. }     

 这个方法中用到两个方法,一个是getfieldname,另一个是getfieldvale分别是取databean实现的名字与值,代码如下:

[java]  view plain  copy
 print ?
  1. /**  
  2.  * 根据数据bean得到pdf中要写入的textfield的名字  
  3.  * @param db  
  4.  */    
  5. private List<String> getFieldName(DataBean db){    
  6.     List<String> fieldnames = new ArrayList<String>();    
  7.     Field[] fields = db.getClass().getDeclaredFields();    
  8.     for(int i=0;i<fields.length;i++) {    
  9.         String tmpname  = fields[i].getName();    
  10.         fieldnames.add(tmpname);   
  11.     }    
  12.     return fieldnames;    
  13. }   

[java]  view plain  copy
 print ?
  1. private String getFieldValue(String fieldname,DataBean db)    
  2. {    
  3.     String value="";    
  4.     Method[] methods = db.getClass().getDeclaredMethods();    
  5.     for(int i=0;i<methods.length;i++) {    
  6.         String methodname = methods[i].getName();    
  7.         if (methodname.substring(0,3).toUpperCase().equals("GET") && methodname.substring(3).toUpperCase().equals(fieldname.toUpperCase())) {    
  8.             Method method = methods[i];    
  9.             try {    
  10.                 value = (String)method.invoke(db,new Object[] {});    
  11.             } catch (Exception e) {   
  12.                 e.printStackTrace();    
  13.             }    
  14.         }    
  15.     }  
  16.     return value;    
  17. }  

可以看出这几段代码的功能还是比较清晰的,他根据数据模型的属性判断需要往pdf表单中填入哪些内容,这首先当然要求你在

做模板和设计DB类时属性域保持一致。然后遍历这些属性,在遍历时通过遍历get方法和get方法后面的字符串找到属性具体的值。

这样就可以以值对的形式将DB的内容输出到pdf表单中。

[java]  view plain  copy
 print ?
  1. form.setField(tmpname, value);  

上面的代码可以封装在一个类中,可以把他看成是一个“打印公共类”,而对于不同的表单你还可能需要写一个单独的操作类

来准备数据,你很有可能会查询数据库,然后调用DB的set方法。


按说程序写到这应该就行了,但要是有多页呢,应该如何处理呢?于是就又写了个方法:

[java]  view plain  copy
 print ?
  1. /**  
  2.  * 根据一组databean,生成一个pdf,生成方法,是将多个pdf合并  
  3.  * @param templatefile  
  4.  * @param destfile  
  5.  * @param databean  
  6.  */    
  7. public void getPdfFile(String templatefile,String destpath,String destfilename,List<DataBean> databean) throws IOException, DocumentException {    
  8.     String filename=destpath+"/"+destfilename;    
  9.     Document document = new Document();    
  10.     PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));     
  11.     document.open();    
  12.     for (int i=0;i<databean.size();i++) {    
  13.         String tmppdffile = destpath+"/tmp_"+destfilename;    
  14.         this.getPdfFile(templatefile,tmppdffile,databean.get(i));    
  15.         PdfReader reader = new PdfReader(tmppdffile);       
  16.            int n = reader.getNumberOfPages();       
  17.            for(int j=1; j<=n; j++) {       
  18.                document.newPage();        
  19.                PdfImportedPage page = copy.getImportedPage(reader, j);       
  20.                copy.addPage(page);       
  21.            }                
  22.     }    
  23.     //删除临时文件    
  24.     File file =new File(destpath+"/tmp_"+destfilename);    
  25.     if (file.exists()){  
  26.         file.delete();    
  27.     }  
  28.     document.close();    
  29. }    
个人觉得这个方法可能会有些问题,所有的DB都是用相同的模板个目标路径。而每个处理DB的循环,

都用从头复制?总之是极为混乱的一个方法,

我们的疑问是:一个pdf模板不可以有多页吗?只要一个DB里的内容能跟表单里的所有内容一致应该就可以了。


等用到了将来再说吧。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值