一、需求:将数据,以表格形式输出PDF
二、方法:利用itext 操作pdf模板
三、资源:Adobe Acrobat Pro 、itextpdf-5.5.3 、itext-asian.jar
四、操作
1.制作pdf模板,在word文档中画出你想要输出的表格、
打开Adobe Acrobat Pro——》选择“创建PDF表单”——》选择源:(PDF、Word、Excel或其它文件类型),下一步 ——》定位Word文件路径,下一步——》点击"工具"-"表单"-"编辑" 可编辑表单字段名称位置
===================================================================================
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<String, String> 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<String, String> bm2map(Bm bm) { Map<String, String> data = new HashMap<String, String>(); 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的体积会变大。不知是否有更好的办法~以及其他方式的模板输出~
说明:此文章为自己的小总结,代码来源于网上各种大牛的文章~