PDF格式分析(六十六) Text 文字——简单字体

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-23 01:12   46   0

这个章节,我们来看看介绍一下简单字体。

简单字体,一般都具有以下属性:

  • 文本显示运算符(如Tj)显示的字符串由单字节字符代码组成。从逻辑上讲,这些代码会索引到一个包含256个glyph的表中;从代码到glyph的映射称为字体编码(这是一个很重要的要素,后面章节会介绍)。
  • 每个字形(glyph)应具有一组单独的度量值,包括水平位移或宽度;注意,简单字体仅支持水平书写模式。
  • 除了Type0字体、未标记PDF文档中的Type3类字体和某些标准Type1字体外,每个字体字典都应包含一个字体描述字典,该字典中包含字体范围度量和字体的其他属性。

1、Type 1 字体

Type 1 字体程序,采用样式化的PostScript程序描述字形形状。它对glyph描述使用压缩编码,并包含hint信息(这样可以在小尺寸和低分辨率下,也能实现高质量的渲染)。

Type 1规范是Adobe于1985年创建的. Type 1字体是基于向量的.您可以查阅“ Adobe Type 1. Font Format.”中找到规范.

尽管Type 1字体程序使用PostScript语言语法,但使用它并不需要完整的PostScript解释器;专门的Type 1字体解释器就足够了。(对于想自己想写一个完全独立的PDF阅读器有用,其他人请自觉跳过)。

下表列出了Type 1字体的字典包含的条目:

数据类型描述
Typename(必选),表示当前词典的类型,此处必须是Font。
Subtypename(必选),表示字体类型;此处必须是Type1。
Namename(PDF 1.0中必需;其他版本可选),表示此字体的别名,在当前资源字典的字体子字典中引用。
此条目已过时,不应再使用
BaseFontname

(必选)字体的PostScript名称。对于Type1字体来说,这是字体程序中FontName条目的值;

FirstCharinteger(除标准的14种字体外,必选)字体宽度数组Widths中定义的第一个字符代码。
LastCharinteger(除标准的14种字体外,必选)字体宽度数组Widths中定义的最后一个字符代码。
Widthsarray(除了标准的14种字体外,必选)一个长度(LastChar-FirstChar+1)的宽度数组,每个元素表示对应字符代码的字形宽度,对于FirstChar到LastChar范围之外的字符代码,应使用此字体的FontDescriptor项中的MissingWidth值中查找。字形宽度应以1000个单位对应于文本空间中1个单位的单位来测量。这些宽度应与字体程序中给出的实际宽度一致。
FontDescriptordictionary(除了标准的14种字体外,必选)字体描述字典。
Encodingname or dictionary(可选)字体的字符编码规范,通常是指定一个不同于内置编码的情况下使用。编码值应为预定义编码的名称(MacRomanEncoding、MacExpertEncoding或WinAnsiEncoding)或编码字典,该编码字典应指定与字体内置编码或指定预定义编码的差异。
ToUnicodestream(可选;PDF 1.2)包含CMap文件的流,该文件将字符代码映射到Unicode值,该处通常用于文本内容提取。

通常Type1字体的样子如下:

从上面的表格中,看到了标准的14种字体,是的,这是Type1字体存在标准的Tpye1字体,这些字体被保存在浏览器中,独立于系统字体之外。

这14种中Type1字体的PostScript名称如下:Times Roman、Helvetica、Courier、Symbol、Times Bold、Helvetica Bold、Courier Bold、ZapfDingbats、Times Italic、HelveticaLoxel、Courier Loxel、Times BoldItalic、Helvetica BoldLoxel、Courier BoldLoxel

2、MMType1

A multiple master font,多重母板字体,Type 1字体的扩展,允许从一种字体生成多种字体样式。

多重母版字体(或 MM 字体)是 Adobe 系统的 Type 1字体 Postscript字体的扩展,现在被 OpenType 的出现所取代,特别是在 OpenType 1.8中引入 OpenType 字体变化,也称为变量字体。

