破解字体反爬(二)

介绍

本篇文章描述通过程序解析字库文件中字体的方法。

背景知识

网页上使用的字库文件常用格式有:.ttf,.woff,.eot(认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg ——简书)。经过测试,以ttf文件格式为准编写的解析程序,其他格式一般也能解析。下面就以解析ttf格式作介绍。

TrueType字体

TrueType字体通常包含在单个TrueType字体文件中,其文件后缀为.TTF。OpenType字体是以类似 于TrueType字体的格式编码的POSTSCRIPT字体。OPENTYPE字体使用.OTF文件后缀。OPENTYPE还允许把多个OPENTYPE字体组合在一个文件中以利于数据共享。这些字体被称为TrueType字体集(TrueType collection),其文件后缀为.TTC

对于TrueType字体文件结构解析的帖子很多,我这里贴出一个格式比较清晰的。ttf文件结构解析.doc,这里对ttf文件结构解析.doc作简单概述。

一个ttf文件中包含了很多个表结构,大概有:

  • head 字体头 字体的全局信息
  • cmap 字符代码到图元的映射 把字符代码映射为图元索引
  • glyf 图元数据 图元轮廓定义以及网格调整指令
  • maxp 最大需求表 字体中所需内存分配情况的汇总数据
  • mmtx 水平规格 图元水平规格
  • loca 位置表索引 把元索引转换为图元的位置
  • name 命名表 版权说明、字体名、字体族名、风格名等等
  • hmtx 水平布局 字体水平布局星系:上高、下高、行间距、最大前进宽度、最小左支撑、最小右支撑
  • kerm 字距调整表 字距调整对的数组
  • post PostScript信息 所有图元的PostScript FontInfo目录项和PostScript名
  • PCLT PCL 5数据 HP PCL 5Printer Language 的字体信息:字体数、宽度、x高度、风格、记号集等等
  • OS/2 OS/2和Windows特有的规格 TrueType字体所需的规格集

其中,图元数据(glyf表)是TrueType字体的核心信息,因此通常它是最大的表。图元,全称为图形输出原语,也就是字体的图形数据。一个图元对应这个一个字体,一个图元有多条轮廓,一条轮廓有多个点。例如:一个字体文件中有字符“0”,那么“0”就对应一个图元,“0”的图元有两条轮廓线,一条是内部的轮廓,另一条是外部的轮廓。,外圈有21个点控制,内圈有11个点控制。这些点控制这轮廓的形状,但不是组成。因为TureType字体中的图元轮廓是用二阶Bezier曲线定义的,有三个点:一个曲线上的点,一个曲线外的点和另一个曲线上的点。多个连续的不在曲线上的点是允许的,但不是用来定义三阶或更高阶的Bezier曲线,而是为了减少控制点的数目。比如,对于on-off-off-on模式的四个点,会加入一个隐含的点使之成为on-off-on-off-on,因此定义的是两段二阶Bezier曲线。如下图,会发现“0”外圈上会超过21个点,内圈上会超过11个。
在这里插入图片描述

fontTools 字体文件解析库

fontTools是python语言编写的字体文件解析程序。上面“ttf文件解析.doc”中使用C语言描述ttf文件内部表的结构如图元头部信息表:

typedef   struct   
{
WORD   numberOfContours;   //contor   number,negative   if   composite  图元轮廓线数量
FWord   xMin;       //Minimum   x   for   coordinate   data. // 图元位置x轴最小值
FWord   yMin;       //Minimum   y   for   coordinate   data. // 图元坐标y轴最小值
FWord   xMax;       //Maximum   x   for   coordinate   data. // 图元坐标x轴最大值
FWord   yMax;       //Maximum   y   for   coordinate   data. // 图元坐标y轴最大值
}GlyphHeader;

使用fontTools工具包会更方便,fontTools可以把字体文件中的表结构及数据以xml的格式保存到文件中。

from fontTools.ttLib import TTFont

#  ttfFile是ttf文件的路径或ttf文件流
font = TTFont(ttfFile)

# path可以是保存xml文件的路径或io流,tables参数指定保存的表,为空则保存全部表。
# keys方法可以查看所有表名['GlyphOrder', 'head', 'hhea', 'maxp', 'OS/2', 'hmtx', 'cmap', 'loca', 'glyf', 'name', 'post', 'GSUB']
font.saveXML(path, tables=['glyf'])

字符“0”以xml格式描述上面C语言结构体为:

<TTGlyph name="uniE575" xMin="0" yMin="-12" xMax="508" yMax="719"></TTGlyph>

fontTools.ttLib.TTFont.getBestCmp方法可以输出字符序列与图元名称之间的映射关系
在这里插入图片描述
因为fontTools会把数据转存为xml,所以我们需要解析xml

xml.dom.minidom xml代码解析库

python提供的xml代码解析库有很多,这里只是随便使用其中的一种

from xml.dom.minidom import parseString
doc = parseString(io.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值