Java IText使用PDF模板 生成 输出PDF

转载自:http://blog.csdn.net/binyao02123202/article/details/6773986

这是本人学习ITEXT的一些小实践,希望可以帮到大家。这也是我第一次写这种类型博客,如有不好之处欢迎指出!!下面我们开始吧! 

本文所要用到的工具或jar主要有: Acrobat 8 这个主要用来制作PDF模板、eclipse这个看你喜欢咯(你用其他也行) 、 itext.jar、 
还有为了解决中文的输出问题,需要多下载一个名为iTextAsian.jar的JAR包。这个包里面定义了与中文输出相关的一些文件。 
好了,需要做的就是这些了,简单的PDF生成这里就不再作介绍了,本文主要讲解如何使用PDF模板。 

我们先来看看制作出来的效果: 




上图表格上及表格中的数据是动态添加进去的,页数为两页(为节约版面现只显示一页) 
两页都是用的同一模板的, 
1、 模板的制作: 
我主要使用的是Acrobat8.0,上面所用到的模板是由 周工作报告 模板修改而来的,如果想学习如何新建一个新的模板,大家可以参照下这里吧! 
http://lxy19791111.iteye.com/blog/102848 
2、 取得每个表单域的名字 
模板制作好后,要插入数据首先就要知道需要插在模板中位置,

Java代码   收藏代码
  1.   //需要生成后的PDF   
  2. FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");   
  3.   //PDF模板路径   
  4. String TemplatePDF ="c:/test/PdfTemplate.pdf";   
  5.        PdfReader reader = new PdfReader(TemplatePDF);     
  6. PdfStamper stamp = new PdfStamper(reader,fos);   
  7. AcroFields form = stamp.getAcroFields();   
  8. for (Iterator it = form.getFields().keySet().iterator(); it   
  9. .hasNext();) {   
  10. System.out.println(it.next());   
  11. }   
[java]  view plain  copy
 print ?
  1.   //需要生成后的PDF   
  2. FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");   
  3.   //PDF模板路径   
  4. String TemplatePDF ="c:/test/PdfTemplate.pdf";   
  5.        PdfReader reader = new PdfReader(TemplatePDF);     
  6. PdfStamper stamp = new PdfStamper(reader,fos);   
  7. AcroFields form = stamp.getAcroFields();   
  8. for (Iterator it = form.getFields().keySet().iterator(); it   
  9. .hasNext();) {   
  10. System.out.println(it.next());   
  11. }   

这个是打印后的部分结果:

