欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

Java实现HTML代码生成PDF文档_html/css_WEB-ITnose

程序员文章站 2022-03-31 10:43:45
...
标签: java html 代码| 发表时间:2016-05-13 07:40 | 作者:hunan84229247

出处:http://www.iteye.com

http://blog.csdn.net/zdtwyjp/article/details/5769353

http://www.xuebuyuan.com/2056017.html

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完成项目组中相应的功能!

[c-sharp] view plain copy

  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
  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完成项目组中相应的功能!

[c-sharp] view plain copy

  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(""-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");
  34. html.append("").append("")
  35. .append("")
  36. .append(" ")
  37. .append("")
  38. .append("");
  39. html.append("
    支持中文!
    ");
  40. html.append("");
  41. renderer.setDocumentFromString(html.toString());
  42. // 解决图片的相对路径问题
  43. // renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
  44. renderer.layout();
  45. renderer.createPDF(os);
  46. os.close();
  47. }
  48. }

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完成项目组中相应的功能!

[java] view plain copy

  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("")
  14. .append("")
  15. .append("")
  16. .append("")
  17. .append("")
  18. .append("")
  19. .append("显示中文")
  20. .append("")
  21. .append("");
  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文档的方案大致就这些了,希望能够给大家带来帮助!如果上面的三种方案都还不能满足项目组的需求哪就只有去买商业软件了。

已有 0人发表留言,猛击->> 这里ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—