zttf: 解析TTF字体文件以支持Python PDF子集生成

需积分: 39 6 下载量 140 浏览量 更新于2024-12-06 收藏 20KB ZIP 举报
资源摘要信息:"zttf:Python TTF 文件解析器" 知识点概述: 1. zttf 是一款专门为解析 TrueType 字体文件(TTF)设计的 Python 库。 2. 此解析器的主要功能是读取字体文件,并提取相关信息,这对于生成字体子集以便用于 PDF 文档生成非常有帮助。 3. 此代码库针对 Python 3.4 版本进行了开发,尽管如此,它也可以在一定程度上与 Python 2 兼容,但需要进行额外的测试和开发工作以保证其兼容性和功能性。 4. 该工具支持简单的使用方法,例如:通过导入模块、创建 TTFile 实例、读取字体文件的有效性、获取字体的面(faces)信息等。 5. 解析器提供了多个方法和属性,用于获取字体文件的详细信息,例如家庭名称(family_name)和名称(name)。 详细知识点解析: - TrueType 字体文件(TTF):TTF 是一种用于电脑字体的文件格式,它包含了字体的形状和布局信息。TTF 文件格式广泛应用于各种操作系统中,因为其支持矢量字体,可进行无损缩放。 - 字体子集:在创建包含字体的文档(如 PDF)时,并不一定需要整个字体文件。字体子集是指从完整的字体文件中提取需要使用到的字符生成的一个较小的字体文件。这可以减小最终文档的体积,同时也保护了字体的版权。 - Python 3.4:Python 3.4 是 Python 编程语言的一个稳定版本,拥有许多新特性和改进。它与 Python 2 在语法和库方面存在一些差异,因此 Python 2 的代码可能无法直接在 Python 3.4 中运行,反之亦然。 - Python 2 兼容性:由于 Python 2 在一些场合仍然在使用,开发者可能会需要兼容这两个 Python 版本。这通常涉及到编写条件编译代码、使用兼容性库或额外的测试来确保代码在两个版本中都能正常工作。 - 模块导入:在 Python 中,模块是包含 Python 定义和语句的文件。通过使用 import 语句,可以导入模块并使用其中定义的函数、类或变量。 - 字体文件实例化:在 Python 中,实例化是指创建一个类的实例。在这里,通过 TTFile 类,我们可以创建 TTFile 类的实例,该实例代表了要解析的 TTF 字体文件。 - 字体信息获取:zttf 解析器可以提取字体文件中存储的多种信息,例如字体的名称、家庭名称、面信息等。这些信息对于进一步处理字体文件或在用户界面中显示字体属性非常有用。 - 面(faces):在 TrueType 字体中,一个字体文件可以包含多个字体样式,比如正常、粗体、斜体等。这些不同的样式被称为“面”。在 zttf 解析器中,可以通过 faces 属性来访问这些不同的面。 应用实例: 1. 通过 zttf 解析器,开发者可以轻松地编写脚本来解析 TTF 文件,并根据需要提取特定的字形数据。 2. 在创建电子文档时,可以通过生成字体子集来减少文件大小,提升加载速度,同时确保文档中的文字清晰可见。 3. 该解析器还支持字体版权保护,通过仅使用字体文件的部分字形来生成子集,避免了完整的字体文件的分发。 总结: zttf 解析器是一个强大的工具,为 Python 程序员提供了简单易用的方法来解析和处理 TTF 文件。它不仅支持字体信息的提取和字体子集的生成,还考虑到了不同 Python 版本的兼容性问题。对于那些需要在 PDF 文档或其他电子文档中嵌入字体的项目,zttf 解析器提供了一个高效的解决方案。
2018-03-01 上传
用python根据需求完成一个TXT解析器的简单开发 一 修改说明: 需求一: 一开始说要解析UECapabilityInfo 消息里的supportedBandCombination-r10 这个IE里的CA组合转化成易阅读的表现形式. 我以为一组CA组合就是一组: bandEUTRA-r10 ca-BandwidthClassUL-r10 ca-BandwidthClassDL-r10 supportedMIMO-CapabilityDL-r10 功能实现: 有效信息筛选:于是就用循环把UECapabilityInformation的数据里每一行作为一个元素放到list里面 然后用bandEUTRA-r10作为一组CA的识别信息、在筛选出同组ca-BandwidthClassUL-r10、ca-BandwidthClassDL-r10、supportedMIMO-CapabilityDL-r10的信息,添加保存到字符串中,然后再把字符串作为元素添加到list中去。最后遍历list的元素写入目标文件 需求二: 然后收到反馈CA组合的理解是错误的。一组CA组合应该是以大括号作为识别的,里面可能包含多组: bandEUTRA-r10: ca-BandwidthClassUL-r10 ca-BandwidthClassDL-r10 supportedMIMO-CapabilityDL-r10 CA组合识别原理:在查看UECapabilityInformation内的CA组合后 发现CA组合内第一个 bandEUTRA-r10因为比其他bandEUTRA-r10多了一层的CA组合的大括号,所以如果给每一行增加索引的话就会发现除了第一个bandEUTRA-r10,其他bandEUTRA-r10到上一个supportedMIMO-CapabilityDL-r10的距离都是一样的,为了减少复杂度,我删除了所有’{’,这样所有除了所有CA组合第一个bandEUTRA-r10往上第四行是’}’其他bandEUTRA-r10的往上第四行都是supportedMIMO-CapabilityDL-r10 功能实现: 添加索引:便利时用了for enumerate()循环,这样便利时可以在循环时,自动为每个元素生成索引 CA组合识别:在识别到bandEUTRA-r10时,增加一个判断if datalist1[index-4].startswith(),如果bandEUTRA-r10的往上第四行是supportedMIMO-CapabilityDL-r10说明同组CA未结束,把筛选的有效信息强制类型转换后添加在上个元素末尾,反之则说明是个新的CA组合,往列表里添加一个新的元素。 需求三: 之后收到反馈CA组合虽然识别了,但是排序不行,需要按照CA组合支持的band进行排序 功能实现: 排序:于是我在识别完CA组合后,增加了一个循环和count(),用CA组合里的’-’给它们归类 比如1AA,11A,21AA是一类;1A-1A,2A-1AA,3A-1A是一类 在用一个中间变量保存开头的band的数字,一个类中把开头支持band的数字字母相同的CA组合归为一行 比如1A-21A,1A-22A一类1AA-2AA 1AA-3AA为一类 需求四: 之后收到反馈,CA组合分类不能只按照开头比较分类,不然一但数据多了会对查阅带来极大不便,应该按照每组CA组合中bandEUTRA-r10的值进行判断,比如1AA-2AA,1A-2AA和1AA-2A应该归在同一行 实现原理:首先我想的是按位比较数字,但是因为字母的数量不稳定,数字的位置不一定对应,然后我就想把数字全部提取出来作为索引,在相应的索引后面添加同组元素,用dict来实现排序。难点就在于从字符串中提取数字。后来在python的正则表达式中找到相关的处理函数compile()(设置匹配对象类型)和findall()(找到所有匹配对象并以list返回)。 功能实现: 第二次排序:在上次的排序中我保留了分类和从小到大的排序。方便提取索引时,索引也是从小到大。每遍历一个元素(CA组合有效信息),就compile()和findall(),从该元素中提取数字组合(在compile()的参数中添加()就能够使提取的内容成为一组数据),然后通过dict自带函数setdefault()添加索引,并可以设置索引值为list类型(dict类型的索引的值不可变,但如果类型为list,list的内容可以进行改动),避免重复索引,在本次遍历中完成将元素添加到索引值对应的list中去 需求五: 之后对程序进行测试,在测试test2时发现layers增加了fourlayers类型后,用来代表layers的数字2和4会影响分类结果。比如1AA(2)-1AA(2)和1A(4)-1A(2)会被归为两类。 test1:当CA组合的格式为xx-xx-xx-xx-xx(最长可识别为五位元素的组合,再长就需要修改代码) test2:当CA组合包含fourLayers test3:当CA组合缺失某种格式比如xx-xx时发现layers增加了fourlayers 功能实现: : 解除layers对排序的影响:用II 和 IV替代2,4来表示layers,测试后不影响阅读与分类 二、整体程序架构: 1.通过循环和自带的startswith()先将每组CA组合的有效信息识别 2.通过sorted()函数将所有CA组合从小到大排列 3.通过count()函数将所有CA组合根据格式不同分类 4.通过循环和正则表达式的split()对所有CAlist数据进行处理(用split处理只是防止出现不必要的错误) 5.通过循环和正则表达式compile()和findall()识别所有CA组合中数字,并将同一组合中的数字合为一个元素(在同一循环,用这个数字的元素作为一个dict的索引),用dict自带的setdefault()进行Key的添加顺便设置Key的值为list,避免Key重复,在用append把当前Key的字符串,添加到Key对应值的list中去 6.最后对dict整体遍历,将每一个Key的值输出到文本中去。