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

时间:2019-07-15 12:21:48

标签: pdf accessibility pdfbox tagging pdf-manipulation

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

作为一个人类,我可以通过比较字形在pdf中的位置和内容流的位置来计算(无论是替换最后的Td还是添加最后的Td或用fontsize乘以fontsize)标记的位置。价值观。但是我无法以编程方式计算字形的完美位置。请查看屏幕简短内容。

在上图中,左侧框是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)

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

有什么帮助吗? 谢谢。 enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

  

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

这非常简单,对于您始终相乘的 Td 操作,请参见规范ISO 32000-1(与ISO 32000-2类似):

excerpt from ISO 32000-1

对于刚初始化的(即身份)文本行矩阵T lm ,此矩阵乘法看起来像是 t x替换其底行 t y 1

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

对于文本行矩阵T lm ,如您的第二个示例

a 0 0
0 a 0
x y 1

此矩阵乘法看起来像 a 的乘法,然后是最底行的加法,即 xy 1 变为 x + a·t x y + a·t y 1 。如果前面的 Tf 操作的 font size 参数为 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

excerpt from ISO 32000-1

由于在文本对象的开头重置了文本矩阵和文本行矩阵,并且无法在文本对象中保存或恢复图形状态,因此在这种情况下,不应该负责保存和恢复图形状态操作。

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

答案 1 :(得分:0)

当你说:

  

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

实际上,位置Current_x_posCurrent_x_pos不会被替换。此Td命令的作用与往常一样:

Current_x_pos = x1 + 231.544
Curent_y_pos = y1 - 366.377990

在使用Q保存当前图形状态之后,正是从上方3行的q重新加载了先前的图形状态。