4

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

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

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

在第一圈

3.321 -6.475999832 时差

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

Current_x_pos = x1+3.321

当前_y_pos = y1-6.475999832

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

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

Current_x_pos = 231.544

当前_y_pos = 366.377990

除此之外,有时父标签是 Tm 在这种情况下,公式可能是这样的

Current_x_pos = x1+(tdx1*font_size)

当前_y_pos = y1+(tdy1*font_size)

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

有什么帮助吗?谢谢。 在此处输入图像描述 在此处输入图像描述

4

2 回答 2

5

当我们需要像上面一样乘法时,有时还要加法。以编程方式我怎么能知道这一点。解析确切的位置?

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

摘自 ISO 32000-1

对于一个新初始化的(即恒等式)文本行矩阵 T lm这个矩阵乘法看起来像是用t x t y 1替换它的底行

对于文本行矩阵 T lm,仅在底行中针对单位进行更改,此矩阵乘法看起来像是底行的加法,例如xy 1变为x+t x y+t y 1

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

a 0 0
0 a 0
x y 1

这个矩阵乘法看起来像 a乘法,然后是底部 row 的加法,即xy 1变为x+a·t x y+a·t y 1。如果前面Tf操作的字体大小参数是1,那么a将有效地成为生成的字体大小,从而导致您假设字体大小是公式的一部分。

一般来说,对于任意的非退化文本行矩阵 T lm

a b 0
c d 0
x y 1

这个矩阵乘法看起来更复杂xy 1变成x+a·t x +c·t y y+b·t x +d·t y 1

因此,关于你的问题

以编程方式我怎么能知道这一点。解析确切的位置?

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


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

摘自 ISO 32000-1

由于文本矩阵和文本行矩阵在文本对象的开始处被重置,图形状态不能在文本对象中保存或恢复,因此在这种情况下不怪保存和恢复图形状态操作。

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

于 2019-07-15T14:31:36.180 回答
1

当你说:

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

实际上,职位Current_x_posCurrent_x_pos没有被取代。这个Td命令和往常一样:

Current_x_pos = x1 + 231.544
Curent_y_pos = y1 - 366.377990

上面的Qfrom 3 行重新加载了先前的图形状态,在当前图形状态已保存后立即使用q.

于 2019-07-15T13:22:33.347 回答