Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1561619
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:17:13

一起学习
我使用iText输出PDF报表的实践   最近,工作中,用到iText输出PDF格式的报表,过程中熟悉了iText的用法,在这里跟大家分享一下。   iText作为一个文本输出的java开源代码,提供了PDF、Html、Rtf等多种文件格式的输出功能。为输出各种文本提供了一个比较好的封装。对于PDF报表的输出,仅仅用到了其中很小整个开源代码的很小的一个部分。包括:   1、 PDF文档输出的基本组成部分   2、 PDF文档的一些设置   3、 中文的输出   4、 表格的设置   下面,我会就这4个方面,一一讲述我使用过程中的一些感受。 1. PDF文档输出的基本组成部分   首先,作为最基本的程序设计实践,最经典的范例仍然是Hello World,最开始,我也是输出了一个Hello world。代码是这样的:   package com.lowagie.examples.general;   import java.io.FileOutputStream;   import java.io.IOException;   import com.lowagie.text.*;   import com.lowagie.text.pdf.PdfWriter;   /**    * Generates a simple 'Hello World' PDF file.    *    * @author blowagie    */   public class HelloWorld {     /**      * Generates a PDF file with the text 'Hello World'      *      * @param args no arguments needed here      */     public static void main(String[] args) {       System.out.println("Hello World");       // step a: creation of a document-object       Document document = new Document();       try {         // step b:         // we create a writer that listens to the document         // and directs a PDF-stream to a file         PdfWriter.getInstance(document,new FileOutputStream("HelloWorld.pdf"));         // step c: we open the document         document.open();         // step d: we add a paragraph to the document         document.add(new Paragraph("Hello World"));       } catch (DocumentException de) {         System.err.println(de.getMessage());       } catch (IOException ioe) {         System.err.println(ioe.getMessage());       }       // step e: we close the document         document.close();       }     }   可以看到一个PDF文件的输出,总共只需要5个步骤   a.创建一个Document实例     Document document = new Document();   b.将Document实例和文件输出流用PdfWriter类绑定在一起     PdfWriter.getInstance(document,new FileOutputStream("HelloWorld.pdf"));   c.打开文档     document.open();   d.在文档中添加文字     document.add(new Paragraph("Hello World"));   e.关闭文档     document.close();   这样5个步骤,就可以生成一个PDF文档了。   其中关键的是2和4两个步骤,第二步,将一个我们熟知的文件流绑定到了PDF文档中,第4步向文档中添加了一些文字,在这两个步骤中稍作改动,一个Pdf文档就可以做出来了。 2. PDF文档的一些设置   作为一个报表,经常的情况下,需要将报表打印出来,这就涉及到了一个页面的设置问题,作为报表的PDF文件,一定要适合打印机的输出打印。这里,我用了两句语句,将PDF文档设定成A4页面大小:     Rectangle rectPageSize = new Rectangle(PageSize.A4);// 定义A4页面大小     // rectPageSize = rectPageSize.rotate();// 加上这句可以实现A4页面的横置     Document doc = new Document(rectPageSize,50,50,50,50);//其余4个参数,设置了页面的4个边距   查到iText API文档,我们可以看到Rectangle在提供了大小自定义设置的同时,可以传入一个PageSize类的属性,其中提供了几种常用的页面样式,需要的话,可以去iText API文档中查询。 到此,已经可以做出一个符合要求大小的Pdf文档了。 3.中文的输出   可能由于java的历史问题,也可能由于这个开源代码是老外做的,不可避免的,对于中文的输出,我们又是要多做一些东西了。   为了解决中文的输出问题,需要多下载一个名为iTextAsian.jar的JAR包。这个包里面定义了与中文输出相关的一些文件。   为了输出中文,我用了如下的语句:     BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);     Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);     Paragraph par = new Paragraph("世界你好",FontChinese) document.add(par);   第一行,定义了一种中文基础字体,第二行,用这个中文的基础字体实例化了一个字体类,第三行,将字体类用到了一个段落中,第四行,将段落添加到了文档中。   在这几行里,我们经常关心的首先就是第一行的“STSong-Light”,这个定义了使用的中文字体,iTextAsian.jar文件中提供了几个可供使用的字体,都是以properties结尾的文件。   再要注意的就是,第一行的“UniGB-UCS2-H”,定义文字的编码标准和样式GB大家都知道了,H是代表横排字,V代表竖排字,iTextAsian.jar文件中以cmap结尾的几个文件都是关于编码和样式定义的。   这两个地方填写的都是文件不带扩展名的名称,将这两个地方写成你需要的参数,就可以让中文以符合你需要的形势正常的输出了。   这里需要说明的是iText的一个特点,出错的时候,不会有什么提示,只会把出错的部分跳过去,比如在没有用中文字体的情况下输出中文,中文部分的段落会是空白的,再比如:如果一个文档中出现一些错误,PDF文件还是照样输出的,不过整个文档会是空白的。而纠错,现在我还没找到更好的办法,只能一行一行的排查自己的代码。 4.表格的设置   通过上面那些,我已经能够正常地输出中文了,再加上一些合适的表格,就可以很好的输出一个PDF报表了。   先明确一个关系,iText中一个文档(Document),可以有很多个表格(PdfPTable),一个表格可以有很多个单元格(PdfPCell),一个单元格里面可以放很多个段落(Paragraph),一个段落里面可以放一些文字。   这里要注意的就是没有行的概念,一个表格直接里面直接放单元格,如果一个3列的表格中放进6个单元格的话,那么就是两行的表格。   第二个要注意的地方就是,如果一个3列的表格放入5个最基本的没有任何跨列设置的单元格,表格会出错,就像前面说的,表格根本添加不到文档中,而且不会有任何的提示。   下面的代码可以实现一个3行3列的表格:     PdfPTable table = new PdfPTable(3);     for(int i=0;i<9;i ){       PdfPCell cell = new PdfPCell();       cell.addElement(new Paragraph(“aaa”));       table.addCell(cell);     }   对于一个表格,经常要用到的另外一个问题就是跨列,在这里,只要将PdfPCell对象的实例设置跨列的数字就可以了。如下:     cell.setColSpan(3); // 注意,这样这个单元格就相当于3个单元格添加到表格中了   在报表中,有时候会碰到非常大的表格,如果你又希望在浏览第二页时,仍能够看到表头就需要用到表格头的设置了,简单的调用PdfPTable类实例的setHeaderRows()方法就可以设定表格头有几行了。如下:     table.setHeaderRows(2); // 设置了头两行为表格头   这里要注意的就是,如果你设置了一个n行的表格头,但最终结果,表格仅仅n行或者还不够n行的情况下,表格会出错,导致整个表格无法写到文档中。   到这里,运用上面的那些技术,我们已经可以完成一个简单的报表了iText相关的类,相关的方面都比较多。不可能在文章中一一列数,如果需要可以在下面的地址找到iText API文档和教程。    (iText教程)    (iText核心包文件)    (iTextArea 包文件) 下载本文示例代码


我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践我使用iText输出PDF报表的实践
阅读(129) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~