文档章节

flying saucer html转pdf经验分享

s
 shaguofen
发布于 2014/05/24 21:40
字数 1059
阅读 10553
收藏 17

    对比了很多生成pdf的方案,最终还是决定使用flying saucer,网上能搜出N多相关文章,但是照着做了会出现各种问题,还是得自己一点点摸索,前后花了两天时间才达到自己的目标,下面把过程中的经验总结一下,希望对大家能有所帮助:

1)jar包选择

小小抱怨一下,各种开源产品给了我们极大帮助,但是通常版本管理较为混乱,也给我们带来了不小的麻烦,因为jar包兼容性问题花了很长时间,尤其是itext,下载了最新的5.5.0 5.5.1版本居然里面都有错误的!最后试了各种版本,终于选定5.0.6版本。貌似无法上传附件,否则可以将jar上传,免得大家找起来麻烦。注意一下,我也是网上下载了一个别人修改过支持中文的jar包。

2)中文支持

首先需要添加中文字库,也就是你的页面中用到的所有字体:

 ITextFontResolver fontResolver = renderer.getFontResolver();  
        fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 
        fontResolver.addFont("C:/Windows/Fonts/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        fontResolver.addFont("C:/Windows/Fonts/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

上面这个很简单,到处都能找到示例代码,但是注意点来了:页面中字体不能使用中文,需要使用英文名称,而且是大小写敏感的!例如宋体的英文名称是 SimSun(注意不是simsun!,首字母都是大写的)

      错误写法:font-family:宋体 或者  font-family:simsun

      正确写法:font-family:SimSun 或者 font-family:SimHei

如果生成的pdf中文不显示或者乱码,请确认如下信息:

  • 确保页面中所有内容都指定了字体,最好能指定 body {font-family:....},以防止漏网之鱼。

  • 确保上述所有字体均通过addFont加入,字体名称错误或者字体不存在会抛出异常,很方便,但是没导入的字体不会有任何提示。

  • 确保字体名称正确,不使用中文,大小写正确。

  • 确保html标签都正确,简单的方法是所有内容都去掉,随便写几个中文看看能否正常生成,如果可以,在认真检查html标签,否则再次检查上述几条。

还有就是中文换行的问题了,带有中文而且文字较多存在换行情况时,需要给table加入样式:

table-layout:fixed,然后表格中的td使用%还指定td的宽度。


3)加密及权限

加密方法较为简单:

 ITextRenderer renderer = new ITextRenderer();  
 renderer.setPDFEncryption(getEncryption());
 
 private PDFEncryption getEncryption()
{
    PDFEncryption encrypt = new PDFEncryption(new String("a").getBytes(), new String("b").getBytes(), PdfWriter.ALLOW_SCREENREADERS);
    return encrypt;
}

但是注意点来了,需要引入jar包!bcprov-jdk16-145.jar,百度一下很多的。

两个参数:两个都是密码,不同的是第一个密码是浏览密码,输入该密码打开pdf后根据设置的权限进行控制,第二个密码属于所有者密码,使用该密码打开pdf权限不受控制。

pdf的操作权限根据例子中写就行了


4)css样式

其实flying saucer对很多css都支持得不好,这个得自己慢慢试了,相当痛苦的过程,不过只要成功一个,其他的就简单了。

注意点:大写标签不识别!比如<DIV> <TD>等等统统不识别!,说到底就是大小写敏感。

5)多页面生成pdf

其实很简单,第一个页面不变,从第二个起:

        for(int i = 1; i < inputFile.length; i++)
        {
        	renderer.setDocument(new File(root, inputFile[i]));
        	renderer.layout();
        	renderer.writeNextDocument();
        }
        renderer.finishPDF();


6)标签

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link href="****.css" rel="stylesheet" type="text/css" />
 <bookmarks>  
	 <bookmark name="a" href="#a" /> 
	  <bookmark name="b" href="#b" /> 
 </bookmarks>  
</head>

其实就是在页面中增加锚点,然后在head中加入bookmark即可,但是注意点来了,如果你是将多个页面生成到一个pdf中,那么只要在最后一个页面中加入bookmark就可以了!否则会重复哦。

© 著作权归作者所有

s
粉丝 0
博文 2
码字总数 1693
作品 0
部门经理
私信 提问
加载中

评论(2)

ff100
ff100
能提供代码么?
唐代de豆腐
唐代de豆腐
没代码
李星/doc-render

项目主页:http://git.oschina.net/lemonzone2010/doc-render 最近公司需要生成PDF,基于这个需求简单学习了下IText 和 flying saucer,对于这两个技术.我先简单介绍下: Flying Saucer和iText介...

李星
2015/07/04
0
0
xhtmlrenderer

解析HTML和CSS,并且能输出成image,PDF等格式. Flying Saucer is an XML/CSS renderer, which means it takes XML files as input, applies formatting and styling using CSS, and genera......

匿名
2010/11/14
4.9K
0
Java世界的HTML转PDF调研

背景: 尝试过的几个方案如下: 1、使用HtmlCleaner 2、使用flying sauser flying saucer 使用中的一些问题 (java导出pdf) flying saucer(源代码托管在github https://github.com/flyingsau...

醉公子
2016/06/22
1K
2
html转PDF(java)非常奇怪的错误,标签没闭合

最近工作中要使用到HTML转 PDF。使用的技术是比较流行的 IText + flying-saucer 。思路就是将模板文件导入数据,然后将这个模板文件转换为PDF,然后碰到一个非常无语的问题。 The element ty...

sprouting
2016/05/28
1K
0
使用flying-saucer 实现 html转pdf实现input框select,textarea checkbox等的显示

昨天研究html转pdf,使用itextpdf 5.5.9版本(上一篇博客:https://my.oschina.net/u/1778261/blog/809757) 中文显示问题解决了,当时碰到了打印表单中input框等不显示的问题。 今天换了个方...

骑着乌龟赛跑
2016/12/22
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

如何查看ubuntu的版本

cat /etc/issue

南桥北木
34分钟前
3
0
超详细Linux下QT使用appimage打包程序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/kuer1379/article/details/82885810 一 打包工具 1.linuxd...

shzwork
40分钟前
6
0
Checkstyle的style

checkstyle是什么? 是代码规范检查,关于各种格式的利弊这里就不说了,但是业内有一些总结的规范利于goole或者阿里有自己的代码规范,就需要用到checkstyle。我个人很讨厌这东西,奈何项目再...

stayStand
43分钟前
7
0
左边竖条的实现方法

下面这个图形,只使用一个标签,可以有多少种实现方式: 假设我们的单标签是一个 div : 1 < div > div> 定义如下通用CSS: 1 2 3 4 5 6 div{ position : relative ; width : 200px ; height ...

前端老手
今天
3
0
java利用ECHARTS.JS在前台显示图表

步骤1: (1)在java后台,使用MSQL分组函数,列出所有线在对应的点的值, (2)组成的Map如图所示: 注意: key为0的value表示X轴需要的数据;key为其他的值表示图表线条的名字,value为x轴的点对应的y...

文文1
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部