Java实现HTML代码生成PDF文档

本文来自CSDN博客,转载请标明出处http://blog.csdn.net/zdtwyjp/archive/2010/07/27/5769353.aspx

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完成项目组中相应的功能!
view plaincopy to clipboardprint?
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.ArrayList;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.html.simpleparser.HTMLWorker;
import com.lowagie.text.html.simpleparser.StyleSheet;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;
public class TestIText{   public static void main(String[] args) {   TestIText ih = new TestIText();ih.htmlCodeComeFromFile("D:\\Test\\iText.html", "D:\\Test\\iText_1.pdf");ih.htmlCodeComeString("Hello中文", "D:\\Test\\iText_2.pdf");}   public void htmlCodeComeFromFile(String filePath, String pdfPath) {   Document document = new Document();try {   StyleSheet st = new StyleSheet();st.loadTagStyle("body", "leading", "16,0");PdfWriter.getInstance(document, new FileOutputStream(pdfPath));document.open();ArrayList p = HTMLWorker.parseToList(new FileReader(filePath), st);for(int k = 0; k < p.size(); ++k) {document.add((Element)p.get(k));}   document.close();System.out.println("文档创建成功");}catch(Exception e) {   e.printStackTrace();}   }   public void htmlCodeComeString(String htmlCode, String pdfPath) {   Document doc = new Document(PageSize.A4);try {   PdfWriter.getInstance(doc, new FileOutputStream(pdfPath));doc.open();// 解决中文问题   BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);Paragraph t = new Paragraph(htmlCode, FontChinese);doc.add(t);doc.close();System.out.println("文档创建成功");}catch(Exception e) {   e.printStackTrace();}   }
}
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.ArrayList;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.html.simpleparser.HTMLWorker;
import com.lowagie.text.html.simpleparser.StyleSheet;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;
public class TestIText{
public static void main(String[] args) {
TestIText ih = new TestIText();
ih.htmlCodeComeFromFile("D:\\Test\\iText.html", "D:\\Test\\iText_1.pdf");
ih.htmlCodeComeString("Hello中文", "D:\\Test\\iText_2.pdf");
}
public void htmlCodeComeFromFile(String filePath, String pdfPath) {
Document document = new Document();
try {
StyleSheet st = new StyleSheet();
st.loadTagStyle("body", "leading", "16,0");
PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
document.open();
ArrayList p = HTMLWorker.parseToList(new FileReader(filePath), st);
for(int k = 0; k < p.size(); ++k) {
document.add((Element)p.get(k));
}
document.close();
System.out.println("文档创建成功");
}catch(Exception e) {
e.printStackTrace();
}
}public void htmlCodeComeString(String htmlCode, String pdfPath) {
Document doc = new Document(PageSize.A4);
try {
PdfWriter.getInstance(doc, new FileOutputStream(pdfPath));
doc.open();
// 解决中文问题
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
Paragraph t = new Paragraph(htmlCode, FontChinese);
doc.add(t);
doc.close();
System.out.println("文档创建成功");
}catch(Exception e) {
e.printStackTrace();
}
}
}

(二)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完成项目组中相应的功能!
view plaincopy to clipboardprint?
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;   import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;   import com.lowagie.text.pdf.BaseFont;   public class TestFlyingSauser {   public static void main(String[] args) throws Exception {   demo_1();   demo_2();   }   // 不支持中文   public static void demo_1() throws Exception {   String inputFile = "D:/Test/flying.html";   String url = new File(inputFile).toURI().toURL().toString();   String outputFile = "D:/Test/flying.pdf";   OutputStream os = new FileOutputStream(outputFile);   ITextRenderer renderer = new ITextRenderer();   renderer.setDocument(url);   renderer.layout();   renderer.createPDF(os);   os.close();   }   // 支持中文   public static void demo_2() throws Exception {   String outputFile = "D:/Test/demo_3.pdf";   OutputStream os = new FileOutputStream(outputFile);   ITextRenderer renderer = new ITextRenderer();   ITextFontResolver fontResolver = renderer.getFontResolver();   fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);   StringBuffer html = new StringBuffer();   // DOCTYPE 必需写否则类似于 这样的字符解析会出现错误   html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");   html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">").append("<head>")   .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")   .append("<mce:style type=\"text/css\"><!--
body {font-family: SimSun;}
--></mce:style><style type=\"text/css\" mce_bogus="1">body {font-family:SimSun;}</style>")   .append("</head>")   .append("<body>");   html.append("<div>支持中文!</div>");   html.append("</body></html>");   renderer.setDocumentFromString(html.toString());   // 解决图片的相对路径问题   // renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");   renderer.layout();   renderer.createPDF(os);   os.close();   }
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;import com.lowagie.text.pdf.BaseFont;public class TestFlyingSauser {
public static void main(String[] args) throws Exception {
demo_1();
demo_2();
}// 不支持中文
public static void demo_1() throws Exception {
String inputFile = "D:/Test/flying.html";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "D:/Test/flying.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
os.close();
}// 支持中文
public static void demo_2() throws Exception {
String outputFile = "D:/Test/demo_3.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
StringBuffer html = new StringBuffer();
// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误
html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">").append("<head>").append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />").append("<mce:style type=\"text/css\"><!--
body {font-family: SimSun;}
--></mce:style><style type=\"text/css\" mce_bogus="1">body {font-family:SimSun;}</style>").append("</head>").append("<body>");
html.append("<div>支持中文!</div>");
html.append("</body></html>");
renderer.setDocumentFromString(html.toString());
// 解决图片的相对路径问题
// renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
renderer.layout();
renderer.createPDF(os);
os.close();
}
}
     http://bettereveryday.javaeye.com/blog/611561参考资料:http://yongboy.javaeye.com/blog/510976http://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完成项目组中相应的功能!view plaincopy to clipboardprint?

