2

我的任务是为我们公司创建一个 pdf 阅读器应用程序。经过一些研究,我对 PDF 中的不同运算符感到困惑。以下是我想澄清的几件事:

  • 运算符用作每条线的Tm起点。(我的理解正确吗?)
  • 如果Tm运算符是每一行的起点,我如何解析在指定范围内显示的文本Tm?例如:

     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 阅读器应用程序必须包含搜索和突出显示功能、文本选择、注释、书签等。几乎可以在当今几乎所有可用的阅读器中找到所有基本内容。我可能会为此使用第三方库来让我的生活更轻松,但我最大的问题是文本选择功能。所以我真的需要明白这一点。

4

2 回答 2

7

您需要熟悉PDF 规范,附件 A 包含所有运算符的摘要,以及指向有关参数的更详细文档的链接,因此这可能是一个很好的起点。

Tm算子不一定要设置每一行的起点,一般是设置文本矩阵,就Quartz2D而言基本相当于a CGAffineTransform。要移动到下一行,文档还可以使用、Td或运算符。PDF 文档不一定按照屏幕上显示的顺序绘制文本,它们可以在页面上自由移动,并以它们认为合适的任何顺序放置字形。PDF 并没有真正的“线”概念,您必须自己从字形的位置推断出那些(这对于下标/上标之类的东西可能很棘手)。TD"T*

于 2012-06-29T09:28:28.870 回答
5

嗯……那么,你的任务是一项非常重要的工作。你应该告诉你的他们 PDF-1.7 规范是一个大约 800 页的密集文档......

是的,为此使用第三方库是一个非常好的主意。一个人不可能实现一个符合标准的 PDF 阅读器,它可以真实地显示所有可能嵌入在 PDF-1.7(ISO 规范)文件中的图形对象、字体、颜色、透明度、矢量图形、图像......。

您需要注意的前几件事:

  • PDF 建立在与 PostScript 相同的图形模型上。(但 PostScript 是一种图灵完备的编程语言,而 PDF 已经——故意!——剥夺了所有编程语言的能力。)
  • 与 PostScript 一样,PDF 图形描述“语言”使用堆栈,并且它使用倒置的“波兰符号”来表示表达式:运算符在最后,运算符的参数在前。要表达“1 + 2”,您可以在 PostScript 中写成“1 2 add” 。
  • PDF 几乎不是“基于行的”。因此,关于您的问题Tm:它不是新行的起点,而是表达式的结尾1 0 0 1 100 100“前 6 个数字表示文本行矩阵的设置,现在设置为命名值”Tm宁愿成为一行的结尾,也不愿成为一行的开始!
于 2012-06-29T15:56:10.143 回答