Adobe 在多重母版字体技术方面的目标是,通过调整字体粗细或笔画宽度等参数,让字体能够在生成用户所需的准确字体。 然而,多种主字体在面向客户的使用中,并不是很受欢迎,因为它很难编写,而且很多客户桌面出版应用程序来也没有很好的支持它们。而且字体设计师通常更喜欢发布特定重量和样式的字体,即经过单独调校的字体文件,这样也就不需要这种形式的字体类型了。

然而,多重母版的概念仍然在字体设计工作室大量使用,允许设计师快速生成一系列的权重和样式,然后单独优化它们。

MMType1的字体字典与Type1字体字典有相同的条目,但存在以下区别:

  • 条目“Subtype”=MMType1
  • 假如字体的PostScript名称中包含空格(20h),则在BaseFont的值,会将空格替换下划线(5Fh)。例如,名称“MinionMM 366 465 11 ” (以空格字符结尾),变为/MinionMM_366_465_11_

3、TrueType字体

TrueType是由美国苹果公司和微软公司共同开发的一种电脑轮廓字体(曲线描边字)类型标准。这种类型字体文件的扩展名是.ttf,类型代码是tfil。
早在1980年代末,苹果公司为了对抗Adobe公司的Type 1PostScript字体,设计开发了TrueType。之后微软加入了开发,Windows作业系统的字体格式基本上都统一成TrueType,而在苹果的Mac OS却成了PostScript和TrueType对立的局面。TrueType后来也被Linux等系统使用,成为标准字体。TrueType的主要强项在于它能给开发者提供关于字体显示、不同字体大小的像素级显示等的高级控制。

TrueType字体词典与Type 1字体词典拥有相同的条目,但有以下区别:

  • Subtype=TrueType
  • Encoding受“Character Encoding”中描述的限制,后面会讲到
  • BaseFont的值的获取方式不同(1、如果TrueType字体程序的“name”表包含PostScript名称,则使用该名称。2、如果“name”表中没有这样的条目,则PostScript名称应来自主机操作系统中对应字体的名称。在Windows系统中,名称应基于LOGFONT结构中的lfFaceName字段;在Mac OS中,名称应读取FOND 的名称。如果名称中包含空格,则应删除空格。)

注意:

  • TrueType字体程序可以作为流对象直接嵌入到PDF文件中。
  • 为PostScript定义的Type 42字体格式不适用于PDF。
  • 对于CJK(中文、日文和韩文)字体,主机字体系统的字体名称通常编码在主机操作系统的脚本中。一个中文字体的名称,可能使用一个汉字名称,对于这样的名称,应该包含多个字节字符代码,这样的名字该如何处理呢,当遇到多字节字符,使用#符号引用特殊字符来表示,然后拼接所有的字符。

在一个PDF文档中,可能存在Type 1和TrueType字体的子集。描述字体子集的字体和字体描述符与普通字体略有不同。这些差异允许一致性读取器识别字体子集并合并包含相同字体的不同子集的文档。

对于字体子集,字体的PostScript名称、字体的BaseFont条目的值和字体描述符的FontName条目应以标记字符串开头,后跟加号(+)。标签字符串应由六个大写字母组成;字母的选择是任意的,但同一PDF文件中的不同子集应具有不同的标签,保持唯一。举例:EOODIA+Pothionia是Pothionia(Type1字体)子集的名称。

4、Type3字体

Type3字体不同于PDF支持的其他字体。Type3字体字典定义字体;其他字体的字体字典只包含有关字体的信息,并参考单独的字体程序以获得实际的字形描述。在类型3字体中,字形应由PDF图形运算符流定义。这些流应与字形名称相关联。单独的编码条目应将字符代码映射到字形的适当字形名称。

Type3字体现在非常少见,在这一章节,就不做详细的介绍了,以后看读者需要再行添加。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP