转自:http://blog..net/zdtwyjp/article/details/5769353

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

plaincopy

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;

publicclassTestIText{

publicstaticvoidmain(String[] args) {

TestIText ih = newTestIText();

ih.htmlCodeComeFromFile("D://Test//iText.html","D://Test//iText_1.pdf");

ih.htmlCodeComeString("Hello中文","D://Test//iText_2.pdf");

}

publicvoidhtmlCodeComeFromFile(String filePath, String pdfPath) {

Document document = newDocument();

try{

StyleSheet st = newStyleSheet();

st.loadTagStyle("body","leading","16,0");

PdfWriter.getInstance(document, newFileOutputStream(pdfPath));

document.open();

ArrayList p = HTMLWorker.parseToList(newFileReader(filePath), st);

for(intk = 0; k

document.add((Element)p.get(k));

}

document.close();

System.out.println("文档创建成功");

}catch(Exception e) {

e.printStackTrace();

}

}

publicvoidhtmlCodeComeString(String htmlCode, String pdfPath) {

Document doc = newDocument(PageSize.A4);

try{

PdfWriter.getInstance(doc, newFileOutputStream(pdfPath));

doc.open();

// 解决中文问题

BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

Font FontChinese = newFont(bfChinese, 12, Font.NORMAL);

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

[c-sharp] view

plaincopy

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;

publicclassTestFlyingSauser {

publicstaticvoidmain(String[] args) throws Exception {

demo_1();

demo_2();

}

// 不支持中文

publicstaticvoiddemo_1() throws Exception {

String inputFile = "D:/Test/flying.html";

String url = newFile(inputFile).toURI().toURL().toString();

String outputFile = "D:/Test/flying.pdf";

OutputStream os = newFileOutputStream(outputFile);

ITextRenderer renderer = newITextRenderer();

renderer.setDocument(url);

renderer.layout();

renderer.createPDF(os);

os.close();

}

// 支持中文

publicstaticvoiddemo_2() throws Exception {

String outputFile = "D:/Test/demo_3.pdf";

OutputStream os = newFileOutputStream(outputFile);

ITextRenderer renderer = newITextRenderer();

ITextFontResolver fontResolver = renderer.getFontResolver();

fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

StringBuffer html = newStringBuffer();

// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误

html.append("html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");

html.append("").append("

")

.append("")

.append("

body {font-family: SimSun;}

-->")

.append("")

.append("

");

html.append("

支持中文!

");

html.append("");

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/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

plaincopy

importjava.awt.Insets;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.StringReader;

importorg.zefer.pd4ml.PD4Constants;

importorg.zefer.pd4ml.PD4ML;

publicclassConverter {

publicstaticvoidmain(String[] args)throwsException {

Converter converter = newConverter();

converter.generatePDF_2(newFile("D:/Test/demo_ch_pd4ml_a.pdf"),"D:/Test/a.htm");

File pdfFile = newFile("D:/Test/demo_ch_pd4ml.pdf");

StringBuffer html = newStringBuffer();

html.append("")

.append("

")

.append("")

.append("")

.append("

")

.append("")

.append("显示中文")

.append("")

.append("");

StringReader strReader = newStringReader(html.toString());

converter.generatePDF_1(pdfFile, strReader);

}

// 手动构造HTML代码

publicvoidgeneratePDF_1(File outputPDFFile, StringReader strReader)throwsException {

FileOutputStream fos = newFileOutputStream(outputPDFFile);

PD4ML pd4ml = newPD4ML();

pd4ml.setPageInsets(newInsets(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文件

publicvoidgeneratePDF_2(File outputPDFFile, String inputHTMLFileName)throwsException {

FileOutputStream fos = newFileOutputStream(outputPDFFile);

PD4ML pd4ml = newPD4ML();

pd4ml.setPageInsets(newInsets(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.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文档的方案大致就这些了,希望能够给大家带来帮助!如果上面的三种方案都还不能满足项目组的需求哪就只有去买商业软件了。

java html 导出 pdf文件,Java HTML导出PDF (一)相关推荐

  1. java将多个pdf文件合并成一个pdf文件

    需要下载jar:https://pan.baidu.com/s/1_wOUUAqWz_5jbfwzMP8ahg package com.skysz.framework.file;import java ...

  2. [PDF文件全攻略]-PDF二次开发(.NET开发 C++开发 Java PHP)

    原文:http://www.cankau.cn/news/tech/2009112016.html [PDF文件全攻略]-PDF二次开发(.NET开发 C++开发 Java PHP) 2009-11- ...

  3. JAVA删除pdf空白页_如何编辑PDF文件,如何删除PDF文档中的空白页

    时代在发展,科技在进步,我们现在日常使用的文件也发展了,以前只有Word跟TXT,现在还增加了一个PDF格式的文件,但PDF格式的文件跟Word和TXT文件不一样,Word跟TXT文件可以直接的打开编 ...

  4. asp.net中使用excel类导出Excel文件,并导出到web客户端中遇到的问题

    asp.net中使用excel类导出Excel文件,并导出到web客户端中遇到错误: 检索Com类工厂中CLSID为{000245-0000-0000-C000-000000000046}的组件失败, ...

  5. pdf合到一起java_将多个PDF文件合并/转换为一个PDF

    回答(16) 2 years ago 考虑到 pdfunite 是poppler的一部分,它有更高的安装机会,使用也比 pdftk 简单: pdfunite in-1.pdf in-2.pdf in- ...

  6. Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数

    Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数 文件夹中获取需要转换的文件数,将其全部转换或可单独转换单个文件,并获取转成PD ...

  7. 网页中动态嵌入PDF文件/在线预览PDF内容

    网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发 ...

  8. 如何编辑PDF文件,怎么修改PDF中的文字

    相信大家都使用过PDF文件,那么有没有编辑过PDF文件呢,PDF文件的编辑是需要借助PDF编辑器的,PDF文件中的文字要怎么修改呢,Word文档的文字就直接编辑,而PDF文件并非这样,想知道怎么编辑吗 ...

  9. Py:利用pyautogui实现自动将pdf文件(需手动设定pdf总页数)自动翻页并截取另存为图片形式,或自动隔0.1秒自动截笔记本全屏保存到指定文件夹

    Py:利用pyautogui实现自动将pdf文件(需手动设定pdf总页数)自动翻页并截取另存为图片形式,或自动隔0.1秒自动截笔记本全屏保存到指定文件夹 目录 实现步骤和结果 核心代码 实现步骤和结果 ...

  10. 电脑上怎么做pdf文件_怎么合并PDF文件?PDF合并软件哪个好?

    怎么合并PDF文件?很多人现在在工作中都会使用到PDF格式的文件.在传输这些PDF文件时,如果一张一张的发送速度会很慢,也会给文件接收者造成麻烦.遇到这种情况时,我们最好将这些PDF文件先合并起来.P ...

最新文章

  1. 【Android 逆向】Android 进程简介 ( Android 应用启动流程 )
  2. centos不允许root直接登陆
  3. 21天舞动西浦报名失败的教训:先下手为强
  4. SecureCRT连接Linux的操作步骤
  5. 为了让开发者写MaxCompute SQL更爽,DataWorks 增强SQL 编辑器功能
  6. struts json序列化遇上replaceAll就出问题
  7. angularjs获取php数据类型,利用Angularjs从PHP读取后台数据
  8. Flutter进阶—质感设计之列表项
  9. 中国 App 出海“变形记”
  10. MySQL安装到mac还是linux_MySql在Linux下安装和Mac下的配置
  11. 复杂json解析(json里面嵌套json)
  12. 画质速度通吃 浅谈为游戏而生的SM3技术(Dx9的一些技术) -ok
  13. cookie httponly ajax,为什么jquery的.ajax()方法没有发送我的会话cookie?
  14. 双边功率谱密度和单边功率谱密度_以高斯信号为例,计算幅度谱、相位谱、双边功率谱、双边功率谱密度、单边功率谱、单边功率谱密度。...
  15. (程序员/软件工程师/开发者)编程——计算机专业英语学习指引
  16. Java开发-空指针(NullPointException)
  17. java 国家法定节假日和双休日判断工具类
  18. pygame实现动态小鸟飞行 + 打包发布
  19. c语言tab什么意思_我的C语言入门笔记。
  20. 微信漫画小程序全开源商业版

热门文章

  1. Windows XP SP3英文版镜像
  2. 数电课设交通灯控制器
  3. java图形用户界面基础
  4. 企业请专职SEO和外包给科技公司做优化,有什么不同?
  5. VTP协议原理及配置
  6. 主机甲和乙已建立了 TCP 连接,甲始终以 MSS=1KB 大小的段发送数据,并一直有数据 发送;乙每收到一个数据段都会发出一个接收窗口为 10KB 的确认段。若甲在 t 时刻发生超 时时拥塞窗口为
  7. 谁在管理拼多多:超级大脑和原子化组织
  8. 数字IC设计verilog编写——6脉冲同步器
  9. git 学习指南 学习资料笔记
  10. 视频分割神器-MP4文件随意分割