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

7 篇文章 45 订阅
3 篇文章 132 订阅

作者: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的信息:

itext-0-2-1

    在这里,我主要翻译总结一下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-LightUniGB-UCS2-H
MHei-MediumUniCNS-UCS2-H
MSung-LightUniCNS-UCS2-H
HeiseiKakuGo-W5UniJIS-UCS2-H
HeiseiMin-W3UniJIS-UCS2-H
HYGoThic-MediumUniKS-UCS2-H
HYSMyeongJo-MediumUniKS-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看字体属性,如图:

itext-0-2-2

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

itext-0-2-3

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

itext-0-2-4

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));

    显示效果如下:

itext-0-2-5

PdfEncodings.IDENTITY_H就是Unicode编码,一般ttf文件都是用的这种编码,日后我会详谈

4. 代码样例打包

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

  • 21
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论
iText 7是一款用于操作PDF的开源库,可以在多种不同的操作系统上使用,包括Linux。如果在使用iText 7在Linux上导出PDF时出现了文字字体空白的问题,可能是由于以下原因导致的: 1. 缺少中文字体: Linux系统默认情况下可能没有安装中文字体,这会导致在PDF显示的文字出现空白。解决方法是在Linux系统上安装中文字体,例如通过执行命令 "apt-get install fonts-wqy-zenhei" 来安装文泉驿正黑字体。 2. 字体路径设置不正确:在使用iText 7时需要正确设置字体路径,确保能够找到所需的中文字体文件。可以通过使用setFont方法来设置字体路径和字体名称,例如: Font font = FontFactory.getFont("/path/to/font.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 或者 fontProvider.addFont("/path/to/font.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 这样可以确保在导出PDF时能够正确地使用中文字体。 3. 字体嵌入设置不正确:可能在导出PDF时没有将中文字体正确地嵌入到PDF文件。可以通过设置字体的嵌入模式来解决此问题,例如: font.setSubset(false); // 设置不进行字体子集化,将整个字体嵌入到PDF。 这些可能是导致iText 7在Linux上导出PDF中文字体空白的常见问题和解决方法。根据具体的情况,可能需要根据以上涉及到的步骤进行检查和调整,以确保在Linux上正确地显示和嵌入中文字体

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CuteXiaoKe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值