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

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

3、PD4ML实现html2pdf,速度快,纠错能力强,支持多种中文字体,商业。

(一)IText

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

测试案例:TestIText.Java

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

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

  1. import java.io.FileOutputStream;
  2. import java.io.FileReader;
  3. import java.util.ArrayList;
  4. import com.lowagie.text.Document;
  5. import com.lowagie.text.Element;
  6. import com.lowagie.text.Font;
  7. import com.lowagie.text.PageSize;
  8. import com.lowagie.text.Paragraph;
  9. import com.lowagie.text.html.simpleparser.HTMLWorker;
  10. import com.lowagie.text.html.simpleparser.StyleSheet;
  11. import com.lowagie.text.pdf.BaseFont;
  12. import com.lowagie.text.pdf.PdfWriter;
  13. public class TestIText{
  14. public static void main(String[] args) {
  15. TestIText ih = new TestIText();
  16. ih.htmlCodeComeFromFile("D://Test//iText.html", "D://Test//iText_1.pdf");
  17. ih.htmlCodeComeString("Hello中文", "D://Test//iText_2.pdf");
  18. }
  19. public void htmlCodeComeFromFile(String filePath, String pdfPath) {
  20. Document document = new Document();
  21. try {
  22. StyleSheet st = new StyleSheet();
  23. st.loadTagStyle("body", "leading", "16,0");
  24. PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
  25. document.open();
  26. ArrayList p = HTMLWorker.parseToList(new FileReader(filePath), st);
  27. for(int k = 0; k < p.size(); ++k) {
  28. document.add((Element)p.get(k));
  29. }
  30. document.close();
  31. System.out.println("文档创建成功");
  32. }catch(Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. public void htmlCodeComeString(String htmlCode, String pdfPath) {
  37. Document doc = new Document(PageSize.A4);
  38. try {
  39. PdfWriter.getInstance(doc, new FileOutputStream(pdfPath));
  40. doc.open();
  41. // 解决中文问题
  42. BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  43. Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
  44. Paragraph t = new Paragraph(htmlCode, FontChinese);
  45. doc.add(t);
  46. doc.close();
  47. System.out.println("文档创建成功");
  48. }catch(Exception e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }

(二)Flying Sauser

项目主页:https://xhtmlrenderer.dev.java.net/

依赖jar包:iText-2.0.8.jar、iTextAsian.jar、core-renderer.jar

默认情况下,core-renderer.jar对中文是不能进行换行的,如果想解决换行问题可以去http://bettereveryday.javaeye.com/blog/611561下载一个jar包,该包对源代码做了稍加修改.

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

  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.OutputStream;
  4. import org.xhtmlrenderer.pdf.ITextFontResolver;
  5. import org.xhtmlrenderer.pdf.ITextRenderer;
  6. import com.lowagie.text.pdf.BaseFont;
  7. public class TestFlyingSauser {
  8. public static void main(String[] args) throws Exception {
  9. demo_1();
  10. demo_2();
  11. }
  12. // 不支持中文
  13. public static void demo_1() throws Exception {
  14. String inputFile = "D:/Test/flying.html";
  15. String url = new File(inputFile).toURI().toURL().toString();
  16. String outputFile = "D:/Test/flying.pdf";
  17. OutputStream os = new FileOutputStream(outputFile);
  18. ITextRenderer renderer = new ITextRenderer();
  19. renderer.setDocument(url);
  20. renderer.layout();
  21. renderer.createPDF(os);
  22. os.close();
  23. }
  24. // 支持中文
  25. public static void demo_2() throws Exception {
  26. String outputFile = "D:/Test/demo_3.pdf";
  27. OutputStream os = new FileOutputStream(outputFile);
  28. ITextRenderer renderer = new ITextRenderer();
  29. ITextFontResolver fontResolver = renderer.getFontResolver();
  30. fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  31. StringBuffer html = new StringBuffer();
  32. // DOCTYPE 必需写否则类似于 这样的字符解析会出现错误
  33. html.append("<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");
  34. html.append("<html xmlns=/"http://www.w3.org/1999/xhtml/">").append("<head>")
  35. .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/" />")
  36. .append("<mce:style type=/"text/css/"><!--
  37. body {font-family: SimSun;}
  38. --></mce:style><style type=/"text/css/" mce_bogus="1">body {font-family: SimSun;}</style>")
  39. .append("</head>")
  40. .append("<body>");
  41. html.append("<div>支持中文!</div>");
  42. html.append("</body></html>");
  43. renderer.setDocumentFromString(html.toString());
  44. // 解决图片的相对路径问题
  45. // renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
  46. renderer.layout();
  47. renderer.createPDF(os);
  48. os.close();
  49. }
  50. }

http://bettereveryday.javaeye.com/blog/611561

参考资料:http://yongboy.javaeye.com/blog/510976

http://www.51itsns.com/sns/space.php?uid=4&do=blog&id=582

关于Flying Sauser的一篇非常不错的文章:http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html

(三)PD4ML

官网下载:http://pd4ml.com/downloads.htm

依赖jar包:pd4ml_demo.jar、pd4ml__css2.jar、fonts.jar

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

  1. import java.awt.Insets;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.StringReader;
  5. import org.zefer.pd4ml.PD4Constants;
  6. import org.zefer.pd4ml.PD4ML;
  7. public class Converter {
  8. public static void main(String[] args) throws Exception {
  9. Converter converter = new Converter();
  10. converter.generatePDF_2(new File("D:/Test/demo_ch_pd4ml_a.pdf"), "D:/Test/a.htm");
  11. File pdfFile = new File("D:/Test/demo_ch_pd4ml.pdf");
  12. StringBuffer html = new StringBuffer();
  13. html.append("<html>")
  14. .append("<head>")
  15. .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/" />")
  16. .append("</head>")
  17. .append("<body>")
  18. .append("<font face=/"KaiTi_GB2312/">")
  19. .append("<font color='red' size=22>显示中文</font>")
  20. .append("</font>")
  21. .append("</body></html>");
  22. StringReader strReader = new StringReader(html.toString());
  23. converter.generatePDF_1(pdfFile, strReader);
  24. }
  25. // 手动构造HTML代码
  26. public void generatePDF_1(File outputPDFFile, StringReader strReader) throws Exception {
  27. FileOutputStream fos = new FileOutputStream(outputPDFFile);
  28. PD4ML pd4ml = new PD4ML();
  29. pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
  30. pd4ml.setHtmlWidth(950);
  31. pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
  32. pd4ml.useTTF("java:fonts", true);
  33. pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312");
  34. pd4ml.enableDebugInfo();
  35. pd4ml.render(strReader, fos);
  36. }
  37. // HTML代码来自于HTML文件
  38. public void generatePDF_2(File outputPDFFile, String inputHTMLFileName) throws Exception {
  39. FileOutputStream fos = new FileOutputStream(outputPDFFile);
  40. PD4ML pd4ml = new PD4ML();
  41. pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
  42. pd4ml.setHtmlWidth(950);
  43. pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
  44. pd4ml.useTTF("java:fonts", true);
  45. pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312");
  46. pd4ml.enableDebugInfo();
  47. pd4ml.render("file:" + inputHTMLFileName, fos);
  48. }
  49. }

参考资料:

http://www.pd4ml.com/examples.htm

http://www.pd4ml.com/api/index.html

http://pd4ml.com/reference.htm#7.1

http://pd4ml.com/support/html-pdf-faq-f1/double-byte-support-t195.html

http://pd4ml.com/support/pd4ml-html-css-pdf-tips-tricks-f7/ttf-embedding-t42.html

生成PDF文档的方案大致就这些了,希望能够给大家带来帮助!如果上面的三种方案都还不能满足项目组的需求哪就只有去买商业软件了。

转载自--http://blog.csdn.net/zdtwyjp/article/details/5769353#

Java实现HTML代码生成PDF文档的更多相关文章

  1. Java 加密、解密PDF文档

    本篇文章将介绍通过Java编程来设置PDF文档保护的方法.我们可以设置仅用于查阅文档的密码,即该通过该密码打开文档仅用于文档阅读,无法编辑:也可以设置文档编辑权限的密码,即通过该密码打开文档时,文档为 ...

  2. Java 合并、拆分PDF文档

    处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...

  3. Java使用wkhtmltox实现HTML代码生成PDF文档或者图片

    由于项目需要,把HTML代码转为PDF或者图片进行保存.最开始使用Flying Saucer来把HTML代码生成为PDF文档,功能已经开发出来了,也能够完成转换功能,期间也遇到了中文支持以及图片路径的 ...

  4. Java使用Flying Saucer实现HTML代码生成PDF文档

    1.需要的jar包:org.xhtmlrenderer.flying-saucer-pdf-itext5,Maven依赖如下: <dependency> <groupId>or ...

  5. 【PDF】java使用Itext生成pdf文档--详解

    [API接口]  一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...

  6. Java 插入附件到PDF文档

    在文档中插入附件,可以起到与源文档配套使用的目的,以一种更简便的方式对文档起到补充说明的作用.下面将介绍通过Java编程插入附件到PDF文档中的方法.这里插入的文档可以是常见的文档类型,如Word.E ...

  7. java实现在线浏览PDF文档功能

    实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...

  8. 将积累多年的java学习资料,pdf文档给大家分享一下,比如《大话设计模式》《算法》《Linux私房菜》等等

    话不多说,资料目录如下,需要的拿走,下载的同时别忘了点下推荐. 需要的点下面链接,到小编网盘进行下载: 2-大话设计模式.pdf 链接:https://pan.baidu.com/s/1b05puNO ...

  9. Apache PDFbox开发指南之PDF文档读取

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51542309 相关文章: <Apache PDFbox开发指南之PDF文本内容 ...

随机推荐

  1. linux netlink套接字学习资料

    理论: http://blog.csdn.net/unbutun/article/details/3394061 进一步深入: http://edsionte.com/techblog/archive ...

  2. CSDN上下载的一些关于Android程序调用Webservice执行不成功的问题

    今天从书上和CSDN上找了几个关于android调用webservice的样例,这些样例从代码来看.没不论什么错误,可是就是执行不成功.分析了android调用web接口的写法,发现这些样例在调用的时 ...

  3. Windows二进制文件的Python扩展包

    http://www.lfd.uci.edu/~gohlke/pythonlibs/ https://pypi.python.org/simple/

  4. JQuery实现页面Loading效果

    第一步:添加遮罩层和LOADING层 <div class="overlay"></div><div id="AjaxLoading&quo ...

  5. Socket异步通信学习三

    接下来是客户端部分,采用同步接收模式,在SocketClient项目中新建了一个SynServer类,用于存放socket服务器代码,和AsynServer类似,主要有4个方法: 有一个全局socke ...

  6. Java基础知识强化之IO流笔记71:NIO之 NIO的(New IO流)介绍

    1. I/O 简介 I/O ( 输入/输出  ):指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的. ...

  7. XMl解析之Pull解析

    HttpUtils: package cn.qf.parser; import java.io.BufferedOutputStream; import java.io.FileOutputStrea ...

  8. 我的开发框架(WinForm)2

    上篇文章简单的介绍了一下,我的一个开发框架.看的人还不少,多谢大家的关注,我继续介绍一下,模块和模块之间是怎么组织起来的. Data模块: 该模块主要完成对数据的操作,采用仓储模式实现,在核心模块(C ...

  9. PHP在ubuntu中编译安装

    关于怎么获取php源码和解压就不再说了. 编译的参数为: ./configure --prefix=/opt/php --with-bz2 --with-mcrypt --with-mhash --w ...

  10. IE兼容低版本

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><m ...