查找pdf文本位置

查找pdf文本位置,pdf,text,position,Pdf,Text,Position,我正在努力计算pdf文本位置。我在网上读过,但没有成功。 我读过pdf参考资料,但它是UHMMM。 现在,我写一篇pdf,我会告诉你我的想法… /TT3 1 Tf 11.9951 0 0 12 71.94 420.9803 Tm //scale x=11.9951 scaley=12 x position=71.94 y position=420.9803 <0003>Tj /TT2 1 Tf 1.6657 -1.22 TD //x position=71.94+1

我正在努力计算pdf文本位置。我在网上读过,但没有成功。
我读过pdf参考资料,但它是UHMMM。
现在,我写一篇pdf,我会告诉你我的想法…

/TT3 1 Tf
11.9951 0 0 12 71.94 420.9803 Tm     //scale x=11.9951  scaley=12   x position=71.94 y position=420.9803
<0003>Tj
/TT2 1 Tf
1.6657 -1.22 TD   //x position=71.94+1.6657 y position=420.9803-1.22
-.0016 Tc
(2\))Tj   //x position=71.94+1.6657-0.0016 y position=420.9803-1.22
/TT6 1 Tf
.8203 0 TD   //x position=71.94+1.6657-0.0016+0.8203
0 Tc
( )Tj
/TT3 1 Tf
10.016 0 0 10.02 71.94 237.6803 Tm  //x position=71.94 y position=237.6803
<0003>Tj
/TT2 1 Tf
/TT3 1 Tf
11.9951 0 12 71.94 420.9803 Tm//刻度x=11.9951刻度y=12 x位置=71.94 y位置=420.9803
Tj
/TT2 1 Tf
1.6657-1.22 TD//x位置=71.94+1.6657 y位置=420.9803-1.22
-.0016 Tc
(2\)Tj//x位置=71.94+1.6657-0.0016 y位置=420.9803-1.22
/TT6 1 Tf
.8203 0 TD//x位置=71.94+1.6657-0.0016+0.8203
0 Tc
()Tj
/TT3 1 Tf
10.016 0 10.02 71.94 237.6803 Tm//x位置=71.94 y位置=237.6803
Tj
/TT2 1 Tf
我确信有些地方出了问题,因为使用这种方法无法正确重建序列。

非常感谢。

首先,您不应该单独跟踪多个标量,而应该跟踪整个当前文本矩阵和文本行矩阵

然后你从上下文中删除了这些说明。因此,我们必须假设之前没有相关指示

因此,我们从文本矩阵开始,文本行矩阵等于单位矩阵

/TT3 1 Tf
11.9951 0 0 12 71.94 420.9803 Tm
这将文本矩阵和文本行矩阵都设置为

11.9951  0       0
 0      12       0
71.94  420.9803  1
10.016    0        0
0        10.02     0
71.94   237.6803   1
然后

这会成倍增长

1       0    0
0       1    0
1.6657 -1.22 1
1       0    0
0       1    0
0.8203  0    1
从左侧到文本行矩阵,生成新的文本行矩阵(稍微四舍五入)

然后文本矩阵也设置为该值

(2\))Tj
这将使文本矩阵前进此字符串的宽度。因为我不知道TT2的度量,所以我无法说出结果文本矩阵。我甚至不知道TT2中的这个字符串是否代表一个或两个glyph。因此,我无法判断字符间距的应用频率

/TT6 1 Tf
.8203 0 TD
这会成倍增长

1       0    0
0       1    0
1.6657 -1.22 1
1       0    0
0       1    0
0.8203  0    1
从左侧到文本行矩阵,生成新的文本行矩阵(稍微四舍五入)

现在

这将使文本矩阵前进此字符串的宽度。由于我不知道TT6的度量标准,我无法说出结果文本矩阵

/TT3 1 Tf
10.016 0 0 10.02 71.94 237.6803 Tm
这将文本矩阵和文本行矩阵都设置为

11.9951  0       0
 0      12       0
71.94  420.9803  1
10.016    0        0
0        10.02     0
71.94   237.6803   1

在本例中,TT6只包含0x20空间,所以我只有这个宽度。所以,为了得到新的矩阵,我只需要将Tm?乘以1 0 0 1 0(0.278+Tc)0 1。这看起来很合理。关于这一点,我有一个字体,TT2,其中宽度是一个数组,它写的第一个字符=41,最后一个字符=130,在pdf中,我没有这方面的Cmap,所以我不知道字符编号41是什么。我假设41代表ascii 41,但位置不对应。你知道如何找到这个吗?谢谢。从内容流中的字符串对象可以读取字节。使用这些字节值作为索引。不需要转换。@doxdici我的回答对你有帮助吗?还有什么悬而未决的问题吗?如果有,没有,你可以考虑(点击左上方的记号)
10.016    0        0
0        10.02     0
71.94   237.6803   1