itext使用模板生成pdf文件
来源:互联网 发布:西安网站关键词优化 编辑:程序博客网 时间:2024/04/30 06:15
用pdf模板生成pdf文档很简单,首先需要手动做个pdf模板,上面有很多的类似html里的text域的东西,
给他们起好名字,在程序里填充就可以了。虽然由于不会做模板(实际上由于短时间无法去熟悉使用Adobe Acrobat )
而没有用到此篇文章(转载的别人的)(只好手动生成),但是感觉写的还是不错的。贴出来,以便将来用到了查看。
首先要定义一个DataBean接口,代码如下:
public interface DataBean {
}
它是空的,表示是一个存储数据的接口,你也可以不要它,但是面向接口编程是个好的习惯。
将来就用它里面的数据来填充pdf表单。
比如说你有一个pdf模板文件,假设要一个字段xm,代码如下:
public class DataBeanImpl implements DataBean { private String xm; public String getXm() { return xm; } public void setXm(String xm) { this.xm = xm; } }
下面就要进行pdf处理了,第一个方法是根据一个模板文件和databean生成一个pdf文件,代码如下:
/** * 根据一个databean,处理一个pdf文件, * @param templatefile //模板文件路径 * @param destfile //目标文件路径 * @param databean //数据接口的实现 */ public void getPdfFile(String templatefile,String destfile,DataBean databean)throws IOException, DocumentException{ 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.setField(tmpname, value); } stamper.setFormFlattening(true); stamper.close(); }
这个方法中用到两个方法,一个是getfieldname,另一个是getfieldvale分别是取databean实现的名字与值,代码如下:
/** * 根据数据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表单中填入哪些内容,这首先当然要求你在
做模板和设计DB类时属性域保持一致。然后遍历这些属性,在遍历时通过遍历get方法和get方法后面的字符串找到属性具体的值。
这样就可以以值对的形式将DB的内容输出到pdf表单中。
form.setField(tmpname, value);
上面的代码可以封装在一个类中,可以把他看成是一个“打印公共类”,而对于不同的表单你还可能需要写一个单独的操作类
来准备数据,你很有可能会查询数据库,然后调用DB的set方法。
按说程序写到这应该就行了,但要是有多页呢,应该如何处理呢?于是就又写了个方法:
/** * 根据一组databean,生成一个pdf,生成方法,是将多个pdf合并 * @param templatefile * @param destfile * @param databean */ public void getPdfFile(String templatefile,String destpath,String destfilename,List<DataBean> databean) throws IOException, DocumentException { String filename=destpath+"/"+destfilename; Document document = new Document(); PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename)); document.open(); for (int i=0;i<databean.size();i++) { String tmppdffile = destpath+"/tmp_"+destfilename; this.getPdfFile(templatefile,tmppdffile,databean.get(i)); PdfReader reader = new PdfReader(tmppdffile); int n = reader.getNumberOfPages(); for(int j=1; j<=n; j++) { document.newPage(); PdfImportedPage page = copy.getImportedPage(reader, j); copy.addPage(page); } } //删除临时文件 File file =new File(destpath+"/tmp_"+destfilename); if (file.exists()){ file.delete(); } document.close(); }个人觉得这个方法可能会有些问题,所有的DB都是用相同的模板个目标路径。而每个处理DB的循环,
都用从头复制?总之是极为混乱的一个方法,
我们的疑问是:一个pdf模板不可以有多页吗?只要一个DB里的内容能跟表单里的所有内容一致应该就可以了。
等用到了将来再说吧。
- itext使用模板生成pdf文件
- itext使用模板生成pdf文件
- 使用freemaker和itext从html模板生成pdf文件
- 使用iText生成pdf文件
- 使用iText生成PDF文件
- java-pdf-(itext+adobe acrobat+pdf模板)生成pdf文件
- itext pdf模板生成pdf
- 使用itext组件生成PDF文件
- itext使用html标签生成pdf文件
- 【Java】使用iText生成PDF文件
- Itext生成PDF文件
- Java IText使用PDF模板 生成 输出PDF
- 【java】 iText使用PDF模板生成输出PDF
- 【java】 iText使用PDF模板生成输出PDF
- Java IText使用PDF模板 生成 输出PDF
- Java iText使用PDF模板生成PDF文档
- Java iText使用PDF模板生成PDF文档
- 生成pdf,使用itext
- java作用域public ,private ,protected 及不写时的区别,static关键字的使用
- 一个php截取指定字符串之间的字符串的类
- itext生成发票套打
- 编程计算表达式:6 5 2 3 + 8 * + 3 + * 的结果
- javascript实现页面跳转的几种方式
- itext使用模板生成pdf文件
- php截取指定字符之间内容的类与实例(含转码、过滤html等)
- 半边数据结构
- Hierarchy Viewer 帮你分析应用程序UI布局
- IT笔试的排序和查找(基础知识)
- 敏捷测试的思考和新发展
- 新做的页面框架
- 软件测试常用术语表
- ubuntu10.10 Qt creater安装 亲测可用(转)