itext7学习笔记杂谈系列2——在itext7中添加中⽂(其他字体)和字体相关事
在本章,我们会讨论如何在itext7中显⽰中⽂,或者其他CJK(Chinese/Japan/Koera)等⾮ASCII码字符遇到的问题,解读font-asian.jar这个包的作⽤.
字体编码
如果我们想真正了解字体如何在计算机存储的话,字体⽂件是些啥的话,还有编码问题,可以参考
顺带⼀提,查看本机的默认代码页(也就是ANSI),在cmd输⼊chcp即可查看代码页数字
PDF中的CJK字体
我们可以总结出来,现在市⾯上流⾏的字体有三种:
Postscript/Type1 是1985年由Adobe公司提出的⼀套⽮量字体标准,有版权,收费,扩充CJK字体的时候,使⽤ CID-keyed font 技术,在itext7使⽤它的话⽐较⿇烦,没错,就它事多coordinate with
Truetype TrueType是1991年由Apple公司与Microsoft公司联合提出另⼀套⽮量字标准
OpenType 995年,Adobe公司和Microsoft公司开始联⼿开发⼀种兼容 Type1和TrueType,并且真正⽀
持Unicode的字体,后来在发布的时候,正式命名为OpenType。OpenType可以嵌⼊Type1 和TrueType,这样就兼有了⼆者的特点,⽆论是在屏幕上察看还是打印,质量都⾮常优秀。
如果我们在PDF中想要嵌⼊CJK字体的话,我们使⽤的itext7或者其他⾮Adobe软件是不能把CJK嵌⼊到PDF的,因为许可证保护,详情我们可以看看jar中的信息:
在这⾥,我主要翻译总结⼀下⾥⾯的内容(因为⾥⾯的⼀些⽹址都已经过时了,所以我总结⾃⼰⽹上的⼀些资料):
CJK或者CE字体版权归Adobe所有,只能在Adobe Reader等软件中使⽤
iText7不能嵌⼊CJK或者CE字体,因为会侵犯Adobe版权,例如嵌⼊CJK字体,可以⽤其余的PDF查看器查看,这会影响它的利益font-asian.jar⾥⾯是有两种⽂件,⼀种是cmap⽂件(编码⽂件),另⼀种是.properties⽂件(与字体程序有关)
在Type 1字体中⽤来描述字体度量(font metrics)是存储在Adobe font metrics (AFM)和Adobe composite font metrics (ACFM) files中的,这些⽂件是被字体程序所使⽤的,在itext中把这些信息放在.properties⽂件中,以key-value这样的形式存储,这样我们就不需要实际字体程序,只需要把字体信息放在itext创建的⽂件中。
itext7嵌⼊字体
创建Type 1字体
我们展开上图的cmap,我们会发现⼀些字体程序(.properties⽂件名代表的就是字体程序名),当然我们还需要确定字体程序所⽀持的编码,以下是常⽤的adobe公司的字体程序和对应编码:
sql server备份表的sql字体程序编码
STSong-Light UniGB-UCS2-H
MHei-Medium UniCNS-UCS2-H
字体程序编码
MSung-Light UniCNS-UCS2-H
HeiseiKakuGo-W5UniJIS-UCS2-H
HeiseiMin-W3UniJIS-UCS2-H
HYGoThic-Medium UniKS-UCS2-H
HYSMyeongJo-Medium UniKS-UCS2-H 其余的字体程序对应的编码暂时没查阅到,adobe官⽹信息不⼀样了,如果想⽤特定的字体的话可以到时候查阅
然后就是创建具体的字体,核⼼代码如下,假设我们使⽤STSong-Light创建字体:
......
PdfFont f2 = ateFont("STSong-Light", "UniGB-UCS2-H",true);
document.add(new Paragraph("hellos你好").setFont(f2)); //表格、list其他⽅式也是这种⽅式
......
如果您曾经使⽤过itext5,你会发现与itext5的创建字体⽅式不⼀样,没关系,我会另写⼀篇⽂章来写itex7与itext5在创建字体的时候的不同之处
创建完的pdf,我们按crtl+d看字体属性,如图:
我们可以发现,实际的字体是AdobeSongStd-Light,这是因为我本机安装的时候是选择的简体中⽂,会⾃带宋体和⿊体的字体程序,在“C:\Program Files (x86)\Adobe\Acrobat Reader DC\Resource\CIDFont”(安装⽬录)中可以看到我们使⽤的是CID字体,有两个字体程序:
假如,我们使⽤在这个⽂件夹下没有的字体程序呢?例如HeiseiKakuGo-W5等,我们通过itext7是可以⽂件,但是打开pdf的时候会弹出这样⼀个对话框,让我们去下载字体,如图:
properties是什么文件创建其他字体
duration的动词嵌⼊其他字体的时候⽐较简单了,可以使⽤⾃⼰定义的字体⽂件,⽀持ttf⽂件,也可以使⽤windows⾃带的字体⽂件,如下代码:
PdfFont f2 = ateFont("STSong-Light", "UniGB-UCS2-H",true);
PdfFont f3 = ateFont("C:/Windows/f", PdfEncodings.IDENTITY_H,true);
//Add paragraph to the document
孙侨潞真的去世了吗document.add(new Paragraph("hellos你好").setFont(f2));
document.add(new Paragraph("hellos你好").setFont(f3));
显⽰效果如下:
PdfEncodings.IDENTITY_H就是Unicode编码,⼀般ttf⽂件都是⽤的这种编码,⽇后我会详谈代码样例打包女生跷二郎腿暗示男生什么
我在和的基础上,添加了中⽂输出,请放⼼