一、需求:将数据,以表格形式输出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 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的体积会变大。不知是否有更好的办法~以及其他方式的模板输出~
说明:此文章为自己的小总结,代码来源于网上各种大牛的文章~