我的任务是为我们公司创建一个pdf阅读器应用程序。经过一些研究后,我对PDF中的不同操作符感到困惑。以下是我想澄清的一些事项:
Tm
运算符用作每行的起点。 (我的理解是否正确?)如果Tm
运算符是每行的起点,我该如何解析指定Tm
内仅显示 的文本? e.g:
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阅读器应用程序必须包含搜索和突出显示功能,文本选择,备注,书签等。实际上,您现在几乎所有阅读器中都可以找到所有基本内容。我可能会使用第三方库来使我的生活更轻松,但我最大的问题是文本选择功能。所以我真的需要理解这一点。
答案 0 :(得分:7)
您需要熟悉PDF specification,附件A包含所有运算符的摘要,其中包含有关参数的更详细文档的链接,因此这可能是一个很好的起点。
Tm
运算符不一定设置每一行的起点,它通常设置文本矩阵,基本上相当于Quartz2D的CGAffineTransform
。要移至下一行,文档还可以使用Td
,TD
,"
或T*
运算符。 PDF文档不一定按照屏幕上显示的顺序绘制文本,它们可以自由地在页面上移动并按照他们认为合适的任何顺序定位字形。 PDF并不真正具有“线”的概念,你必须自己从字形的位置推断出这些(对于像下标/上标这样的事情,这可能很棘手)。
答案 1 :(得分:5)
嗯......那时你已经完成了一项非常重要的工作。您应该告诉他们,PDF-1.7规范是一份大约800页的密集文档......
是的,为此使用第三方库是个好主意。单个人不可能实现符合要求的PDF阅读器,该阅读器可以真实地显示可能嵌入PDF-1.7(ISO规范)文件中的所有图形对象,字体,颜色,透明度,矢量图形,图像....
您需要注意的第一件事:
Tm
的问题:它不是新行的起点,它是表达式1 0 0 1 100 100
的结尾说:“前6个数字表示文本行矩阵的设置,它现在设置为命名值“。 Tm
宁可是一行的 结束 ,而不是一行的开头!