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
- Java IText实现HTML转换PDF
- iText 实现 html 转换 pdf
- itext实现HTML转换为PDF
- Itext 实现 html转换成pdf
- iText – 使用Java将HTML转换为PDF
- iText实现html转pdf
- 利用Flying Saucer 和 iText 实现HTMl转PDF(java)
- 利用Flying Saucer 和 java iText 实现HTMl转PDF
- 【JAVA】使用 iText XMLWorker实现HTML转PDF
- java使用itext实现html代码转pdf
- java itext html转pdf[续篇]
- java - 使用itext把txt转换pdf
- itext html to pdf
- itext html 生成pdf
- iText html转pdf
- 用Java的iText实现PDF报表
- 通过iText将html转换成pdf中文乱码问题
- itext转换html成pdf,支持中文,并且中文换行
- Entity Framework 6 Code First 多个Dbcontext的迁移方法
- libcurl在vs2013下C++项目中的编译连接
- android root权限破解分析
- 移动开发中如何整合HTML 5和原生代码
- 在ASP.NET MVC5中建置以角色為基礎的授權機制
- Java IText实现HTML转换PDF
- CI框架 不能使用Frameset或Iframe 解决方法 (再创灵活应用新方法)
- Webkit for Android分析
- Python中字符串与列表转换及字符串打散组合
- 大学总结
- 字节 字符 在应用中的关系
- 什么是FC WWN
- Java&&String,StringBuffer与StringBuilder的区别??
- Android Copy and Paste 复制粘贴