作者:CuteXiaoKe
微信公众号:CuteXiaoKe

在本章,我们会讨论如何在itext7中显示中文,或者其他CJK(Chinese/Japan/Koera)等非ASCII码字符遇到的问题,解读font-asian.jar这个包的作用.

1. 字体编码

如果我们想真正了解字体如何在计算机存储的话,字体文件是些啥的话,还有编码问题,可以参考中文编码 TTF字库之间的关系
    顺带一提,查看本机的默认代码页(也就是ANSI),在cmd输入chcp即可查看代码页数字

2. PDF中的CJK字体

我们可以总结出来,现在市面上流行的字体有三种:

  • Postscript/Type1 是1985年由Adobe公司提出的一套矢量字体标准,有版权,收费,扩充CJK字体的时候,使用 CID-keyed font 技术,在itext7使用它的话比较麻烦,没错,就它事多
  • Truetype TrueType是1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准
  • OpenType 1995年,Adobe公司和Microsoft公司开始联手开发一种兼容 Type1和TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenType。OpenType可以嵌入Type1 和TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。

如果我们在PDF中想要嵌入CJK字体的话,我们使用的itext7或者其他非Adobe软件是不能把CJK嵌入到PDF的,因为许可证保护,详情我们可以看看font-asian-7.x.x.jar中cmap_info.txt的信息:

在这里,我主要翻译总结一下cmap_info.txt里面的内容(因为里面的一些网址都已经过时了,所以我总结自己网上找的一些资料):

  • 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创建的文件中。

3. itext7嵌入字体

3.1 创建Type 1字体

我们展开上图的cmap,我们会发现一些字体程序(.properties文件名代表的就是字体程序名),当然我们还需要确定字体程序所支持的编码,以下是常用的adobe公司的字体程序和对应编码:

字体程序 编码
STSong-Light UniGB-UCS2-H
MHei-Medium UniCNS-UCS2-H
MSung-Light UniCNS-UCS2-H
HeiseiKakuGo-W5 UniJIS-UCS2-H
HeiseiMin-W3 UniJIS-UCS2-H
HYGoThic-Medium UniKS-UCS2-H
HYSMyeongJo-Medium UniKS-UCS2-H

其余的字体程序对应的编码暂时没查阅到,adobe官网信息不一样了,如果想用特定的字体的话可以到时候查阅

然后就是创建具体的字体,核心代码如下,假设我们使用STSong-Light创建字体:

......
PdfFont f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true);
document.add(new Paragraph("hellos你好").setFont(f2)); //表格、list其他方式也是这种方式
......

如果您曾经使用过itext5,你会发现与itext5的创建字体方式不一样,没关系,我会另写一篇文章来写itex7与itext5在创建字体的时候的不同之处
不同的itext7版本创建PdfFont的API不一样,在本例iText版本为7.0.3,7.1.17-SNAPSHOT的版本请参考iText7高级教程之构建基础块——1.引入字体第5章

创建完的pdf,我们按crtl+d看字体属性,如图:

我们可以发现,实际的字体是AdobeSongStd-Light,这是因为我本机安装的时候是选择的简体中文,会自带宋体和黑体的字体程序,在“C:\Program Files (x86)\Adobe\Acrobat Reader DC\Resource\CIDFont”(安装目录)中可以看到我们使用的是CID字体,有两个字体程序:

假如,我们使用在这个文件夹下没有的字体程序呢?例如HeiseiKakuGo-W5等,我们通过itext7是可以文件,但是打开pdf的时候会弹出这样一个对话框,让我们去下载字体,如图:

3.2 创建其他字体

嵌入其他字体的时候比较简单了,可以使用自己定义的字体文件,支持ttf文件,也可以使用windows自带的字体文件,如下代码:

