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. matlab color_rain colorbar

    来自http://www.aos.wisc.edu/~dvimont/matlab/Graphics_Tools/color_rain.html Listing of script color_rai ...

  2. iOS新特性引导页

    有一个注意点: 获取版本号 个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中target,点击"Summary"后看到. Version在plist文件 ...

  3. SQL Server笔记

    SQL Server所能读取的最小单位是页,每个页8KB,8个物理上连续的页就是一个区,这样数据库中每MB就包含有16个区 堆是没有聚集索引的表.如果表格上没有聚集索引,数据行将不按任何特殊顺序存储, ...

  4. iOS开发笔记系列-基础3(多态、动态类型和动态绑定)

    多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...

  5. Effective C++ 条款45

    本节条款的题目是运用成员模板接受全部兼容类型 作者阐述自己的观点是通过智能指针的样例. 在学习本节条款之前我们要先明确关于隐式转化的问题 例如以下代码: #include<iostream> ...

  6. Android背景渐变色效果

    Android设置背景色可以通过在res/drawable里定义一个xml,如下: [代码]xml代码: 1 <?xml version="1.0" encoding=&qu ...

  7. [置顶] 博客已迁移至ryantang.me

    大家好,感谢大家一直以来的支持,本博客内容已停止更新,新内容将发布到我的新博客,地址是:ryantang.me,欢迎大家继续支持,我会在ryantang.me上发布内容更丰富的文章内容,谢谢! Rya ...

  8. 聊一聊ES5数组(Array)新增的那些方法

    一.前言 ES5中新增的一些处理数组(Array)的方法, 对于用JavaScript处理数据非常有用.我总结了一下,给这些方法分了类,大体如下: 2个索引方法:indexOf() 和 lastInd ...

  9. Java设计模式07:常用设计模式之装饰器模式(结构型模式)

    1. Java之装饰器模式(Decorator Pattern) (1)概述:     装饰模式在Java种使用也很广泛,比如我们在重新定义按钮.对话框等时候,实际上已经在使用装饰模式了.在不必改变原 ...

  10. check_area

    CCTouch* pTouch = ...; CCSprite* pSprite = ...; CCRect rect = pSprite ->boundingBox(); if ((& ...