了解PDF运算符 – 适用于iOS应用

我的任务是为我们公司创建一个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阅读器应用程序必须包含搜索和突出显示function,文本选择,注释,书签等。几乎所有基本的东西,你现在几乎每个读者都可以找到。 我可能会使用第三方库来使我的生活更轻松,但我最大的问题是文本选择function。 所以我真的需要了解这一点。

您需要熟悉PDF规范 ,附录A包含所有操作员的摘要,其中包含有关参数的更详细文档的链接,因此这可能是一个很好的起点。

Tm运算符不一定设置每一行的起始点,它通常设置文本矩阵,这基本上相当于Quartz2D的CGAffineTransform 。 要移动到下一行,文档也可以使用TdTD"T*运算符.PDF文档不一定按照屏幕上显示的顺序绘制文本,它们可以在页面上自由移动和位置他们认为合适的任何顺序的字形.PDF并不真正具有“线”的概念,你必须自己从字形的位置推断出这些(对于像下标/上标这样的事情可能很棘手)。

嗯……那时你已经完成了一项非常重要的工作。 您应该告诉他们,PDF-1.7规范是一个大约800页的密集文档……

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

您需要注意的前几件事:

  • PDF建立在与PostScript相同的图形模型上。 (但PostScript是一种图灵完备的编程语言,而PDF则是故意的! – 剥离了所有编程语言function。)
  • 与PostScript一样,PDF图形描述“语言”使用堆栈 ,它使用倒置的“波兰表示法”表达式:运算符排在最后,运算符的参数首先出现。 要表达“1 + 2”,你在PostScript中写下“1 2 add”
  • PDF几乎不是“基于行”。 所以关于你关于Tm的问题:它不是新行的起点,它是表达式的结尾1 0 0 1 100 100说: “前6个数字表示文本行矩阵的设置,现在是设置为命名值“Tm宁愿是一条线的终点 ,而不是一条线的开头!