计算 pdf 中(Td、TD、Tm、cm、T*)内容流的确切位置?

Calculating the exact positions of(Td, TD, Tm, cm, T*) content stream in pdf?

获取或计算 pdf 中(Td、TD、Tm、cm、T*)内容流的准确位置?

作为一个人,我能够通过比较计算(无论是替换最后一个 Td 还是添加到最后一个 Td 或与字体大小相乘)标签在 pdf 内容流中的位置,字形位于 pdf 和内容中流位置值。但我无法以编程方式计算字形的完美位置。请短看画面

在上图中,左侧框是 pdf ui 字形,右侧框包含相关内容流。在内容流中,我突出显示了两个 Td 位置。

第一圈

3.321 -6.475999832 Td

Td 位置应添加到最后的 Td 位置。假设 x1,y1。

Current_x_pos = x1+3.321

Curent_y_pos = y1-6.475999832

然后我们可以得到字形的确切位置"t"。

在第二个突出显示的圆圈中,新的 Td 位置 (231.544 366.377990 Td) 被完全替换为

Current_x_pos = 231.544

Curent_y_pos = 366.377990

有时父标签是 Tm 在这种情况下公式可能是这样的

Current_x_pos = x1+(tdx1*font_size)

Curent_y_pos = y1+(tdy1*font_size)

当我们需要像上面那样乘法,有时加法。以编程方式我怎么知道这一点。要解析精确位置?(为乘法添加了新屏幕短)

有什么帮助吗? 谢谢。

当你说:

In second highlighted circle the new Td positions (231.544 366.377990 Td) are completely replaced

实际上,位置Current_x_posCurrent_x_pos并没有被替换。这个 Td 命令与往常一样:

Current_x_pos = x1 + 231.544
Curent_y_pos = y1 - 366.377990

在用 q.

保存当前图形状态后,上面第 3 行的 Q 重新加载以前的图形状态

When we need to multiply like above, and some times addition. Programatically how can I know this. To parse exact positions?

这很简单,对于 Td 操作,您 总是 相乘,请参阅规范 ISO 32000-1(类似于 ISO 32000- 2):

对于刚初始化的(即身份)文本行矩阵 Tlm,这个矩阵乘法看起来像 用 [= 替换它的底行 44=]tx ty 1.

对于文本行矩阵 Tlm 仅在底行中针对标识进行更改,此矩阵乘法看起来像底行的 加法 ,例如x y 1 变为 x+tx y+ty 1.

对于第二个示例中的文本行矩阵 Tlm

a 0 0
0 a 0
x y 1

这个矩阵乘法看起来像 a 的乘法,然后是底行 的加法,即 x y 1 变成 x+a·tx y+a·ty 1 .如果前面的Tf操作的字体大小参数是1,那么a 实际上是最终的字体大小,使您假设字体大小是公式的一部分。

一般来说,对于任意的,non-degenerate文本行矩阵Tlm

a b 0
c d 0
x y 1

这个矩阵乘法看起来更复杂x y 1变成x+a·tx+c·tyy+b·tx+d·ty1.

因此,关于您的问题

Programatically how can I know this. To parse exact positions?

你的程序应该简单地总是使用矩阵乘法并忽略它在单独坐标级别上的样子。


使第二个带圆圈的指令看起来只是替换的原因在于,先前的文本行矩阵是单位矩阵。这不是由于 François 假设的 restore-state 操作,而是更简单的文本对象操作的开始 BT:

由于文本矩阵和文本行矩阵在文本对象的开头被重置,并且图形状态无法在文本对象中保存或恢复,因此保存和恢复图形状态操作不在此责备案件。

(屏幕截图来自 Adob​​e 共享的 ISO 32000-1 副本。)