android下用itext修改pdf模板文件

这篇博客介绍了如何在Android环境下利用iText库读取预设的PDF模板,并填充表单域。首先通过Office 2007创建PDF文件,然后在Acrobat中制作表单域。接着使用iText的PDFreader读取模板,通过setField方法填写内容,最后保存为新的PDF文件。

最近公司项目要在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);
设置了中文字体后,内容就出来了



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值