了解pdf中的图形(变换矩阵cm)坐标(图形的解析位置)系统?

Understanding graphics (Transformation matrix cm)coordinate(parsing positions of graphics) system in pdf?

我查看了包含图形元素的不同 pdf 的内容流。 Some pdf 包含用于图形的正常 CTM 文本坐标系。像下面一样 这里的 CTM 位置我可以与我的页面坐标进行比较。

但是我在这个pdf(the x and y transisitions are in thousands and my page coordinates are 576, 720. How I can compare with page coordinates? ). You can see below 中发现了一些奇怪的地方。在这种情况下,CTM 是如何计算的。

我看到 in 规则,例如 "A conforming reader or writer of a PDF content stream may change an arrangement of graphics state operators to any other arrangement that achieves the same values of the relevant graphics state parameters for each graphics object."

任何人都可以解释其他类似的图形解析行为的情况以及需要考虑哪些因素才能以通用方式处理它吗?

请解释所有解析可用图形坐标的方法。

Please explain all ways of parsing available graphics coordinates.

基本上只有一种方法可以做到这一点,即 PDF 规范所暗示的方法:读取内容流时,根据您找到的说明的效果。

让我们看看您的第二个内容流。

初始值

开始时,CTM 将默认用户 space 映射到设备 space。由于我们对默认用户 space 本身的坐标感兴趣,因此对我们来说这些 space 是重合的,我们从单位矩阵开始。此外,没有保存的图形状态,因此保存状态中还没有 CTM 值:

1 0 0        |
0 1 0        |
0 0 1        |

(0) q

第一条指令q保存当前图形状态;因此,我们现在在图形堆栈上有一个 CTM 的副本:

1 0 0        |    1 0 0
0 1 0        |    0 1 0
0 0 1        |    0 0 1

(1) .1 0 0 .1 0 0 cm

下一条指令.1 0 0 .1 0 0 cm从左边乘以CTM:

.1 0  0     1 0 0     .1 0  0
0  .1 0  *  0 1 0  =  0  .1 0
0  0  1     0 0 1     0  0  1

因此,我们有

.1 0  0        |    1 0 0
0  .1 0        |    0 1 0
0  0  1        |    0 0 1

(2..6) ... re W n ... rg ... gs

这些指令不会更改 CTM 或状态堆栈。

(7) q

下一条指令q保存当前图形状态;因此

.1 0  0        |    1 0 0    .1 0  0
0  .1 0        |    0 1 0    0  .1 0
0  0  1        |    0 0 1    0  0  1

(我把栈顶画在右边。)

(8) 1 0 0 1 3398 2608 cm

(为了简洁起见,我截断了一些值。)

下一条指令1 0 0 1 3398 2608 cm从左边乘以CTM:

   1    0 0     .1 0  0        .1   0   0
   0    1 0  *  0  .1 0  =    0      .1 0
3398 2606 1     0  0  1     339.8 260.6 1

因此,我们现在有

   .1   0   0        |    1 0 0    .1 0  0
  0      .1 0        |    0 1 0    0  .1 0
339.8 260.6 1        |    0 0 1    0  0  1

这是您不确定的第一条指令,因为它的值以千为单位。但是,在评估之后,您会看到原点被推到相当正常的值 339.8 260.6.

(9..13) ... m ... l ... l h f*

这些指令不会更改 CTM 或状态堆栈。

(14) Q

下一条指令Q恢复最近保存的图形状态。因此,我们有

.1 0  0        |    1 0 0
0  .1 0        |    0 1 0
0  0  1        |    0 0 1

(15..17) ... RG ... w ... M

这些指令不会更改 CTM 或状态堆栈。

(18) q

下一条指令q保存当前图形状态;因此

.1 0  0        |    1 0 0    .1 0  0
0  .1 0        |    0 1 0    0  .1 0
0  0  1        |    0 0 1    0  0  1

(19) 1 0 0 1 3607 2339 cm

(为了简洁起见,我截断了一些值。)

下一条指令1 0 0 1 3607 2339 cm从左边乘以CTM:

   1    0 0     .1 0  0        .1   0   0
   0    1 0  *  0  .1 0  =    0      .1 0
3607 2339 1     0  0  1     360.7 233.9 1

因此,我们现在有

   .1   0   0        |    1 0 0    .1 0  0
  0      .1 0        |    0 1 0    0  .1 0
360.7 233.9 1        |    0 0 1    0  0  1

这是您不确定的第二条指令,因为它的值以千为单位。但是,在评估之后,您再次看到原点被推到相当正常的值 360.7 233.9.

(20..) 等等