import java.awt.Insets;
import java.io.File;
import java.io.FileOutputStream;
import java.io.StringReader;

import org.zefer.pd4ml.PD4Constants;
import org.zefer.pd4ml.PD4ML;

public class Converter {
public static void main(String[] args) throws Exception {
Converter converter = new Converter();
converter.generatePDF_2(new File(“D:/Test/demo_ch_pd4ml_a.pdf”), “D:/Test/a.htm”);
File pdfFile = new File(“D:/Test/demo_ch_pd4ml.pdf”);
StringBuffer html = new StringBuffer();
html.append(““)
.append(““)
.append(“”)
.append(““)
.append(““)
.append(““)
.append(“显示中文“)
.append(“”)
.append(““);
StringReader strReader = new StringReader(html.toString());
converter.generatePDF_1(pdfFile, strReader);
}
// 手动构造HTML代码
public void generatePDF_1(File outputPDFFile, StringReader strReader) throws Exception {
FileOutputStream fos = new FileOutputStream(outputPDFFile);
PD4ML pd4ml = new PD4ML();
pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
pd4ml.setHtmlWidth(950);
pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
pd4ml.useTTF(“java:fonts”, true);
pd4ml.setDefaultTTFs(“KaiTi_GB2312”, “KaiTi_GB2312”, “KaiTi_GB2312”);
pd4ml.enableDebugInfo();
pd4ml.render(strReader, fos);
}

// HTML代码来自于HTML文件
public void generatePDF_2(File outputPDFFile, String inputHTMLFileName) throws Exception {   FileOutputStream fos = new FileOutputStream(outputPDFFile);   PD4ML pd4ml = new PD4ML();   pd4ml.setPageInsets(new Insets(20, 10, 10, 10));   pd4ml.setHtmlWidth(950);   pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));   pd4ml.useTTF("java:fonts", true);   pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312");   pd4ml.enableDebugInfo();   pd4ml.render("file:" + inputHTMLFileName, fos);
}

}
import java.awt.Insets;
import java.io.File;
import java.io.FileOutputStream;
import java.io.StringReader;

import org.zefer.pd4ml.PD4Constants;
import org.zefer.pd4ml.PD4ML;

public class Converter {
public static void main(String[] args) throws Exception {
Converter converter = new Converter();
converter.generatePDF_2(new File(“D:/Test/demo_ch_pd4ml_a.pdf”), “D:/Test/a.htm”);
File pdfFile = new File(“D:/Test/demo_ch_pd4ml.pdf”);
StringBuffer html = new StringBuffer();
html.append(““)
.append(““)
.append(“”)
.append(““)
.append(““)
.append(““)
.append(“显示中文“)
.append(“”)
.append(““);
StringReader strReader = new StringReader(html.toString());
converter.generatePDF_1(pdfFile, strReader);
}
// 手动构造HTML代码
public void generatePDF_1(File outputPDFFile, StringReader strReader) throws Exception {
FileOutputStream fos = new FileOutputStream(outputPDFFile);
PD4ML pd4ml = new PD4ML();
pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
pd4ml.setHtmlWidth(950);
pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
pd4ml.useTTF(“java:fonts”, true);
pd4ml.setDefaultTTFs(“KaiTi_GB2312”, “KaiTi_GB2312”, “KaiTi_GB2312”);
pd4ml.enableDebugInfo();
pd4ml.render(strReader, fos);
}

// HTML代码来自于HTML文件
public void generatePDF_2(File outputPDFFile, String inputHTMLFileName) throws Exception {
FileOutputStream fos = new FileOutputStream(outputPDFFile);
PD4ML pd4ml = new PD4ML();
pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
pd4ml.setHtmlWidth(950);
pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
pd4ml.useTTF(“java:fonts”, true);
pd4ml.setDefaultTTFs(“KaiTi_GB2312”, “KaiTi_GB2312”, “KaiTi_GB2312”);
pd4ml.enableDebugInfo();
pd4ml.render(“file:” + inputHTMLFileName, fos);
}
}

  参考资料:http://www.pd4ml.com/examples.htmhttp://www.pd4ml.com/api/index.htmlhttp://pd4ml.com/reference.htm#7.1http://pd4ml.com/support/html-pdf-faq-f1/double-byte-support-t195.htmlhttp://pd4ml.com/support/pd4ml-html-css-pdf-tips-tricks-f7/ttf-embedding-t42.html

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zdtwyjp/archive/2010/07/27/5769353.aspx

