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

问题描述 投票:1回答:1

我浏览了包含图形元素的不同pdf的内容流。Somepdf包含用于图形的常规CTM文本坐标系。像下面enter image description here在这里,我可以将CTM位置与页面坐标进行比较。

但是我在此pdf中发现了一些奇怪的东西(x和y转换数以千计,我的页面坐标为576、720。如何与页面坐标进行比较?)。您可以在enter image description here下看到。在这种情况下,CTM是如何计算的。

而且我看到了in规则,例如”符合PDF内容流的读取器或写入器可能会将图形状态运算符的排列方式更改为能够为每个图形对象实现相关图形状态参数的相同值的任何其他排列方式。”

[任何人都可以解释其他这样的情况,其中图形解析的行为是这样的,需要采取什么考虑来以一般方式进行处理?

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

java pdf pdfbox
1个回答
0
投票

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

本质上只有一种方法,即PDF规范所隐含的方法:读取内容流时,根据发现的指令的效果更新当前转换矩阵(CTM)。

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

初始值

在开始时,CTM将默认用户空间映射到设备空间。因为我们对默认用户空间本身中的坐标感兴趣,所以对我们来说这些空间是重合的,因此我们从单位矩阵开始。此外,还没有保存的图形状态,因此在保存状态中还没有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 ..)等

© www.soinside.com 2019 - 2024. All rights reserved.