「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。
这两天用Itext操作pdf可谓是踩坑无数,选择的大版本是7,可以说版本就是Itext最大的坑,网上常见的有5和7,这两个大版本之间变得东西非常多,而且Itext的文档也很少,官方的只是简单介绍了几个demo的使用,具体各个函数并没有细说,使用起来让人非常的痛苦。
字体问题
字体问题可以说从头到尾都困扰着我,一开始我选的是7.2.0版本,设置中文是这样的
//使用系统本地字体,可以解决生成的pdf中无法显示中文问题,本处字体为宋体
//在创建字体时直接使用即可解决中文问题
PdfFont sysFont = PdfFontFactory.
createFont("C:/Windows/Fonts/simsun.ttc,1", PdfEncodings.IDENTITY_H);
//。。。。。。。。。。
document.add(new Paragraph("好 的!").setFont(sysFont));
//通过setfont方法设置自定义的字体就可以正常显示了
但是我在网上搜索到的都是下面这种:
PdfFont sysFont = PdfFontFactory.createFont
("C:/Windows/Fonts/simsun.ttc,0", PdfEncodings.IDENTITY_H,false);
比我多了最后一个参数false,但是我发现我的PdfFont没有这样的构造函数,还有一种是通过BaseFont设置的,但是这个是Itext5的设置方式,在7里面是不适用的。
还有一种方法是借助Itext的font-asian包进行设置,但是这种设置方式在我下面的那种情况下也会出错。不过只是用来显示一下中文应该是可行的。
PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
一开始我是可以正常显示中文的,但后来操作pdf模板的时候就出了问题,我在制作pdf模板的时候需要用到单选框和复选框,但是单选框和复选框的字体默认的是adobe pi,而且无法修改字体样式,然后程序运行时就会报错,应该是Itext库里面没有这种字体导致的。
试了很多办法都没用最后把版本降下来终于解决了,最终的版本是7.0.3,降到这个版本后就可以像下面这种方式一样设置字体了,而且也不会报错了。具体是什么原因没有深入研究过,大家有什么看法也欢迎在评论区交流。
PdfFont sysFont = PdfFontFactory.createFont
("C:/Windows/Fonts/simsun.ttc,0", PdfEncodings.IDENTITY_H,false);