最近公司项目要在android端生成表单文件并且打印,这段时间研究了一下,打印结合第三方的Printshare来实现,在使用过程中发现android生成的word文档很不稳定,经常出现不全的情况,所以就用pdf吧,于是就研究了一下itext生成pdf,果然好用,很快就能生成简单的pdf文件,不过由于公司的表单中表格文件相当复杂,并且会随时添加,那么用代码实现就显得相当麻烦。利用pdf的模板文件来修改生成pdf文件是一条可行的道路。其基本步骤如下:
1、采用office 2007制作PDF文件,其他PDF工具也可以。用word的表格文本处理能力来制作表格,应该都不会有什么问题,应该让代码来完成最灵巧的工作,注意留够表单域的空间。制作好的表格文件输出成为PDF文件.
2、使用Acrobat打开制作好的表格PDF文件,制作表单域。注意域名要唯一,同时,注意域的字体、格式、排列等相关属性。
3、使用iText的PDFreader来读取模板PDF文件,使用setField(fieldname,value)来填充PDF上的表格域,将完成后的PDF文件输出保存即得到完美的PDF表格文件。
上代码:
这里是设置读取pdf文件的路径和输出文件的路径,并对实体DataBean赋值
String ttfUrl = dirPath.toString() + "/FZSYJW.TTF";
BaseFont baseFont = BaseFont.createFont(ttfUrl,
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
DataBean date = new DataBean();
date.setName("翟昆");
date.setAddress("济南");
date.setPhone("15098975730");
date.setYoubian("255000");
date.setGx("是");
getPdfFile(fileurl,outUrl,date,baseFont);
/**
* 根据一个databean,处理一个pdf文件,
* @param templatefile //模板文件路径
* @param destfile //目标文件路径
* @param databean //数据接口的实现
*/
public void getPdfFile(String templatefile,String destfile,DataBean databean,BaseFont baseFont)throws IOException, DocumentException{
try {
String TemplatePDF = templatefile;
PdfReader reader = new PdfReader(TemplatePDF);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
destfile));
AcroFields form = stamper.getAcroFields();
DataBean db = databean;
List fieldnames = this.getFieldName(db);
for (int i = 0; i < fieldnames.size(); i++) {
String tmpname = fieldnames.get(i);
String value = this.getFieldValue(tmpname, db);
form.setFieldProperty(tmpname, "textfont", baseFont, null);
form.setField(tmpname, value);
}
stamper.setFormFlattening(true);
stamper.close();
reader.close();
} catch (Exception e) {
}
}
/**
* 根据数据bean得到pdf中要写入的textfield的名字
* @param db
*/
private List getFieldName(DataBean db){
List fieldnames = new ArrayList();
Field[] fields = db.getClass().getDeclaredFields();
for(int i=0;i
form.setFieldProperty(tmpname, "textfont", baseFont, null);
设置了中文字体后,内容就出来了