IText使用PDF模板输出报表的实践
这是本人学习ITEXT的一些小实践,希望可以帮到大家。这也是我第一次写这种类型博客,如有不好之处欢迎指出!!下面我们开始吧!
本文所要用到的工具或jar主要有: Acrobat 8 这个主要用来制作PDF模板、eclipse这个看你喜欢咯(你用其他也行) 、 itext.jar、
还有为了解决中文的输出问题,需要多下载一个名为iTextAsian.jar的JAR包。这个包里面定义了与中文输出相关的一些文件。
好了,需要做的就是这些了,简单的PDF生成这里就不再作介绍了,本文主要讲解如何使用PDF模板。
我们先来看看制作出来的效果:
上图表格上及表格中的数据是动态添加进去的,页数为两页(为节约版面现只显示一页)
两页都是用的同一模板的,
1、 模板的制作:
我主要使用的是Acrobat8.0,上面所用到的模板是由 周工作报告 模板修改而来的,如果想学习如何新建一个新的模板,大家可以参照下这里吧!
http://lxy19791111.iteye.com/blog/102848
2、 取得每个表单域的名字
模板制作好后,要插入数据首先就要知道需要插在模板中位置,
//需要生成后的PDF FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf"); //PDF模板路径 String TemplatePDF ="c:/test/PdfTemplate.pdf"; PdfReader reader = new PdfReader(TemplatePDF); PdfStamper stamp = new PdfStamper(reader,fos); AcroFields form = stamp.getAcroFields(); for (Iterator it = form.getFields().keySet().iterator(); it .hasNext();) { System.out.println(it.next()); }
package com.golden.info.test;import java.io.ByteArrayOutputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Date;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.pdf.AcroFields;import com.lowagie.text.pdf.PdfCopy;import com.lowagie.text.pdf.PdfImportedPage;import com.lowagie.text.pdf.PdfReader;import com.lowagie.text.pdf.PdfStamper;public class TestPdfTemplate {public static void main(String[] args) {try {int count = 8;// 总记录数int pageCount = 4;// 每页记录数int index = 1; // 表格序号int page = 0;// 总共页数/** 主要控制总共的页数*/if (count >= pageCount && count % pageCount == 0) {page = count / pageCount;} else {page = count / pageCount + 1;}String TemplatePDF = "c:/test/PdfTemplate.pdf";//设置模板路径FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");//需要生成PDFByteArrayOutputStream baos[] = new ByteArrayOutputStream;//用于存储每页生成PDF流/** 向PDF模板中插入数据 */for (int item = 0; item < page; item++) {baos[item] = new ByteArrayOutputStream();PdfReader reader = new PdfReader(TemplatePDF);PdfStamper stamp = new PdfStamper(reader, baos[item]);AcroFields form = stamp.getAcroFields();form.setField("DepartmnetNmae", "蓝飞");//插入的数据都为字符类型form.setField("qq", "252462807");form.setField("pageNumber", "第" + (item + 1) + "页,共" + page+ "页");if (count % pageCount != 0 && item == page - 1) {System.out.println("====pageCount+" + pageCount + "=====");pageCount = count % pageCount;}/**因为PDF中的表格其实是众多的文本域组成,就是一个数组,所以把它循环出来就可以了*/for (int j = 0; j < pageCount; j++) {form.setField("ProjectTask[" + j + "]", index + "");form.setField("星期一[" + j + "]", "星期一[" + index + "]");form.setField("星期二[" + j + "]", "星期二[" + index + "]");form.setField("星期三[" + j + "]", "星期三[" + index + "]");form.setField("星期四[" + j + "]", "星期四[" + index + "]");form.setField("星期五[" + j + "]", "星期五[" + index + "]");form.setField("星期六[" + j + "]", "星期六[" + index + "]");form.setField("星期日[" + j + "]", "星期日[" + index + "]");form.setField("意见[" + j + "]", "同意[" + j + "]");index++;}stamp.setFormFlattening(true); // 千万不漏了这句啊, */stamp.close();}Document doc = new Document();PdfCopy pdfCopy = new PdfCopy(doc, fos);doc.open();PdfImportedPage impPage = null;/**取出之前保存的每页内容*/for (int i = 0; i < page; i++) {impPage = pdfCopy.getImportedPage(new PdfReader(baos[i].toByteArray()), 1);pdfCopy.addPage(impPage);}doc.close();//当文件拷贝 记得关闭doc} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();}}}
try{ Executable ex = new Executable(); ex.openDocument("c:/test/Pdf.pdf"); ex.printDocument("c:/test/Pdf.pdf");}catch(IOException e){ e.printStackTrace(); }