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. Web 应用的安全性

    Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户授权 ...

  2. java常用string inputStream转换

    1.String –> InputStream InputStrem is = new ByteArrayInputStream(str.getBytes()); 或者 ByteArrayInp ...

  3. OpenCV 显示Mat矩阵异常 显示“程序停止工作” 解决办法

    笔者调试OpenCV 程序时,在使用标准输出显示Mat矩阵时,编译没有错误,但每次运行都弹出程序停止工作的对话框.google之,得到解决方案. 程序如下: #include <iostream ...

  4. maven 把spring项目打包成可执行的文件

    转载自http://www.mamicod.e.com/info-detail-635726.html 最近需要解决Maven项目导入可执行的jar包的问题,如果项目不包含Spring,那么使用mvn ...

  5. uboot中gd的定义和使用

    近期在做uboot中nand启动相关的工作,遇到一个问题一直纠结着.如今最终明确了这个问题,想想还有好多兄弟在某个黑暗的角落里或者某台电脑前纠结着呢,所以赶紧写下来以供查阅. uboot versio ...

  6. 使用VisualSVN Server搭建SVN服务器

    工具: TortoiseSVN-1.8.4.24972-x64-svn-1.8.5(客户端) LanguagePack_1.8.4.24972-x64-zh_CN.msi Setup-Subversi ...

  7. Android打地鼠游戏源码带道具购买的Android游戏开发

    这是一款基于安卓的打地鼠游戏,界面简洁,有level模式打地鼠和无尽模式打地鼠两种游戏模式,并可以通过商店使用金币进行道具的购买,道具可以让你更容易通关:同时金币可以在游戏通关的时候获取.工程中有较为 ...

  8. Android_listView_Listener

    layout.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...

  9. MySql安装步骤详解,MySql的root密码设置,启动MySql服务。

    1.下载mysql安装包,并解压,双击mysql-5.6.24-winx64.msi 2.点击下一步 3.选择custom 4.选择安装内容和位置,5个安装内容要选择will be installed ...

  10. 项目移植过程中报:“Project facet Java version 1.7 is not supported.” 错误

    转载: http://my.oschina.net/nly/blog/349081 在移植eclipse项目时,如果遇到 报:“Project facet Java version 1.7 is no ...