`

html 生成 pdf 实现思路和代码,基于itext

阅读更多

java中生成pdf最快的非itext莫属,itext常用的版本有2.0.8 ,2.1.7 ,以及5.x.x ,中间貌似有断层,而且5改动非常大,包结构都改变了。

我从google查到的html 生成pdf方案,最好的莫过于 flyingsaucer + itext, 目前flygingsaucer-r8(googlecode中有,源码在github)适配的itext版本为2.0.8, 不能使用itext 2.1.7,有些api改变了,运行时会报错。

flying 最好的地方莫过于支持css2.1,及css3少量,flying 实现了一个css解析器,可能为了减少解析的难度,它要求html必须为xhtml格式,而不支持普通的html,你可以使用jtidy将html专程xhtml(有兴趣请自己去查)。

itext默认是不支持中文的,虽然它里面有cjk字体类(中国,日本,韩国)。

这里解决中文有两个方法:1,直接引用中文字体文件

 

 

  font.addFont(Html2Pdfs.class.getResource("SIMSUN.TTC").toString().substring(6),
 BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);

 2: 使用 itextAria.jar来支持中文

 

font.addFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

解决了itext支持中文的问题,flying同样在支持中文上有问题,flying只支持字体文件 ttc或ttf等。我改了flying的源码重新打包了,使其能支持itextaria。jar,避免依赖中文字体文件。

其实在生成pdf的时候我比较了两种方法的执行时间,感觉用字体文件生成速度稳定一些,在500ms左右,而itextaria第一次执行则超过了1s,以后会降到400ms左右。而 itext直接生成则在10ms级。

性能方面大家要多加考虑,这绝对不能应用到高并发的情况。要不然你就等着重启机器吧

 

解决了中文就该说说生成pdf常见的问题,如分页,如页眉,页脚,超链,图片,margin不过我懒得写了,附件中有个pdf里面都有解决方法。

 

直接贴代码吧 

 

StringBuilder sb = new StringBuilder();
		BufferedReader reader = new BufferedReader(new FileReader(new File("abc.html")));
		String line = null;
		while((line = reader.readLine()) != null){
			sb.append(line).append("\r\n");
		}

ITextRenderer render = new ITextRenderer();
		ITextFontResolver font = render.getFontResolver();
		try {
			font.addFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
		 //   font.addFont(Html2Pdfs.class.getResource("SIMSUN.TTC").toString().substring(6), 
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		OutputStream os = new FileOutputStream(pdf);
		render.setDocumentFromString(sb.toString());
		render.layout();
		render.createPDF(os);
		os.close();
 

很简单吧,不过生成速度非常慢,我测试过纯itext的生成速度非常快,那么应该是解析css慢。没办法谁叫只有这一家支持css呢,要不就只能去用itext了。


分享到:
评论
9 楼 yilinhust 2013-04-19  
abc.html中有相关字体CSS吗?

font.addFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); 
怎么弄还是发现不能展示中文



8 楼 wqq0712 2011-05-27  
原来公司有个类似的需求..上网找了很多方案..发现都不是非常完美..
最后无奈的使用的"曲线救国"方案..使用java调用pdfcreator的COM接口实现的..
(pdfcreator一个VB写的开源pdf文件生成软件.支持word->pdf,html->pdf),
总体使用来说还是不是很理想

对你的帖子保持关注..
7 楼 apchy 2011-05-27  
我以前解决这个用了PD4ML,这个包不错,输出效果很好,不过收费,免费的输出pdf页脚有版本信息,有点遗憾
6 楼 feiyan35488 2011-05-27  
xylsyangchun 写道
有具体可以编辑 PDF页面的代码例子吗?

还有在ftl模板文件里面如何标记一个对象集合!

编辑pdf已经超出了本贴的范围,那是另一个领域了。ftl不会请去看freemarker的中文文档,挺多的。我的博客里也有入门教程
5 楼 xylsyangchun 2011-05-27  
有具体可以编辑 PDF页面的代码例子吗?

还有在ftl模板文件里面如何标记一个对象集合!
4 楼 feiyan35488 2011-05-15  
melin 写道
看看我的实现方式:
http://melin.iteye.com/admin/blogs/982238

我也是这个思路实现的,flyingsaucer+itext的效率太低了,而且只能支持中文字体文件才能解决种问题,还有中文换行的问题。你都解决了?
3 楼 melin 2011-05-15  
看看我的实现方式:
http://melin.iteye.com/admin/blogs/982238
2 楼 feiyan35488 2011-05-15  
wind13 写道
Html2Pdfs 是个什么类?没有提到啊!

那行代码是加载html2pdfs所在包下的 ttc字体文件,你可以用任意路径进行替换
1 楼 wind13 2011-05-14  
Html2Pdfs 是个什么类?没有提到啊!

相关推荐

    flyingsaucer

    Flying Saucer(或者叫xhtmlrender project on java.net)是一个基于iText的开源java库,能够轻松的将html(带css2.1)生成pdf。 网站:http://code.google.com/p/flying-saucer/ 基于这个两个技术,大致就有了以下思路...

    java8源码-java-vue-pdf:java通过vuessr动态生成pdf解决方案Itonlyneedsvue

    java接收到html通过itext生成pdf 注:由于ssr只支持get请求,所以如果一次将所有数据都通过url传送的方式不太好,因此通过传递id反向查询数据的方式更靠谱 准备 java8(本人使用) node10(本人使用) 安装字体。生成pdf...

    JAVA上百实例源码以及开源项目源代码

    Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP   Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的...

    java源码包---java 源码 大量 实例

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    JAVA上百实例源码以及开源项目

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    java源码包2

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    java源码包3

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    java源码包4

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP   Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP   Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的...

Global site tag (gtag.js) - Google Analytics