我的任务是为我们公司创建一个 pdf 阅读器应用程序。经过一些研究后,我对 PDF 中的不同运算符感到困惑。以下是我想澄清的一些事情:
Tm
运算符用作每条线的起点。 (我的理解正确吗?)如果
Tm
运算符是每行的起点,我如何解析指定Tm
内显示的only文本?例如:
BT
0 0 1 rg
/Ti 12 Tf
1 0 0 1 100 100 Tm
0 0 Td
(The quick brown fox ) Tj 0 −13 Td
(ate the lazy mouse.) Tj
ET
//I only want to get the Tj and TJ string being positioned by the Tm
我知道字形的每 1000 个单位的高度和宽度相当于 1 个单位的文本空间。那么,如果字形宽度为 2000,高度为 1060,这是否意味着它的“真实”宽度和高度分别为 2 和 1.06?
现在我知道其中一些问题听起来非常愚蠢,但我真的没有太多时间去研究。因此,如果有人可以帮助我理解这一点,我将不胜感激。
注意:pdf阅读器应用程序必须包含搜索和突出显示功能、文本选择、注释、书签等。实际上,您可以在当今几乎所有阅读器中找到所有基本内容。我可能会使用第三方库来让我的生活更轻松,但我最大的问题是文本选择功能。所以我真的需要了解这一点。
您需要熟悉 PDF 规范,附件 A 包含所有运算符的摘要,以及有关参数的更详细文档的链接,因此这可能是一个很好的起点。
Tm
操作符不一定设置每行的起点,它一般设置文本矩阵,基本上相当于Quartz2D中的CGAffineTransform
。要移动到下一行,文档还可以使用 Td
、TD
、"
或 T*
运算符。 PDF 文档不一定按照屏幕上显示的顺序绘制文本,它们可以在页面上自由移动并按照它们认为合适的任何顺序放置字形。 PDF 并没有真正的“线”概念,您必须自己从字形的位置推断出这些概念(这对于下标/上标等内容可能很棘手)。
嗯...那么您的任务就非常重要了。您应该告诉他们 PDF-1.7 规范是一份大约 800 页的密集文档...
是的,为此使用第三方库是一个非常好的主意。一个人不可能实现一个合格的 PDF 阅读器,可以真实地显示所有可能嵌入 PDF-1.7(ISO 规范)文件中的图形对象、字体、颜色、透明度、矢量图形、图像......。
您首先需要注意的几件事:
Tm
的问题:它不是新行的起点,而是表达式 1 0 0 1 100 100
的结尾,表示:“前 6 个数字表示文本行矩阵的设置,目前是这样设置为指定值”。 Tm
宁愿是一行的结束,而不是一行的开始!