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

本文介绍使用Java中的itext和flyingsaucer库快速生成带有中文内容的PDF文档的方法。通过对比不同方式支持中文字符的表现,探讨了性能差异,并提供了一段示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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了。


PHPWord Beta 0.6.2 开发者指南 目 录 首先我们要了解文档最基本的信息设置: 4 计量单位:缇(twips) 4 字体设置 4 文档属性设置 4 新建文档 5 添加页面 5 页面样式 5 页面样式属性 6 文本 7 添加文本 7 添加文本资源 7 文本样式 8 样式属性列表 9 添加换行符 10 添加分页符 10 列表 10 添加列表 10 列表样式 11 列表样式属性列表 11 超链接 11 添加超链接 11 超链接样式 12 图片 13 添加图片 13 图片样式 13 图片样式属性 13 添加GD生成图片 14 添加水印 14 添加对象 15 添加标题 15 添加目录 16 表格 17 添加表格 17 添加行 17 添加单元格 17 单元格样式 19 表格样式 20 页脚 22 页眉 23 模版 23 其他问题修改 25 解决文本缩进问题 25 表格对齐表格缩进 27 图片缩进绝对相对悬浮定位 30 首先我们要了解文档最基本的信息设置:  因为是国外编辑的类库,存在对中文支持的问题,使用前,我们需要进行一些修正: 1、解决编码问题,PHPword 会对输入的文字进行utf8_encode编码转化,如果你使用GBK、GB2312或者utf8编码的话就会出现乱码,如果你用utf8编码,就查找类库中所有方法中的 utf8_encode 转码将其删除,如果你采用GBK或者GB2312编码,使用iconv进行编码转换。 2、解决中文字体支持,在writer/word2007/base.php中 312行添加 $objWriter->writeAttribute('w:eastAsia',$font) 3、启动php zip支持,windows环境下在php配置文件php.ini中,将extension=php_zip.dll前面的分号“;”去除;(如果没有,请添加extension=php_zip.dll此行确保php_zip.dll文件存在相应的目录),然后同样在php.ini文件中,将 zlib.output_compression = Off 改为zlib.output_compression = On ; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值