Java IText实现HTML转换PDF

来源:互联网 发布:杭州行知小学学区房 编辑:程序博客网 时间:2024/05/17 02:13


       1、IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源。

2、Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源。

下面是IText示例

         官网:http://www.itextpdf.com/

         测试案例:TestIText.java

         依赖jar包:iText-2.0.8.jar、iTextAsian.jar(支持中文)

         下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能!

import java.io.FileOutputStream;  import java.io.FileReader;  import java.util.ArrayList;  import com.lowagie.text.Document;  import com.lowagie.text.Element;  import com.lowagie.text.Font;  import com.lowagie.text.PageSize;  import com.lowagie.text.Paragraph;  import com.lowagie.text.html.simpleparser.HTMLWorker;  import com.lowagie.text.html.simpleparser.StyleSheet;  import com.lowagie.text.pdf.BaseFont;  import com.lowagie.text.pdf.PdfWriter;  public class TestIText{      public static void main(String[] args) {          TestIText ih = new TestIText();          ih.htmlCodeComeFromFile("D:\\Test\\iText.html", "D:\\Test\\iText_1.pdf");          ih.htmlCodeComeString("Hello中文", "D:\\Test\\iText_2.pdf");      }            public void htmlCodeComeFromFile(String filePath, String pdfPath) {          Document document = new Document();          try {              StyleSheet st = new StyleSheet();              st.loadTagStyle("body", "leading", "16,0");              PdfWriter.getInstance(document, new FileOutputStream(pdfPath));              document.open();              ArrayList p = HTMLWorker.parseToList(new FileReader(filePath), st);              for(int k = 0; k < p.size(); ++k) {                  document.add((Element)p.get(k));              }              document.close();              System.out.println("文档创建成功");          }catch(Exception e) {              e.printStackTrace();          }      }        public void htmlCodeComeString(String htmlCode, String pdfPath) {          Document doc = new Document(PageSize.A4);          try {              PdfWriter.getInstance(doc, new FileOutputStream(pdfPath));              doc.open();              // 解决中文问题              BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);              Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);              Paragraph t = new Paragraph(htmlCode, FontChinese);              doc.add(t);              doc.close();              System.out.println("文档创建成功");          }catch(Exception e) {              e.printStackTrace();          }      }  }  


详细实现直接粘代码留作参考

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();      }   }}







0 0
原创粉丝点击