1IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源
2Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源
3PD4ML实现html2pdf,速度快,纠错能力强,支持多种中文字体,商业
(一)IText
www.itextpdf/
测试案例:TestIText.java
依赖jar包:iText-2.0.8.jariTextAsian.jar(支持中文
下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能
[c-sharp] view plaincopyprint?
1. import java.io.FileOutputStream;
2. import java.io.FileReader;
3. import java.util.ArrayList;
4. import Document;
5. import Element;
6. import Font;
7. import PageSize;
8. import Paragraph;
9. import html.simpleparser.HTMLWorker;
10. import html.simpleparser.StyleSheet;
11. import pdf.BaseFont;
12. import 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.
20. public void htmlCodeComeFromFile(String filePath, String pdfPath) {
21. Document document = new Document();
22. try {
23. StyleSheet st = new StyleSheet();
24. st.loadTagStyle("body", "leading", "16,0");
25. Instance(document, new FileOutputStream(pdfPath));
26. document.open();
27. ArrayList p = HTMLWorker.parseToList(new FileReader(filePath), st);
28. for(int k = 0; k < p.size(); ++k) {
29. document.add(((k));
30. }
31. document.close();
32. System.out.println("文档创建成功");
33. }catch(Exception e) {
34. e.printStackTrace();
35. }
36. }
37.
38. public void htmlCodeComeString(String htmlCode, String pdfPath) {
39. Document doc = new Document(PageSize.A4);
40. try {
41. Instance(doc, new FileOutputStream(pdfPath));
42. doc.open();
43. // 解决中文问题
44. BaseFont bfChinese = ateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
45. Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
46. Paragraph t = new Paragraph(htmlCode, FontChinese);
47. doc.add(t);
48. doc.close();
49. System.out.println("文档创建成功");
50. }catch(Exception e) {
51. e.printStackTrace();
52. }
53. }
54. }
(二)Flying Sauser
项目主页:xhtmlrenderer.dev.java/
依赖jar包:iText-2.0.8.jariTextAsian.jarcore-renderer.jar
默认情况下,core-renderer.jar对中文是不能进行换行的,如果想解决换行问题可以去bettereveryday.javaeye/blog/611561下载一个jar包,该包对源代码做了稍加修改.
下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能
[c-sharp] view plaincopyprint?
1. import java.io.File;
2. import java.io.FileOutputStream;
3. import java.io.OutputStream;
4.
5. import org.xhtmlrenderer.pdf.ITextFontResolver;
6. import org.xhtmlrenderer.pdf.ITextRenderer;
7.
8. import pdf.BaseFont;
9.
10. public class TestFlyingSauser {
11. public static void main(String[] args) throws Exception {
12. demo_1();
13. demo_2();
14. }
15.
16. html代码翻译中文// 不支持中文
17. public static void demo_1() throws Exception {
18. String inputFile = "D:/Test/flying.html";
19. String url = new File(inputFile).toURI().toURL().toString();
20. String outputFile = "D:/Test/flying.pdf";
21. OutputStream os = new FileOutputStream(outputFile);
22. ITextRenderer renderer = new ITextRenderer();
23. renderer.setDocument(url);
24. renderer.layout();
25. atePDF(os);
26. os.close();
27. }
28.
29. // 支持中文
30. public static void demo_2() throws Exception {
31. String outputFile = "D:/Test/demo_3.pdf";
32. OutputStream os = new FileOutputStream(outputFile);
33. ITextRenderer renderer = new ITextRenderer();
34. ITextFontResolver fontResolver = FontResolver();
35. fontResolver.addFont("C:/Windows/", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
36. StringBuffer html = new StringBuffer();
37. // DOCTYPE 必需写否则类似于 这样的字符解析会出现错误
38. html.append("<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");
39. html.append("<html xmlns=/"/1999/xhtml/">").append("<head>")
40. .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/" />")
41. .append("<mce:style type=/"text/css/"><!--
42. body {font-family: SimSun;}
43. --></mce:style><style type=/"text/css/" mce_bogus="1">body {font-family: SimSun;}</style>")
44. .append("</head>")
45. .append("<body>");
46. html.append("<div>支持中文!</div>");
47. html.append("</body></html>");
48. renderer.String());
49. // 解决图片的相对路径问题
50. // SharedContext().setBaseURL("file:/F:/teste/html/");
51. renderer.layout();
52. atePDF(os);