`
7tianle
  • 浏览: 95734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我使用iText输出PDF报表的实践

阅读更多
我使用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从数据库导出大量数据

    通过实践和调试,你可以掌握利用iText从数据库导出大量数据到PDF文档的技能,这在报表生成、数据导出等方面非常实用。 总之,iText是一个强大且灵活的工具,它使得在Java应用中处理PDF文档变得简单。结合数据库技术...

    利用itext操作pdf从数据库导出大量数据--汇总(一)

    这篇博客"利用iText操作PDF从数据库导出大量数据--汇总(一)"显然讨论了如何利用iText将数据库中的数据高效地导出到PDF文件中,这对于报告生成、数据分析或者报表制作等场景非常有用。 首先,我们需要了解iText的...

    freemarker+itext生成PDF

    这篇博客 "freemarker+itext生成PDF" 可能详细介绍了如何结合这两者来生成PDF文件,这在报表生成、发票打印或任何需要静态化输出的场景中非常有用。 首先,让我们了解FreeMarker。FreeMarker是一个基于模板的语言,...

    c# winform Itext 实现PDF导出简单demo

    在这个例子中,`content`参数是你要导出的文本,`path`参数是输出PDF的路径。我们首先创建一个`Document`对象,然后通过`PdfWriter.GetInstance`写入到指定的文件流中。接着打开文档,设置字体,并将内容添加到文档...

    iText(PDF格式打印)学习整理

    iText是一款强大的PDF库,主要...总结,iText是JAVA开发中不可或缺的PDF处理工具,其强大功能和易用性使其成为报表打印和文档生成的理想选择。通过不断学习和实践,你将能够熟练运用iText解决实际问题,提高项目效率。

    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 导出pdf 例子

    在Java开发中,使用iText库可以方便地实现PDF的生成、修改和格式化。本示例将深入讲解如何利用iText库来导出PDF文件,以满足特定的需求。 首先,确保已将iText库添加到项目依赖中。通常,可以通过Maven或Gradle来...

    itext报表生成工具

    2. **添加页面**:PDF文档由多个页面组成,你可以通过`PdfWriter.getInstance()`创建一个`PdfWriter`对象,然后使用`PdfWriter.getInstance(document, new FileOutputStream(filename))`将`Document`对象与输出流...

    itext5.5.10生成PDF

    总的来说,iText 5.5.10是一个功能强大的PDF处理库,适用于各种场景,从简单的文本输出到复杂的报表生成。通过熟练掌握其API和用法,开发者能够高效地生成符合需求的PDF文档。在实际项目中,结合压缩包中的示例代码`...

    iText可以制作PDF文件的JAVA源程序

    在JSP(JavaServer Pages)开发中,iText可以结合使用,将动态生成的内容输出为PDF。例如,一个电子商务网站可能会使用iText创建带有订单详情的PDF发票,然后发送给客户。 标签中的"jsp"和"pdf"暗示了这个项目可能...

    itext根据坐标在指定位置添加内容.zip

    本篇将围绕"itext根据坐标在指定位置添加内容"这一主题展开,详细阐述如何使用iText库在PDF文档的特定坐标上插入文本、图像等元素。 首先,`PDFDocHelper2.java`、`PdfItextModel.java`和`pdfTest2.java`这3个源...

    iText 使用

    `alzhang2.pdf` 和 `alzhang1.pdf` 文件可能是使用 iText 创建的示例PDF文档,它们展示了实际应用中iText生成的输出效果。这些文件可以用于比较不同配置和方法下的PDF生成结果,或者作为调试和学习的参考。 总的来...

    itext java 导出pdf工具

    实际使用中,你还需要根据具体需求进行深入学习和实践,以充分利用iText的功能。压缩包中的Readme-说明.htm文件可能包含了更详细的使用指南和示例代码,建议仔细阅读。同时,iText的官方文档和社区资源也是学习的好...

    itext导出pdf

    在标题中提到的"itext插件导出pdf文档"实际上是指使用IText库来编写程序,将数据或者内容输出为PDF格式的文件。 **IText的使用场景** 1. **报告生成**:IText非常适合用来生成动态报告,例如业务分析报告、财务...

    java利用iText生成PDF教程.doc

    作为SourceForge上的开源项目,iText提供了一个简单易用的API,使得开发者能够在服务器端,如通过JSP或JavaBean,轻松生成PDF报表。客户端可以通过超链接直接查看或下载生成的报表,这在B/S架构的系统中尤为实用。 ...

    itext5 jar 包

    3. 打开PDF写入流:使用`PdfWriter`类创建一个指向输出流(如文件)的PDF写入实例。 4. 添加内容:通过`Paragraph`、`Table`、`Image`等对象添加文本、表格和图像到文档。使用`Font`类可以定制文本样式。 5. 关闭...

    基于SpringBoot实现的生成工资条源代码,使用FreeMarker模板引擎, iTextPdf生成工资条PDF

    在这个项目中,我们看到标题和描述提到了使用SpringBoot来实现工资条的生成,这涉及到两个关键的技术:FreeMarker模板引擎和iTextPdf库。 首先,FreeMarker是一个强大的模板引擎,常用于动态生成HTML或其他类型的...

    Jsp轻松实现PDF格式报表

    为了解决这一问题,本文将介绍如何使用iText类库在JSP环境中生成具有固定格式的PDF报表。 #### 二、iText概述 iText是一个强大的开源Java类库,它可以轻松地帮助开发者生成PDF文档。对于那些希望在Web应用中集成...

    IText生成PDF

    生成PDF报表的基本步骤如下: 1. 创建一个`com.lowagie.text.Document`对象,这是PDF文档的基础。你可以选择设定文档的尺寸,例如全尺寸的A4页面。 ```java Document document = new Document(); // 或设定边距 //...

Global site tag (gtag.js) - Google Analytics