`
y8820960
  • 浏览: 115873 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

iText导出PDF经典实现

    博客分类:
  • j2ee
阅读更多
转自:http://blog.csdn.net/lenotang/article/details/2823408
首先我们来了解下iText: 简单地说,iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。恩?怎么像教科书啊?呵呵,这就是官网的介绍了。那么,唐伯虎点蚊香的武状元出场了,请问,到哪里可以下载得到呢?下面是该项目主页:http://www.lowagie.com/iText/ 我这里使用的是2.0.7版本。



我们已经接触过一个第三方开源组件POI,那么应该积累了一点使用经验了。我们还是利用上篇文章http://blog.csdn.net/lenotang/archive/2008/08/24/2823230.aspx 上的两个业务类:Student.java 和Book.java,有心理准备了吗?呵呵,出代码:
package org.leno.export.util;

 

import java.io.UnsupportedEncodingException;

 

public class StrHelp {

 

   public static String getChinese(String s) {

      try {

         return new String(s.getBytes("gb2312"), "iso-8859-1");

      } catch (UnsupportedEncodingException e) {

         return s;

      }

   }

}

package org.leno.export.util;

 

import java.io.IOException;

 

import com.lowagie.text.*;

import com.lowagie.text.pdf.BaseFont;

 

public class PdfParagraph extends Paragraph {

 

   private static final long serialVersionUID = -244970043180837974L;

 

   public PdfParagraph(String content) {

      super(content, getChineseFont(12, false));

   }

 

   public PdfParagraph(String content, int fontSize, boolean isBold) {

      super(content, getChineseFont(fontSize, isBold));

   }

 

   // 设置字体-返回中文字体

   protected static Font getChineseFont(int nfontsize, boolean isBold) {

      BaseFont bfChinese;

      Font fontChinese = null;

      try {

         bfChinese = BaseFont.createFont("c://windows//fonts//simsun.ttc,1",

                BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

         if (isBold) {

            fontChinese = new Font(bfChinese, nfontsize, Font.BOLD);

         } else {

            fontChinese = new Font(bfChinese, nfontsize, Font.NORMAL);

         }

      } catch (DocumentException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      } catch (IOException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }

      return fontChinese;

   }

 

   // 转化中文

   protected Cell ChangeCell(String str, int nfontsize, boolean isBold)

         throws IOException, BadElementException, DocumentException {

      Phrase ph = ChangeChinese(str, nfontsize, isBold);

      Cell cell = new Cell(ph);

      // cell.setBorderWidth(3);

 

      return cell;

   }

 

   // 转化中文

   protected Chunk ChangeChunk(String str, int nfontsize, boolean isBold)

         throws IOException, BadElementException, DocumentException {

      Font FontChinese = getChineseFont(nfontsize, isBold);

      Chunk chunk = new Chunk(str, FontChinese);

      return chunk;

   }

 

   // 转化中文

   protected Phrase ChangeChinese(String str, int nfontsize, boolean isBold)

         throws IOException, BadElementException, DocumentException {

      Font FontChinese = getChineseFont(nfontsize, isBold);

      Phrase ph = new Phrase(str, FontChinese);

      return ph;

   } 

}

以上是两个帮助封装类,都是为了对付iText的中文问题的。下面就是主角出场:
package org.leno.export.util;

 

import java.io.*;

import java.lang.reflect.*;

import java.util.*;

import com.lowagie.text.*;

import com.lowagie.text.pdf.*;

import java.awt.Color;

import javax.swing.JOptionPane;

import java.net.MalformedURLException;

import java.text.SimpleDateFormat;

 

/**

 * 利用开源组件IText2.0.7动态导出PDF文档 转载时请保留以下信息,注明出处!

 *

 * @author leno

 * @version v1.0

 * @param <T>

 *            应用泛型,代表任意一个符合javabean风格的类

 *            注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()

 *            byte[]表图片数据,注意合适的大小

 */

public class ExportPdf<T> {

   public void exportPdf(Collection<T> dataset, OutputStream out) {

      exportPdf("测试iText导出PDF文档", null, dataset, out, "yyyy-MM-dd");

   }

 

   public void exportPdf(String[] headers, Collection<T> dataset,

         OutputStream out) {

      exportPdf("测试iText导出PDF文档", headers, dataset, out, "yyyy-MM-dd");

   }

 

   public void exportPdf(String[] headers, Collection<T> dataset,

         OutputStream out, String pattern) {

      exportPdf("测试iText导出PDF文档", headers, dataset, out, pattern);

   }

 

   /**

    * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以PDF 的形式输出到指定IO设备上

    *

    * @param title

    *            表格标题名

    * @param headers

    *            表格属性列名数组

    * @param dataset

    *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的

    *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

    * @param out

    *            与输出设备关联的流对象,可以将PDF文档导出到本地文件或者网络中

    * @param pattern

    *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"

    */

   @SuppressWarnings("unchecked")

   public void exportPdf(String title, String[] headers,

         Collection<T> dataset, OutputStream out, String pattern) {

      // 作为报表的PDF文件,一定要适合打印机的输出打印

      Rectangle rectPageSize = new Rectangle(PageSize.A4);// 定义A4页面大小

      // rectPageSize = rectPageSize.rotate();// 加上这句可以实现A4页面的横置

      Document document = new Document(rectPageSize, 50, 50, 50, 50);// 其余4个参数,设置了页面的4个边距

      try {

         // 将PDF文档写出到out所关联IO设备上的书写对象

         PdfWriter.getInstance(document, out);

         // 添加文档元数据信息

         document.addTitle(StrHelp.getChinese(title));

         document.addSubject("export information");

         document.addAuthor("leno");

         document.addCreator("leno");

         document.addKeywords("pdf itext");

         // 定义页头和页尾

         HeaderFooter header = new HeaderFooter(new PdfParagraph(title, 20,

                true), false);

         header.setAlignment(Element.ALIGN_CENTER);

         HeaderFooter footer = new HeaderFooter(new Phrase(

                "This   is   page   "), new Phrase("."));

         footer.setAlignment(Element.ALIGN_CENTER);

         document.setHeader(header);

         document.setFooter(footer);

         // 打开PDF文档

         document.open();

         // 添加一张表格,使用Table或者PdfPTable

         // Table table = new Table(headers.length);

         // table.setWidth(16*headers.length);

         // //table.setWidths(new float[]{20,20,20,30});

         // table.setCellsFitPage(true);

         // table.setAutoFillEmptyCells(true);

         // table.setAlignment(Table.ALIGN_CENTER);

         // table.setBackgroundColor(Color.yellow);

         // table.setBorderColor(Color.green);

         PdfPTable table = new PdfPTable(headers.length);

         // table.setHorizontalAlignment(Element.ALIGN_CENTER);

         table.setWidthPercentage(16 * headers.length);

         // 产生表格标题行

         for (int i = 0; i < headers.length; i++) {

            PdfPCell cell = new PdfPCell(new PdfParagraph(headers[i], 14,

                   true));

            cell.setHorizontalAlignment(Cell.ALIGN_CENTER);

            cell.setVerticalAlignment(Cell.ALIGN_MIDDLE);

            cell.setBackgroundColor(Color.cyan);

            cell.setBorderColor(Color.green);

            table.addCell(cell);

         }

         // 遍历集合数据,产生数据行

         Iterator<T> it = dataset.iterator();

         int index = 0;

         while (it.hasNext()) {

            index++;

            T t = (T) it.next();

            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值

            Field[] fields = t.getClass().getDeclaredFields();

            for (short i = 0; i < fields.length; i++) {

                PdfPCell cell = null;

                Field field = fields[i];

                String fieldName = field.getName();

                String getMethodName = "get"

                      + fieldName.substring(0, 1).toUpperCase()

                      + fieldName.substring(1);

                try {

                   Class tCls = t.getClass();

                   Method getMethod = tCls.getMethod(getMethodName,

                         new Class[] {});

                   Object value = getMethod.invoke(t, new Object[] {});

                   // 判断值的类型后进行强制类型转换

                   String textValue = null;

                   if (value instanceof Boolean) {

                      boolean bValue = (Boolean) value;

                      textValue = "男";

                      if (!bValue) {

                         textValue = "女";

                      }

                   } else if (value instanceof Date) {

                      Date date = (Date) value;

                      SimpleDateFormat sdf = new SimpleDateFormat(pattern);

                      textValue = sdf.format(date);

                   } else if (value instanceof byte[]) {

                      byte[] bsValue = (byte[]) value;

                      Image img = Image.getInstance(bsValue);

                      cell = new PdfPCell(img);

                   } else {

                      textValue = value.toString();

                   }

                   // 如果不是图片数据,就当做文本处理

                   if (textValue != null) {

                      cell = new PdfPCell(new PdfParagraph(textValue));

                   }

                   cell.setHorizontalAlignment(Cell.ALIGN_CENTER);

                   cell.setVerticalAlignment(Cell.ALIGN_MIDDLE);

                   cell.setBorderColor(Color.green);

                   table.addCell(cell);

                } catch (SecurityException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

                } catch (NoSuchMethodException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

                } catch (IllegalArgumentException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

                } catch (IllegalAccessException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

                } catch (InvocationTargetException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

                } catch (MalformedURLException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

                } catch (IOException e) {

                   // TODO Auto-generated catch block

                   e.printStackTrace();

                } finally {

                   // 清理资源

                }

            }

 

         }

         document.add(table);

         document.close();

 

      } catch (DocumentException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }

   }

 

   public static void main(String[] args) {

      // 测试学生

      ExportPdf<Student> ex = new ExportPdf<Student>();

      String[] headers = { "学号", "姓名", "年龄", "性别", "出生日期" };

      java.util.List<Student> dataset = new ArrayList<Student>();

      dataset.add(new Student(10000001, "张三", 20, true, new Date()));

      dataset.add(new Student(20000002, "李四", 24, false, new Date()));

      dataset.add(new Student(30000003, "王五", 22, true, new Date()));

      // 测试图书

      ExportPdf<Book> ex2 = new ExportPdf<Book>();

      String[] headers2 = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN",

            "图书出版社", "封面图片" };

      java.util.List<Book> dataset2 = new ArrayList<Book>();

      try {

         BufferedInputStream bis = new BufferedInputStream(

                new FileInputStream("book.jpg"));

         byte[] buf = new byte[bis.available()];

         while ((bis.read(buf)) != -1) {

            //

         }

         dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567",

                "清华出版社", buf));

         dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567",

                "阳光出版社", buf));

         dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567",

                "清华出版社", buf));

         dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567",

                "清华出版社", buf));

         dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567",

                "汤春秀出版社", buf));

 

         OutputStream out = new FileOutputStream("E://a.pdf");

         OutputStream out2 = new FileOutputStream("E://b.pdf");

         ex.exportPdf(headers, dataset, out);

         ex2.exportPdf(headers2, dataset2, out2);

         out.close();

         out2.close();

         JOptionPane.showMessageDialog(null, "pdf导出成功!");

         System.out.println("pdf导出成功!");

      } catch (FileNotFoundException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      } catch (IOException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }

   }

}
分享到:
评论

相关推荐

    java使用itext导出PDF文本绝对定位(实现方法)

    java使用iText导出PDF文本绝对定位(实现方法) iText是一个流行的Java类库,用于生成PDF文档。下面我们将探讨如何使用iText在Java中导出PDF文本,并实现绝对定位。 iText简介 iText是一个开源的Java类库,用于...

    velocity+itext导出pdf

    总结起来,"Velocity+Itext导出PDF"是一种高效且灵活的方式,可以将动态数据和预定义的模板结合,生成高质量的PDF文档。通过熟练掌握这两个工具的使用,开发者可以创建出满足各种需求的PDF文档生成系统。

    Itext导出PDF,中文不显示字体

    Itext导出PDF,中文不显示字体,在body上设置font-family: "Arial Unicode MS",同时在java中引入fontResolver.addFont("/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 就可以显示中文了

    itextpdf 导出pdf 表格 自动分页中文 目录

    iTextPDF是一个Java库,专门用于创建、编辑和处理PDF文档,而`iText-asian-5.2.0.jar`和`itextpdf-5.5.5.jar`是iText库的不同版本,用于支持中文字符和其他亚洲语言。 1. **iTextPDF**: iTextPDF是iText项目的一...

    java 用iText导出PDF小例子

    本文将介绍一个使用iText库导出PDF的小例子。 首先,介绍iText库的基本知识。iText是一个开源的Java库,允许开发者创建和操纵PDF文档。它包括生成PDF文件、合并或分割现有PDF文件、添加文本或图像等功能。iText广泛...

    itext导出PDF所需jar包

    在标题中提到的"itext导出PDF所需jar包"是指使用iText库来生成PDF文件时所需的Java类库。iText允许开发者通过编程方式生成高质量的PDF文档,包括文本、图像、表格、链接等多种元素,适用于各种业务场景,如报表生成...

    java使用IText导出PDF(包含图片、表格、文字等等Demo和依赖包)

    Java使用IText库导出PDF是一项常见的任务,特别是在需要生成报告、文档或发票等静态内容时。IText是一个强大的PDF库,它允许开发者在Java环境中创建、修改和处理PDF文档。下面将详细介绍如何使用IText库来实现这个...

    利用itext操作pdf从数据库导出大量数据

    本篇文章将详细介绍如何利用iText库操作PDF,从数据库中导出大量数据。 首先,我们需要理解iText的基本概念和功能。iText提供了丰富的API,可以用于创建新的PDF文档、添加文本、图像、表格、链接等元素,以及对已有...

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

    这个简单的demo展示了如何利用Itext库将数据导出为PDF格式,非常适合初学者理解和实践。下面,我们将深入探讨这个知识点,以及如何一步步实现这个功能。 首先,你需要在你的项目中引入ItextSharp库。ItextSharp是...

    itext 导出pdf 例子

    本示例将深入讲解如何利用iText库来导出PDF文件,以满足特定的需求。 首先,确保已将iText库添加到项目依赖中。通常,可以通过Maven或Gradle来引入。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml ...

    itextpdf按模版导出PDF(表单,表格,条码,二维码)

    **ITextPDF库在Java中的应用:创建模板化的PDF文档** `iTextPDF`是一个流行的开源Java库,用于创建、编辑和操作PDF文档。在这个场景中,我们将探讨如何使用iTextPDF来根据模板生成包含表单、表格、条形码和二维码的...

    itext导出pdf不显示中文 ITextRenderer不显示中文

    "iText导出pdf不显示中文 ITextRenderer不显示中文"这个问题,通常是由于字体配置不当或者缺失支持中文的字体资源导致的。下面我们将深入探讨这个问题及其解决方案。 首先,我们需要理解iText的工作原理。iText创建...

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

    本文将深入探讨如何使用ITEXT库导出PDF和Word,以及利用Apache POI库导出Excel报表文件。 首先,让我们来了解ITEXT库。ITEXT是一个开源Java库,专门用于创建和修改PDF文档。使用ITEXT,你可以方便地生成包含文本、...

    JAVA ITEXT 导出试卷

    本项目名为“JAVA ITEXT 导出试卷”,其核心功能是使用Java和iText库来自动化生成PDF格式的试卷。 首先,我们需要了解iText库的基本用法。iText提供了许多API,允许开发者添加文本、图像、表格、链接等元素到PDF文...

    导出PDF (iText实现) PdfDownloadDS

    首先,要使用iText导出PDF,你需要在项目中引入iText的依赖。如果是Maven项目,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;com.itextpdf&lt;/groupId&gt; &lt;artifactId&gt;itextpdf &lt;version&gt;5.5.13 ``` 接下来...

    使用ITEXT导出EXCEL工具类

    总结来说,使用ITEXT导出Excel虽然不是其主要功能,但通过创建模拟Excel结构的PDF文档并转换,可以实现这一目标。不过,这种方式可能不如直接使用Apache POI等专门的Excel处理库那么高效和灵活。在实际开发中,应...

    Struts2+IText动态导出PDF示例源码

    在这个"Struts2+IText动态导出PDF示例源码"项目中,开发者利用这两者结合,实现了在Web应用中动态生成PDF文件的功能。这在报表生成、合同制作、证书打印等场景中非常实用。 首先,Struts2作为控制器层框架,负责...

    java itext导出PDF github

    根据所提供的标题“java itext导出PDF github”以及描述“导出PDF例子,供网友参考”,我们可以推测该文档主要介绍如何利用Java编程语言结合iText库来创建PDF文件。iText是一款非常强大的用于生成和操作PDF文件的开源...

    itext导出HTML到PDF的换行和解决中文包(配套三个)

    要实现这一功能,你需要引入`itextpdf`和`xmlworker`相关的jar包。描述中提到的`itext-2.0.8.jar`就是iText的基本库,而`xmlworker.jar`(虽然这里没有提供,但在实际应用中是必需的)则包含了处理HTML和CSS的组件。...

    java使用itext实现pdf文件下载

    本教程将详细讲解如何使用Itext库实现PDF文件的下载,包括通过系统路径下载和通过浏览器下载两种方式。 首先,我们需要了解Itext的基本用法。Itext提供了一系列的API,可以方便地创建PDF文档的各个元素,如文本、...

Global site tag (gtag.js) - Google Analytics