最近公司项目要在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<String> 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<String> getFieldName(DataBean db){      List<String> fieldnames = new ArrayList<String>();      Field[] fields = db.getClass().getDeclaredFields();      for(int i=0;i<fields.length;i++) {          String tmpname  = fields[i].getName();          fieldnames.add(tmpname);     }      return fieldnames;  } private String getFieldValue(String fieldname,DataBean db)  {      String value="";      Method[] methods = db.getClass().getDeclaredMethods();      for(int i=0;i<methods.length;i++) {          String methodname = methods[i].getName();          if (methodname.substring(0,3).toUpperCase().equals("GET") && methodname.substring(3).toUpperCase().equals(fieldname.toUpperCase())) {              Method method = methods[i];              try {                  value = (String)method.invoke(db,new Object[] {});              } catch (Exception e) {                 e.printStackTrace();              }          }      }    return value;  }

以上内容就是读取pdf模板并修改或者添加文本域中的内容的实现,在刚开始做的时候一直编辑不进值,后来找到原因,是没有设置字体

form.setFieldProperty(tmpname, "textfont", baseFont, null);
设置了中文字体后,内容就出来了



更多相关文章

  1. Android(安卓)打包及引用 aar 文件的方法
  2. 安卓root漏洞分析——CVE-2009-1185
  3. Android(安卓)轻松实现后台搭建+APP版本更新
  4. Android(安卓)Dex VS Class:实例图解剖析两种格式文件结构、优劣
  5. Android(安卓)Studio下添加引用jar文件和so文件
  6. android 无法生成R文件的原因剖析
  7. Android(安卓)- 小功能 使用ImageView加载本地SdCard图片和加载
  8. Android(安卓)信号处理面面观 之 trace 文件含义
  9. Android中aar和jar文件的认识

随机推荐

  1. Android启动流程
  2. 修改android wifi热点默认网关
  3. android布局属性详解
  4. Failed to sync vcpu reg
  5. android 数据库 备份还原
  6. android自带的drawable图标ico名称对应表
  7. Cocos2d-3.x Android环境搭建
  8. Android(安卓)RelativeLayout 实现顶部左
  9. 2013.05.16——— android 关于listview
  10. Android中获取屏幕信息DisplayMetrics的