首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析postscript文件

解析postscript文件
EN

Stack Overflow用户
提问于 2014-08-17 02:35:00
回答 1查看 3K关注 0票数 2

我正在将PDFMiner (开放源码PDF到用python编写的文本程序)转换为objective。有些字体中有一个postscript文件,其中包含字符名和编码值。例如:

代码语言:javascript
复制
/Encoding 256 array
0 1 255 {1 index exch /.notdef put} for
dup 65 /A put
dup 67 /C put
dup 70 /F put
dup 45 /hyphen put

实际上,我不知道上面的代码是干什么的。我猜这会把那对放在字典里。我一点也不确定dup做了什么。上面的代码对我来说意味着,如果我在PDF中看到一个45,然后我会查找它并将它转换成连字符,或者如果我看到一个70,然后我把它转换成一个F等等。

我正在复制的代码使用一个完整的Postscript令牌程序来解析postscript文件中的所有put命令。对于每个put命令,它创建一个具有对应put操作数的键值对的字典。

我的问题是,我真的需要构建一个完整的Postscript令牌程序来解析这些东西吗?

一个简单得多的替代方法是扫描字符串“put”的每一个出现情况,然后查看前面的两个单词。如果前面的两个单词是一个数字,后面跟着一个/x,那么我假设这就是我想要的,否则忽略它。

我一点也不懂postscript,但我想任何人都可以告诉我,我的更简单的替代方案是否有任何会把事情搞砸的角落案例。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-17 09:10:10

冗长的解释,跳到结尾,为简短的答案。

PostScript是一种基于堆栈的编程语言(有点类似于Forth),'dup‘是一个操作符,它复制操作数堆栈上的顶级对象。

在本例中,它创建一个由256个元素组成的数组,在数组的每个位置使用名称/.notdef填充数组,然后用其他名称替换特定数组索引上的名称(dup重复数组,put使用操作数,包括数组副本)。上面没有显示,但是稍后该数组将与名称/Encoding相关联,键值对存储在字典中,在本例中包含一个字体。

绘制字符代码时,解释器将查找字体字典并检索与键/Encoding关联的对象。然后,它将字符代码用作该数组中的索引,并检索在该数组中找到的对象。然后,解释器从字体中检索CharStrings字典,并使用从编码数组中提取的对象作为CharStrings字典中的键。然后进一步使用与该键关联的对象。在类型为1/2/3的字体中,该对象是用于绘制字形的字形程序。在类型为42的字体中,该对象是一个整数,然后作为GID从字体字典中的/sfnts数组的GLYF表中检索字形程序。

现在首先要注意的是,PostScript是一种编程语言。与上面简单的数组设置不同,我可以编写一个PostScript例程,它接受字体字典、名称和索引,并将其插入到该字体的编码数组中。所以一种简单的扫描模式的方法是行不通的,因为我的程序不是这样做的。

此外,“put”运算符在PostScript编程中被广泛使用,因此简单地搜索“put”是不够的。

所有这些都是一种长篇大论的说法:如果您想使用PostScript程序,您将需要一个完整的PostScript解释器(令牌是不够的,您需要一个完整的解释器)。

现在,关于您的具体情况,您的想法将适用于PostScript类型1字体(除上述警告外),因为这些字体通常格式良好,遵循一些简单的指导原则,并且在某种程度上适用于类型3的PDF字体,但它不适用于TrueType字体或CIDFonts,而且实际上不适用于上述任何一个子集。(它也不适用于CFF字体,因为它们是二进制编码的,而不是PostScript)

您应该首先检查字体是否有关联的ToUnicode CMap,如果有,您非常幸运,请使用它!这将把字符代码映射到Unicode代码点,完成工作。

在没有ToUnicode CMap的情况下,您无法保证可以提取文本,这可能是完全不可能的。如果您使用的是TrueType字体,您可以逆向工程编码并提取字符代码->GID映射,然后您可以查找TrueType字体的CMAP表,并查看它是否具有Unicode (大多数情况下),在这种情况下,您可以使用它。

如果所有这些都失败了,您可以检查字体在字体对象中是否有标准编码,这些都列在PDF引用中。

所以这告诉你,字体程序中的编码对你没有多大用处。如果没有应用其他编码,则为字体的默认顺序。PDF文件总是应用自己的编码(它是字体对象中必需的条目)。因此,实际PostScript字体中的编码对您没有什么用处,它会被PDF文件中的条目覆盖。因此,您根本不需要解释字体,类型1,2或3字体。

只有当上述所有内容都失败时,才能开始查看编码中的名称( PDF文件中的编码,而不是字体!)。您需要意识到,仅仅因为有人在编码中添加了一个名称,并不意味着这是由字形程序绘制的实际字形.

对于CIDFonts,如果它没有ToUnicode CMap,您可能会陷入困境,但您可以查看CIDSystemInfo,以获得注册表和排序方面的线索。

这一切都取决于您想要多彻底,实际上您希望得到的程序执行得有多好,同时要记住,如果不使用OCR解决方案,就不可能达到100%的准确性。

总之,简短的回答是‘你不需要那样做,戴夫’。字体程序中的编码毫无用处,因为它被PDF文件中的编码所覆盖。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25345842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档