`

使用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文档和教程。

  http://www.lowagie.com/iText/tutorial/index.html (iText教程)
  http://www.lowagie.com/iText/download.html (iText核心包文件)
  http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948 (iTextArea 包文件)
    

分享到:
评论

相关推荐

    使用ITEXT导出PDF、WORD,APACHE POI导出EXCEL报表文件

    NULL 博文链接:https://keep-going.iteye.com/blog/1907664

    iText2.1.7资料大全(制作PDF的java开源框)

    相关教程 iText 简介 iText创建文档简介 iText入门实例 IText使用PDF模板输出报表的实践 我和iText第一次亲密接触 相关JAR iText-2.1.7.jar(核心) iTextAsian.jar(中文支持) iText-rups-2.1.7.jar iText-rtf-...

    iText和支持中文的jar包

    生成PDF报表的Java组件,包含处理中文的问题

    iText使用总结,详解

    itext,是一个开发源代码的项目,你可以使用itext方便的实现pdf的输出,打印报表

    用itextsharp打印pdf示例

    用itextsharp输出PDF文档,支持用XML定义文档,可定义多个数据源,简单的表达式

    pdf类库以及如何生成pdf文件

    pdf报表生成,可以生成各类报表 iText作为一个文本输出的java开源代码,提供了PDF、Html、Rtf等多种文件格式的输出功能。为输出各种文本提供了一个比较好的封装。

    lowagie.rar

    JasperReports内部使用iText来输出pdf文档,maven仓库中又没有这个配置, iText对中文是放在单独的包iTextAsian.jar中,于是需要在工程中加入iTextAsian。这个文件是已经编译好的jar,可以直接放到本地仓库进行使用

    java开发常用jar包

    Apache Commons包中的一个,java.io.*的扩展,输入输出,支持文件上传 commons-fileupload.jar Apache Commons包中的一个,是一个通过Http接收上传的文件并处理结果文件的库 dom4j-1.4.jar 和 jaxen-1.1.1.jar 是一...

    JSP实用技巧集合,jsp编程的一些小技巧总结

    52. 使用iText生成PDF? 53. 制作图片水印? 54. 在页面中屏蔽键盘功能键? 55. 禁止用户复制网页内容? 56. 实现不在地址拦中显示当前URL? 57. 获取用户的真实IP地址? 58. 获取用户浏览器信息? 59. 获取当前绝对...

    jsp编程技巧集锦

    使用iText生成PDF? 53. 制作图片水印? 54. 在页面中屏蔽键盘功能键? 55. 禁止用户复制网页内容? 56. 实现不在地址拦中显示当前URL? 57. 获取用户的真实IP地址? 58. 获取用户浏览器信息?...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包---java 源码 大量 实例

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包2

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包3

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包4

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

Global site tag (gtag.js) - Google Analytics