Java实现HTML代码生成PDF文档相关推荐

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

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

  2. Aspose.PDF for Java系列5-转化PDF文档为Word

    Aspose.PDF for Java系列5-转化PDF文档 DocFormat枚举类提供了DOCX格式的文件输出格式选项.如果你想要将PDF转化为DOCX格式,请参考本文下面的内容. PDF转化为D ...

  3. Java:iText生成pdf文档

    依赖 <!-- pdf:start --> <dependency><groupId>com.itextpdf</groupId><artifac ...

  4. Java和iText导出pdf文档

    一:工程截图: 二:项目运行截图: 三:源代码: Book.java package com.iText.bean;public class Book {private int bookId;// 图 ...

  5. java拆分_Java 拆分 PDF 文档

    在办公过程中,我们有时会遇到需要将一个比较大的PDF文档拆分成多个文档的情况, 今天这篇文章就将介绍两种使用Free Spire.PDF for Java来拆分PDF文档的方法. 方法一:将一个PDF ...

  6. Java调用打印机打印PDF文档的两种方法

    最近,由于项目需求,需要增加系统调用打印机打印PDF文档功能.以前在Asp.Net项目中做过套打,但是现在的需求直接文档打印,下面是实现代码调用打印机的两种方法. 1.Java Print Servi ...

  7. java 绘制pdf_Java 在PDF文档中绘制图形

    本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...

  8. java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  9. java对office、pdf文档在线预览解析(融合进项目中)

    最近在项目中要做一个文档的预览,在网上搜了好多demo,都可以实现其功能,但是放在自己的项目中有点复杂. 先说明本人的开发环境(win7+tomcat7+maven+svn+myeclipse),接下 ...

  10. Java动态数据生成PDF文档及下载

    查了很多资料都没有我想要的pdf,于是根据iText基础知识(这里是看了宝爷的笔记点击打开链接)自行编辑了一个简单的表格pdf文档 运用spring.mybatis.CXF框架 SSM框架打印pdf: ...

最新文章

  1. python—迭代器
  2. 【IneliJ 】使用IneliJ IDEA 2016将Java Web项目导出为War包
  3. SAP CRM Fiori my task应用是如何在My Account应用里加载的
  4. JIRA-6.3.6安装与破解
  5. Java——类加载机制
  6. 梦幻,MySQL视图,虚实表,完整详细可收藏
  7. poj 2503 Trie树
  8. 文件与用户管理linux实验,实验03 Linux用户和权限管理
  9. java 中的 什么意思啊_JAVA 中的 - 是什么意思?
  10. 小米2系列板砖自救行动
  11. 3d 模型后缀 互转 和名词解释
  12. 入门物联网需要服务器
  13. mac 锁屏及锁屏快捷键设置
  14. 如何找到浏览器扩展的安装位置
  15. NLP初学-文本预处理
  16. 访问www.baidu.com的过程
  17. minidump详细介绍及其windbg的使用
  18. 移动端调试HTML页面-weinre
  19. GitHub开源:升讯威 SQLite 增强组件 Sheng.SQLite.Plus
  20. iOS WebCore的wak目录

热门文章

  1. Linux x86-64 IOMMU详解(三)——Intel IOMMU(硬件IOMMU)的功能与基本原理
  2. 21年,周杰伦越发孤独
  3. 虚拟机VMware14安装教程以及搭建openEuler-20.03-LTS-x86_64-dvd.iso系统教程(网盘中也包含了Ubuntu 16.04的.ios文件)
  4. 使用成捷讯软件制作简单的通信工程预算----以高速4G新建站为例
  5. python菜鸟教程 | 字典(Dictionary)
  6. bing翻译接口appID申请教程【TranslateApiException: AppId is over the quota 】
  7. Win7 SP1 安装python 3.8时,提示 KB2533623 update is required to continue
  8. 水星usb无线网卡linux驱动下载,水星USB无线网卡mw150us苹果macOS系统驱动成功
  9. kali使用rz sz命令
  10. C#编程VS开发工具安装Nupkg包