我们只取后面那个命名就行,如"星期四[3]"
当然,模板是你自己定义,文本域的命名你当然知道了,这里只是作个简单介绍而已。
3、下面是插入数据及PDF合并的代码:
Java代码   收藏代码
  1. package com.golden.info.test;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.util.Date;  
  8.   
  9. import com.lowagie.text.Document;  
  10. import com.lowagie.text.DocumentException;  
  11. import com.lowagie.text.pdf.AcroFields;  
  12. import com.lowagie.text.pdf.PdfCopy;  
  13. import com.lowagie.text.pdf.PdfImportedPage;  
  14. import com.lowagie.text.pdf.PdfReader;  
  15. import com.lowagie.text.pdf.PdfStamper;  
  16. public class TestPdfTemplate {    
  17.     public static void main(String[] args) {  
  18.         try {  
  19.             int count = 8;// 总记录数  
  20.             int pageCount = 4;// 每页记录数  
  21.             int index = 1// 表格序号  
  22.             int page = 0;// 总共页数  
  23.             /** 主要控制总共的页数*/  
  24.             if (count >= pageCount && count % pageCount == 0) {  
  25.                 page = count / pageCount;  
  26.             } else {  
  27.                 page = count / pageCount + 1;  
  28.             }  
  29.             String TemplatePDF = "c:/test/PdfTemplate.pdf";//设置模板路径  
  30.             FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");//需要生成PDF  
  31.               
  32.             ByteArrayOutputStream baos[] = new ByteArrayOutputStream[page];//用于存储每页生成PDF流  
  33.             /** 向PDF模板中插入数据 */  
  34.             for (int item = 0; item < page; item++) {  
  35.                 baos[item] = new ByteArrayOutputStream();  
  36.                 PdfReader reader = new PdfReader(TemplatePDF);  
  37.                 PdfStamper stamp = new PdfStamper(reader, baos[item]);  
  38.                 AcroFields form = stamp.getAcroFields();  
  39.                 form.setField("DepartmnetNmae""蓝飞");//插入的数据都为字符类型  
  40.                 form.setField("qq""252462807");                 
  41.                 form.setField("pageNumber""第" + (item + 1) + "页,共" + page  
  42.                         + "页");  
  43.                 if (count % pageCount != 0 && item == page - 1) {  
  44.                     System.out.println("====pageCount+" + pageCount + "=====");  
  45.                     pageCount = count % pageCount;  
  46.                 }  
  47.                 /**因为PDF中的表格其实是众多的文本域组成,就是一个数组,所以把它循环出来就可以了*/  
  48.                 for (int j = 0; j < pageCount; j++) {  
  49.                     form.setField("ProjectTask[" + j + "]", index + "");  
  50.                     form.setField("星期一[" + j + "]""星期一[" + index + "]");  
  51.                     form.setField("星期二[" + j + "]""星期二[" + index + "]");  
  52.                     form.setField("星期三[" + j + "]""星期三[" + index + "]");  
  53.                     form.setField("星期四[" + j + "]""星期四[" + index + "]");  
  54.                     form.setField("星期五[" + j + "]""星期五[" + index + "]");  
  55.                     form.setField("星期六[" + j + "]""星期六[" + index + "]");  
  56.                     form.setField("星期日[" + j + "]""星期日[" + index + "]");  
  57.                     form.setField("意见[" + j + "]""同意[" + j + "]");  
  58.                     index++;  
  59.                 }  
  60.                 stamp.setFormFlattening(true); // 千万不漏了这句啊, */  
  61.                 stamp.close();  
  62.             }  
  63.             Document doc = new Document();  
  64.             PdfCopy pdfCopy = new PdfCopy(doc, fos);  
  65.             doc.open();  
  66.             PdfImportedPage impPage = null;  
  67.             /**取出之前保存的每页内容*/  
  68.             for (int i = 0; i < page; i++) {  
  69.                 impPage = pdfCopy.getImportedPage(new PdfReader(baos[i]  
  70.                         .toByteArray()), 1);  
  71.                 pdfCopy.addPage(impPage);  
  72.             }  
  73.             doc.close();//当文件拷贝  记得关闭doc  
  74.         } catch (FileNotFoundException e) {  
  75.             e.printStackTrace();  
  76.         } catch (IOException e) {  
  77.             e.printStackTrace();  
  78.         } catch (DocumentException e) {  
  79.             e.printStackTrace();  
  80.         }  
  81.   
  82.     }  
  83. }  
