具体实施方式
为解决上述现有技术存在的问题,本发明实施例提供了一种向PDF文件内嵌单字节字体的方法及其系统,使在解析待内嵌字体的PDF文件的同时,直接生成目标PDF文件(即内嵌了字体的PDF文件),在生成目标文件的过程中内嵌单字节字体的字形描述。与现有技术相比,由于避免了中间格式的使用,从而能更好地保证目标文件的正确性,提高内嵌操作的效率。
下面结合附图对本发明实施例进行详细描述。
对于一个作为输入的待内嵌字体的原始PDF文件(以下称原始文件),为了在其基础上生成一个作为输出的、内嵌字体的PDF文件(以下称目标文件),在本发明实施例中,根据如图1所示的步骤生成目标文件:
步骤101、解析原始PDF文件,确定出该PDF文件所使用、但未嵌入到该PDF文件的字体,从中确定出待嵌入的单字节字体(如英文字体);根据确定出的待嵌入的单字节字体,获取待嵌入单字节字体的字体描述信息,其中可包括字体编码方式信息和字体名称;
步骤102、通过解析原始PDF文件的内容流,确定出该原始PDF文件中使用待嵌入单字节字体进行文字输出的所有字符,并根据这些字符所属的字体类型和编码方式,将字符经编码映射得到这些字符对应的标识(如字符名字或字形标识),并从待嵌入单字节字体的字体文件中获取与这些字符的标识对应的字形描述信息;
步骤103、将到的字形描述信息组织成符合PDF文件规范的字体程序(font program)数据流,将该字体程序数据流与获取到的字体描述对象作为内嵌到PDF文件中的字体文件数据,从而生成目标PDF文件。
上述流程中,确定出的待嵌入的单字节字体,可以是该原始PDF文件所使用但未内嵌的所有单字节字体,或是其中的一部分单字节字体。上述流程可通过相应的软件系统实现。
下面通过图2,描述利用本发明实施例的软件系统,在PDF文件中嵌入该PDF文件所使用的、但未内嵌到该PDF文件中的所有单字节字体的详细流程。
为了方便实现本发明实施例,可使用如下集合作为实现该流程时用于存储中间数据的数据存储模块:
待嵌入字体集合:是一个包含所有待嵌入单字节字体的字体对象的简单集合。解析原始文件时,每发现一个待嵌入单字节字体(以字体对象的形式存在),就在集合中增加一条记录,不计重复(即对于同一个字体对象被使用多次的情况仅保存对应的一条记录);
待嵌入字体描述集合:是一个包含所有待嵌入单字节字体的字体描述对象的简单集合。不计重复(即对于同一个字体描述对象被引用多次的情况仅保存对应的一条记录;
待嵌入字符集合:是一个以字体对象为索引的、包含该字体在原始文件中被使用的所有字符的集合。在此集合中,字符以字符名字(CharacterName)或字形标识(Glyph ID)的形式被记录,不计重复(即对于同一个字符被使用多次的情况仅保存一条对应的记录)。
如图2所示,通过本发明实施例的软件系统,在PDF文件中嵌入单字节字体的过程,包括:
步骤201、解析原始文件,获取其使用的所有未内嵌的单字节字体的字体对象(Font对象),并将这些对象保存在待嵌入字体集合中。
通常,PDF中的Font对象是以PDF字典对象的形式存在于PDF文件,通过查找原始PDF文件的PDF字典对象可确定出该PDF文件所使用的但未内嵌的单字节字体。Font对象中包含字体名、编码方式或字体描述等有关字体的重要信息。
步骤202、对于待嵌入字体集合中的所有单字节字体的字体对象,查找其对应的字体描述对象(FontDescriptor),并将查找到的字体描述对象保存在待嵌入字体描述集合中。
通常,FontDescriptor对象以字典对象的形式存在于PDF文件。
步骤203、解析原始PDF文件中所有的内容流,对于其中所有涉及文字输出的指令,获取其使用的字体以及输出的字符的编码,对于其中使用了待嵌入的单字节字体的每个输出字符,根据其字体类型和编码方式,采用相应的方式获取这些字符的字符名字或字形标识,并将获取到的字符名字或字形标识保存到以字体描述为索引的待嵌入字符集合中。
该步骤中,对于Type1(CID)类型的字体,将字符经编码映射后得到字符名字(CharacterName);对于TrueType(CID)类型的字体,将字符经编码映射后得到字符名字,之后,再通过查询TrueType字体文件中的字形标识表得到对应的字符名字(Glyph)。编码映射的方法是通过查找编码映射表找到与字符编码对应的字符名字,编码映射表是每个字体描述对象包含的一个属性。
步骤204、构造字体程序数据流。如果待嵌入的单字节字体是Type1(CID)类型,则构造CFF字体程序数据流;如果待嵌入的单字节字体是TrueType(CID)类型,则构造TrueType(CID)字体程序数据流;如果待嵌入的单字节字体既包括Type1(CID)类型又包括TrueType(CID)类型,则构造CFF字体程序数据流和TrueType(CID)字体程序数据流。
步骤205、在待嵌入字体描述集合中,通过由字体描述构成的索引定位到其中的一个字体描述,读取该字体描述所对应的所有字符名字或字形标识,在字体文件中分别查找对应的字形描述信息,将查找到的字形描述信息写入对应的字体程序数据流。
该步骤中,如果当前字体描述所对应的字体是Type1(CID)类型,则执行以下步骤:
在待嵌入字符集合中,以当前字体描述作为索引,遍历其下的各字符名字(CharacterName),根据各字符名字(CharacterName)在Type1(CID)字体文件中查找对应的字形描述信息,如果字符名字中包含子字符名字,则还需要查找子字符名字对应的子字符的字形描述信息;然后将查找到的字形描述信息按照CFF字体程序规范存入之前构造的CFF数据流中;
如果当前字体描述对应的字体是TrueType(CID)类型,则执行以下步骤:
在待嵌入字符集合中,以当前字体描述作为索引,遍历其下的各字形标识(Glyph ID),根据各字形标识在TrueType(CID)字体文件中查找对应的字形描述信息,如果字形标识中包含子字符的字形标识,则还需要查找子字符的字形标识对应的子字符字形描述信息;然后,将获取到的字形描述信息按照TrueType(CID)字体程序规范存入之前构造的TrueType(CID)数据流中。
步骤206、针对待嵌入字符集合中的所有字体描述所对应的字符名字和字形标识,是否都已将对应的字形描述信息写入字体程序数据流,即,是否将待内嵌字符集合中的字符名字和字形标识所对应的字形描述信息都写入字体程7序数据流,若是,则执行步骤207;否则,返回步骤205。
步骤207、将字体程序数据流写入目标PDF文件,将待内嵌字体描述集合中所记录的字体描述对象按照PDF规范写入目标PDF文件。
其中,将Type1(CID)类型字体的字体描述对象,按照PDF规范中关于CFF字体内嵌的规范进行必要的修改后(主要是引用生成的CFF数据流),写入目标PDF文件;将TrueType(CID)类型字体的字体描述对象,按照PDF规范中关于TrueType(CID)字体内嵌的规范进行必要的修改后(主要是引用生成的TrueType(CID)数据流),写入目标PDF文件。
步骤208、遍历原始PDF文件中的对象,除了那些已经通过上述步骤写入目标PDF文件中的字体描述对象以外,将其它所有对象不做修改,存入目标PDF文件。
上述流程的步骤202中,获取到的待嵌入字体的字体描述信息可以选择性地包含该字体在原始PDF文件中使用过的字符的集合(如字符集的标识或名称等信息),以便在后续嵌入字体的过程中获取字形描述信息时,仅需根据相应字体文件中包含的该字符集合,从该字符集合中获取对应的字形描述信息写入目标PDF文件,这样,在内嵌字体时只内嵌字体的一个最小化子集,该子集只包含字体中被原始PDF文件使用过的字符,从而减小目标PDF文件的数据量。
基于相同的技术构思,本发明实施例还提供了能够实现向PDF文件内嵌单字节字体的系统,如图3所示,该系统包括:字体描述信息确定模块301、字形描述信息获取模块302,以及PDF文件生成模块303;其中,
字体描述信息确定模块301,用于确定出待内嵌字体的PDF文件所使用的但未嵌入到该PDF文件中的单字节字体,以及所述单字节字体的字体描述信息;
字形描述信息获取模块302,用于确定出所述待内嵌字体的PDF文件中,使用所述单字节字体进行文字输出的所有字符及其字符名字或字形标识,根据所述单字节字体的字体文件获取与所述标识对应的字形描述信息;
PDF文件生成模块303,用于根据获取到的字体描述信息,以及获取到的字形描述信息,生成嵌入所述待嵌入单字节字体后的PDF文件。
上述的字体描述信息确定模块301可包括:
文件解析子模块3011,用于解析待内嵌字体的PDF文件;
待嵌入字体及其描述确定子模块3012,用于根据文件解析子模块3011解析出的PDF文件的PDF字典对象确定出该PDF文件所使用的但未内嵌的单字节字体,以及该单字节字体的字体描述信息。
上述字形描述信息获取模块302可包括:
内容流解析子模块3021,用于解析所述待嵌入字体的PDF文件的内容流,得到所有涉及文字输出的指令;
字符及其标识获取子模块3022,用于根据内容流解析子模块3021解析出的所述指令确定出使用所述待嵌入单字节字体进行文字输出的字符;以及,根据确定出的输出字符所属的字体类型和对应的编码方式,获取所述输出字符的字符名字或字形标识。如果输出字符所属的字体类型是Type1类型,则获取到的是字符名字,如果输出字符所属的字体类型是TrueType类型,则获取到的是字形标识,其根据字体类型以及进一步根据编码方式获取字符名字或字形标识的过程如前所述;
字形描述信息获取子模块3023,用于根据所述单字节字体的字体文件获取与所述标识对应的字形描述信息。
字形描述信息获取模块302还包括:字体文件加载子模块3024,用于根据待嵌入字体及其描述确定子模块3012确定出的单字节字体的字体描述信息,加载相应的字体文件。字形描述信息获取子模块3023获取字形描述信息时,从加载的字体文件中获取与所述标识对应的字形描述信息。
上述PDF文件生成模块303可包括:
字体程序数据流构造子模块3031,用于根据待嵌入的单字节字体所属的字体类型,构造对应的字体程序数据流;
字体程序数据流写入子模块3032,用于将获取到的字形描述信息存入对应的字体程序数据流;
PDF文件写入子模块3033,用于将保存有字形描述信息的字体程序数据流,以及待嵌入单字节字体的字体描述信息写入目标PDF文件,所述目标PDF文件为嵌入所述待嵌入单字节字体后的PDF文件。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。