PdfFont f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true);
PdfFont f3 = PdfFontFactory.createFont("C:/Windows/Fonts/simhei.ttf", 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文件都是用的这种编码,日后我会详谈

4. 代码样例打包

我在第一章和第一章实践的基础上,添加了中文输出,请放心下载

itext7学习笔记杂谈系列2——在itext7中添加中文(其他字体)和字体相关事相关推荐

  1. Sharepoint学习笔记—Ribbon系列-- 2. 在Ribbon中添加新Tab

    有了上面的基础,我们来看看如何向Sharepoint网站的Ribbon中添加我们定义的Tab. 直接进入操作步骤 一.创建 SharePoint 项目 要添加新选项卡,应首先创建一个空白 ShareP ...

  2. Sharepoint学习笔记—Ribbon系列-- 5. 在Ribbon中添加新控件(针对用户自定义Tab)

    前面我们实现了向用户自定义的Tab中添加新的Group,并向其中创建了两个Button按钮.这里我们看看如何向这个已经创建好的Group中再另外添加新的Button控件(当然,你可以添加其它控件,实现 ...

  3. Sharepoint学习笔记—Ribbon系列-- 3.在Ribbon中找到正确的Location

    如果我们想要自定义Sharepoint的Ribbon,向其中增,删,改各种元素(Tab,Group,Controls),我们就必须要正确定位我们的操作.Ribbon就像一个靶子,我们的操作只有打向了正 ...

  4. itext7学习笔记——第7章

    作者:CuteXiaoKe 微信公众号:CuteXiaoKe 前言 在1-4章中,我们使用了iText7来创建PDF文档.在5-6章中,我们操作和重用了现有的PDF文档.在这些章节中我们操作的PDF文 ...

  5. Sharepoint学习笔记—Ribbon系列

     为便于查阅,这里整理并列出了我的Sharepoint学习笔记中涉及Ribbon开发的关文章,有些内容可能会在以后更新. Sharepoint学习笔记-Ribbon系列-- 1. Ribbon的架构 ...

  6. itext7学习笔记——第2章实践example

    本章的例子,请参考我翻译的博文:itext7学习笔记--第2章,里面有详细的解释,有什么不懂得也可以评论或者私信我! 例子1:简单的坐标系 简单地画一个x和y轴坐标系,代码如下: import com ...

  7. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  8. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  9. Deep Learning(深度学习)学习笔记整理系列之(八)

     Deep Learning(深度学习)学习笔记整理系列之(八) 分类: Deep Learning 机器学习 Linux驱动2013-04-10 11:4257652人阅读评论(25)收藏举报 ...

最新文章

  1. MvvmLight框架使用入门(三)
  2. k8s集群dns问题解决办法
  3. block size在equipment download中的用法
  4. 怎样实现WPF Prism Module的国际化和本地化?
  5. 信息学奥赛C++语言:插队问题
  6. vs2017调试浏览器闪退
  7. 笑话(12) 内裤都磨破了
  8. 使用开源库 Objective-C RegEx Categories 处理正则表达式
  9. scrapy爬虫框架入门实战
  10. scala学习笔记(1)
  11. leetcode——给定一个整数数组和一个目标值返回两个数字对应的索引,使得这两个数字之和等于目标值
  12. linunx 系统一键安装lnmp1.5 之后开启extension=php_fileinfo.dll 报错处理方法
  13. 全网首发:WINDOWS某些文件夹,提供管理员权限后也无法删除,正确解决办法
  14. PCB SI9000阻抗计算引擎Web方式实现方法
  15. php 冷门与常用函数
  16. win10双系统linux,win10系统linux双系统安装的操作方法
  17. panabit安装和默认密码
  18. html网页提速,HTML-加速、再加速(上)
  19. 去百度还是去创新工厂? 信开复还是信彦宏?
  20. 【案例20】NC系统was部署后无法登录

热门文章

  1. project02:阶段性总结
  2. matlab光子晶体求反射率,一维光子晶体禁带结构的MATLAB分析计算讲解.PDF
  3. “动真格”的垃圾分类,需要你我容忍其中的不便
  4. QTableWidget 设置表头颜色
  5. 错误:Attempted read from closed stream尝试读取关闭的流!!!
  6. 电脑时间调到2099年,会发生什么
  7. 我的、新的、纯粹的:触摸荣耀长大后的面庞
  8. OOzie 入门 【转】
  9. SQL on log : 同比分析各种指标
  10. centos 7 下 硬盘GPT格式转换