[java]  view plain  copy
 print ?
  1. package com.golden.info.test;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.util.Date;  
  8.   
  9. import com.lowagie.text.Document;  
  10. import com.lowagie.text.DocumentException;  
  11. import com.lowagie.text.pdf.AcroFields;  
  12. import com.lowagie.text.pdf.PdfCopy;  
  13. import com.lowagie.text.pdf.PdfImportedPage;  
  14. import com.lowagie.text.pdf.PdfReader;  
  15. import com.lowagie.text.pdf.PdfStamper;  
  16. public class TestPdfTemplate {    
  17.     public static void main(String[] args) {  
  18.         try {  
  19.             int count = 8;// 总记录数  
  20.             int pageCount = 4;// 每页记录数  
  21.             int index = 1// 表格序号  
  22.             int page = 0;// 总共页数  
  23.             /** 主要控制总共的页数*/  
  24.             if (count >= pageCount && count % pageCount == 0) {  
  25.                 page = count / pageCount;  
  26.             } else {  
  27.                 page = count / pageCount + 1;  
  28.             }  
  29.             String TemplatePDF = "c:/test/PdfTemplate.pdf";//设置模板路径  
  30.             FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");//需要生成PDF  
  31.               
  32.             ByteArrayOutputStream baos[] = new ByteArrayOutputStream[page];//用于存储每页生成PDF流  
  33.             /** 向PDF模板中插入数据 */  
  34.             for (int item = 0; item < page; item++) {  
  35.                 baos[item] = new ByteArrayOutputStream();  
  36.                 PdfReader reader = new PdfReader(TemplatePDF);  
  37.                 PdfStamper stamp = new PdfStamper(reader, baos[item]);  
  38.                 AcroFields form = stamp.getAcroFields();  
  39.                 form.setField("DepartmnetNmae""蓝飞");//插入的数据都为字符类型  
  40.                 form.setField("qq""252462807");                 
  41.                 form.setField("pageNumber""第" + (item + 1) + "页,共" + page  
  42.                         + "页");  
  43.                 if (count % pageCount != 0 && item == page - 1) {  
  44.                     System.out.println("====pageCount+" + pageCount + "=====");  
  45.                     pageCount = count % pageCount;  
  46.                 }  
  47.                 /**因为PDF中的表格其实是众多的文本域组成,就是一个数组,所以把它循环出来就可以了*/  
  48.                 for (int j = 0; j < pageCount; j++) {  
  49.                     form.setField("ProjectTask[" + j + "]", index + "");  
  50.                     form.setField("星期一[" + j + "]""星期一[" + index + "]");  
  51.                     form.setField("星期二[" + j + "]""星期二[" + index + "]");  
  52.                     form.setField("星期三[" + j + "]""星期三[" + index + "]");  
  53.                     form.setField("星期四[" + j + "]""星期四[" + index + "]");  
  54.                     form.setField("星期五[" + j + "]""星期五[" + index + "]");  
  55.                     form.setField("星期六[" + j + "]""星期六[" + index + "]");  
  56.                     form.setField("星期日[" + j + "]""星期日[" + index + "]");  
  57.                     form.setField("意见[" + j + "]""同意[" + j + "]");  
  58.                     index++;  
  59.                 }  
  60.                 stamp.setFormFlattening(true); // 千万不漏了这句啊, */  
  61.                 stamp.close();  
  62.             }  
  63.             Document doc = new Document();  
  64.             PdfCopy pdfCopy = new PdfCopy(doc, fos);  
  65.             doc.open();  
  66.             PdfImportedPage impPage = null;  
  67.             /**取出之前保存的每页内容*/  
  68.             for (int i = 0; i < page; i++) {  
  69.                 impPage = pdfCopy.getImportedPage(new PdfReader(baos[i]  
  70.                         .toByteArray()), 1);  
  71.                 pdfCopy.addPage(impPage);  
  72.             }  
  73.             doc.close();//当文件拷贝  记得关闭doc  
  74.         } catch (FileNotFoundException e) {  
  75.             e.printStackTrace();  
  76.         } catch (IOException e) {  
  77.             e.printStackTrace();  
  78.         } catch (DocumentException e) {  
  79.             e.printStackTrace();  
  80.         }  
  81.   
  82.     }  
  83. }  


至于,生于PDF后,想打印出来,只要调用以下代码就行了
Java代码   收藏代码
  1.           
  2. try{               
  3. Executable ex = new Executable();         
  4.        ex.openDocument("c:/test/Pdf.pdf");             
  5.     ex.printDocument("c:/test/Pdf.pdf");  
  6.     }catch(IOException e){      
  7.     e.printStackTrace();        
  8.     }  
[java]  view plain  copy
 print ?
  1.           
  2. try{               
  3. Executable ex = new Executable();         
  4.        ex.openDocument("c:/test/Pdf.pdf");             
  5.     ex.printDocument("c:/test/Pdf.pdf");  
  6.     }catch(IOException e){      
  7.     e.printStackTrace();        
  8.     }  

到这里,运用上面的那些代码,就完成了PDF模板输出报表.
(PDF模板、代码跟运行结果在附件里)
有错误之处请指正.
也希望这篇文章可以帮到您.
  • 大小: 41.6 KB
  • 大小: 24.6 KB

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值