ITEXT PDF 模板输出

一、需求:将数据,以表格形式输出PDF

二、方法:利用itext 操作pdf模板

三、资源:Adobe Acrobat Pro  、itextpdf-5.5.3 、itext-asian.jar

四、操作

1.制作pdf模板,在word文档中画出你想要输出的表格、

 
ITEXT PDF 模板输出_第1张图片
 

打开Adobe Acrobat Pro——》选择“创建PDF表单”——》选择源:(PDF、Word、Excel或其它文件类型),下一步 ——》定位Word文件路径,下一步——》点击"工具"-"表单"-"编辑" 可编辑表单字段名称位置


ITEXT PDF 模板输出_第2张图片
 
2.部分代码:

===================================================================================

String fpath = this.getServletContext().getRealPath("cm/tp")+File.separator;   //模板路径,自己改
     PdfReader reader = new PdfReader(fpath+"model.pdf");    //设计好的pdf模板
     PdfStamper ps = new PdfStamper(reader, response.getOutputStream());
    
     AcroFields fields = ps.getAcroFields();
     fillData(fields, bm2map(po),fpath);       // bm2map()是一个方法,返回值为Map,po是一个类对象,将模板 中的key和value组合成map,key为模板中字段域的名字,value为要输出的值
     /** 下面是处理图片,获得图片抽点,绝对位置输出到pdf模板中**/
     String img_uri = po.getImgUri();
     if(img_uri!=null && !img_uri.trim().equals("")){
      String fimg = uploadServlet.getBindPath(img_uri);
      File fs = uploadServlet.getFnBySize(new File(fimg),600);
      if(fs!=null){
       Image gif = Image.getInstance(fs.getPath());
       gif.setAbsolutePosition(450, 200);
       gif.scaleToFit(300, 300);
       PdfContentByte over = ps.getOverContent(2);
       over.addImage(gif,true);
      }
     }
     ps.setFormFlattening(true);
     ps.getWriter().flush();
     ps.close();

 ====================================================================================

 public static void fillData(AcroFields fields, Map data,String fpath) throws IOException, DocumentException {
  BaseFont bfChinese = BaseFont.createFont(fpath+"simfang.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);      //引用了simfang.ttf字体
  for (String key : data.keySet()) {
       String value = data.get(key);
       fields.setFieldProperty(key, "textfont", 
         bfChinese,
         //BaseFont.createFont() ,
         null);  
       fields.setField(key, value);
     }
  }

 ================================组合模板键值对的方=================================

public  Map bm2map(Bm bm) {
     Map data = new HashMap();
      data.put("bh",bm.getBh());
      data.put("lbCplb",bm.getLbCplb());
      data.put("ysd", bm.getYsd());
      data.put("jb",bm.getJb());
      SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
      if(bm.getGlRcrq()!=null)
      data.put("rgrq", sf.format(bm.getGlRcrq()).toString());
      data.put("mc",bm.getMc());
      data.put("ymc",bm.getMcYmc());
      data.put("mz",bm.getMz());
      data.put("nd",bm.getNdSd());
      data.put("zd",bm.getZd());
      if(bm.getSlCtsl()!=null)
      data.put("sl",bm.getSlCtsl()+"件");
      data.put("wccd",bm.getWcCd());
      data.put("zl",bm.getCc());
      data.put("bz",bm.getBz());
      data.put("tkr",bm.getTkr());
      if(bm.getDtCreate()!=null)
      data.put("tkrq",sf.format(bm.getDtCreate()).toString());
      data.put("imgUri", ""); 
      data.put("js",bm.getMsJs());
     return data;
   }

 

 五、不足:

1.PDF模板输出中会遇到部分常用字符包括中文无法显示,尝试设置不同字体,利用itext-asign各种版本字体,但还是没能完全解决,于是引入simfang.ttf字体,可显示全部中文,但缺点是,pdf的体积会变大。不知是否有更好的办法~以及其他方式的模板输出~

说明:此文章为自己的小总结,代码来源于网上各种大牛的文章~

你可能感兴趣的:(ITEXT)