关于pdfbox:CTM矩阵乘法与以前的状态与PDF位置解析中的单位矩阵?

CTM matrix multiplication with previous state vs with Identity matrix in PDF position parsing?

我在 CTM 矩阵计算上经历了不同的解决方案(其中一些是这个和这个)。

我对内容流的了解是,当遇到 "q " 时,我们需要将单位矩阵推入 graphics_stack 并与下一个位置运算符 (cm , Tm, Td, TD) CTM 保持相乘。当遇到"Q"时,我们需要弹出最后一个矩阵。

当"BT"在position_stack中遇到单位矩阵push时的文本定位解析,并保持与下一个位置operator(cm , Tm, Td, TD) CTM相乘。当遇到"ET"时,我们需要弹出最后一个矩阵。

这里有时我们需要乘以最后一个 CTM 矩阵,有时只需乘以单位矩阵。当这些情况发生时?

案例 1:

enter

如图 1 和图 2 所示,只是将新矩阵从 Td 替换为 Tm。从 2 到 3,它又是最后一个 CTM 乘法。我是怎么知道的?(从视觉上我可以看出来)

情况 2:

enter

1
2
3
4
5
6
7
8
9
BT
TT_1 20 Tf
35.56 150.24533 Td _______________ 1
(some sample text) Tj
50.526 250.36 Td  ________________ 2
(second line new replace) Tj
0 -16.2 Td   _____________________ 3
(Line end.) Tj
ET

这种情况1和2只是替换,2和3之前的矩阵乘法。我怎么知道?

案例 4:

></p>
<p>请至少解析这些位置到10。这个pdf的源文件</p>
<p>案例 5:</p>
<p><img src=

case6:

页面(pdf)旋转到90度或180度或270度和315度时计算有什么变化?

这些是我看到的一些案例。我还能遇到什么情况,解决这个问题的通用方法是什么?


感兴趣的运营商

首先,我觉得你混淆了两个不同的方面。您拥有当前的转换矩阵 (CTM),并且拥有文本和文本行矩阵。 CTM 受 cm、q 和 Q 的影响。文本和文本行矩阵受 BT、Tm、Td、... 确定绘制文本的确切位置和方向,您需要文本矩阵和 CTM 的乘积在绘制文本时。

PDF 规范 ISO 32000 第 1 或 2 部分中描述了这些运算符如何更改矩阵。

来自 ISO 32000-1 表 57 a€" Graphics State Operators a€"

  • cm:通过连接指定矩阵来修改当前变换矩阵(CTM)
  • q:保存当前图形状态,包括图形状态堆栈上的 CTM
  • 问:通过从堆栈中删除最近保存的状态并使其成为当前状态来恢复包括 CTM 在内的图形状态

来自 ISO 32000-1 表 107 a€"文本对象操作符 a€"

  • BT:开始一个文本对象,将文本矩阵 Tm 和文本行矩阵 Tlm 初始化为单位矩阵。

来自 ISO 32000-1 表 108 a€"文本定位运算符 a€"

  • tx ty Td:移动到下一行的开头,从当前行的开头偏移(tx, ty)。更准确地说,这个操作符应该执行这些赋值:

    ></p>
</li>
<li>
<p>a b c d e f Tm:设置文本矩阵,T<sub>m</sub>,和文本行矩阵,T<sub>lm</sub>:</p>
<p><img src=m 和 Tlm 进行操作。

    来自 ISO 32000-1 第 9.4.4 节 a€"Text Space Details a€"

    每当绘制一个字形时,它从文本空间的整个转换都可以由文本渲染矩阵 Trm 表示:

    ></p>
<p>其中T<sub>fs</sub>是当前字体大小,T<sub>h</sub>是当前水平缩放因子,T<sub>rise</sub>是当前文本上升值。</p>
<p>绘制该字形后,T<sub>m</sub>会根据字形位移更新</p>
<p><img src=

    1
    BT

Tm 和 Tlm 都设置为单位矩阵

1
2
/GS0 gs
/T1_0 10 Tf

Tm 或 Tlm 没有变化。

1
317 65 Td

这将如上所述的平移矩阵从左侧乘以 Tlm 的前一个值,并设置 Tm 和 Tlm结果:

1
2
3
             1  0  0     1 0 0       1  0  0
T  = T   =   0  1  0  *  0 1 0  =    0  1  0
 m    lm   317 65  1     0 0 1     317 65  1

由于之前的值是恒等式,这看起来像是用 Td 平移矩阵替换,但实际上是乘法。

1
(F)Tj

这会绘制一个由文本渲染矩阵转换的字形

1
2
3
       10 ?— 1   0  0       1  0  0     1 0 0      10  0  0
T   =       0  10  0  *    0  1  0  *  0 1 0  =    0 10  0
 rm         0   0  1     317 65  1     0 0 1     317 65  1

此后Tm如上所述被更新。不幸的是,我们没有字体 T1_0 的宽度,所以我们无法计算更新后的值。

1
1 0 0 1 370 87 Tm

这会将文本矩阵 Tm 和文本行矩阵 Tlm 设置为给定矩阵:

1
2
3
              1  0  0
T  = T   =    0  1  0
 m    lm    370 87  1

所以现在我们又知道了当前的 Tm 值。

1
-47 -22 Td

这将如上所述的平移矩阵从左侧乘以 Tlm 的前一个值,并设置 Tm 和 Tlm结果:

1
2
3
              1   0  0       1  0  0       1  0  0
T  = T   =    0   1  0  *    0  1  0  =    0  1  0
 m    lm    -47 -22  1     370 87  1     323 65  1
1
[(igure)-251(2.3:)-621(P)16...] TJ

这会在参数数组中绘制字符串,其起始文本渲染矩阵为

1
2
3
       10 ?— 1   0  0       1  0  0     1 0 0      10  0  0
T   =       0  10  0  *    0  1  0  *  0 1 0  =    0 10  0
 rm         0   0  1     323 65  1     0 0 1     323 65  1

如上所述,一次又一次地更新 Tm

示例 2

></p>
<p>在接下来的段落中,我使用四舍五入的值来集中讨论要点。</p>
<p>CTM 以恒等矩阵开始。</p>
<blockquote>
<div class=

1
q

这会保存当前的图形状态,包括当前的 CTM。但是,由于示例中没有 Q 操作,我们现在可以忽略它。

1
.24 0 0 .24 91 740 cm

这将通过给定的矩阵更新 CTM:

1
2
3
        0.24   0     0     1 0 0      0.24   0     0
CTM =   0      0.24  0  *  0 1 0  =   0      0.24  0
       91    740     1     0 0 1     91    740     1
1
BT

Tm 和 Tlm 都设置为单位矩阵

1
133 0 0 133 0 0 Tm

这会将文本矩阵 Tm 和文本行矩阵 Tlm 设置为给定矩阵:

1
2
3
            133   0  0
T  = T   =    0 133  0
 m    lm      0   0  1
1
2
/TT1.0 1 Tf
.002 Tc

CTM、Tm 或 Tlm 没有变化。

1
[(The)1( )1(Long )1(Tai)1(l)]TJ

这会在参数数组中绘制字符串,其起始文本渲染矩阵为

1
2
3
       1 ?— 1  0  0     133   0  0      0.24   0    0     32   0  0
T   =      0  1  0  *    0 133  0  *   0      0.24 0  =   0  32  0
 rm        0  0  1       0   0  1     91    740    1     91 740  1

如上所述,一次又一次地更新 Tm

示例 3

1
2
3
4
5
6
7
8
9
BT
TT_1 20 Tf
35.56 150.24533 Td _______________ 1
(some sample text) Tj
50.526 250.36 Td  ________________ 2
(second line new replace) Tj
0 -16.2 Td   _____________________ 3
(Line end.) Tj
ET

在接下来的段落中,我使用四舍五入的值来集中讨论要点。

CTM 以恒等矩阵开始,由于这里没有 cm 操作,所以一直如此。另一方面,Tm 和 Tlm 确实发生了变化:

1
BT

Tm 和 Tlm 都设置为单位矩阵

1
TT_1 20 Tf

Tm 或 Tlm 没有变化。

1
36 150 Td

这将如上所述的平移矩阵从左侧乘以 Tlm 的前一个值,并设置 Tm 和 Tlm结果:

1
2
3
            1   0  0     1 0 0      1   0  0
T  = T   =  0   1  0  *  0 1 0  =   0   1  0
 m    lm   36 150  1     0 0 1     36 150  1

由于之前的值是恒等式,这看起来像是用 Td 平移矩阵替换,但实际上是乘法。

1
(some sample text) Tj

这会绘制由文本渲染矩阵转换的字形

1
2
3
       20 ?— 1   0  0      1   0  0     1 0 0     20   0  0
T   =       0  20  0  *   0   1  0  *  0 1 0  =   0  20  0
 rm         0   0  1     36 150  1     0 0 1     36 150  1

此后Tm如上所述被更新。不幸的是,我们没有字体 TT_1 的宽度,因此我们无法计算更新后的值。

1
51 250 Td

这将如上所述的平移矩阵从左侧乘以 Tlm 的前一个值,并设置 Tm 和 Tlm结果:

1
2
3
            1   0  0      1   0  0      1   0  0
T  = T   =  0   1  0  *   0   1  0  =   0   1  0
 m    lm   51 250  1     36 150  1     87 400  1

所以现在我们又知道了当前的 Tm 值。

1
(second line new replace) Tj

这会绘制由文本渲染矩阵转换的字形

1
2
3
       20 ?— 1   0  0      1   0  0     1 0 0     20   0  0
T   =       0  20  0  *   0   1  0  *  0 1 0  =   0  20  0
 rm         0   0  1     87 400  1     0 0 1     87 400  1

此后Tm如上所述被更新。不幸的是,我们没有字体 TT_1 的宽度,因此我们无法计算更新后的值。

1
0 -16 Td

这将如上所述的平移矩阵从左侧乘以 Tlm 的前一个值,并设置 Tm 和 Tlm结果:

1
2
3
            1   0  0      1   0  0      1   0  0
T  = T   =  0   1  0  *   0   1  0  =   0   1  0
 m    lm    0 -16  1     87 400  1     87 384  1

所以现在我们又知道了当前的 Tm 值。

1
(Line end.) Tj

这会绘制由文本渲染矩阵转换的字形

1
2
3
       20 ?— 1   0  0      1   0  0     1 0 0     20   0  0
T   =       0  20  0  *   0   1  0  *  0 1 0  =   0  20  0
 rm         0   0  1     87 384  1     0 0 1     87 384  1

此后Tm如上所述被更新。不幸的是,我们没有字体 TT_1 的宽度,因此我们无法计算更新后的值。

示例 4

我们在您的回答和评论中讨论了示例 4。

示例 5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
q 0.1 0 0 0.1 0 0 cm
/R108 gs
0 g
q
...
Q
0 0 1 rg
q
...
Q
4.05 w
0 G
722.023 4082.13 m
722.023 4490.28 l
S
723.961 4488.25 m
2872.98 4488.25 l
S
404.1 w
0 0 0.199951 0 K
723.961 4284.18 m
2872.98 4284.18 l
S
4.05 w
0 G
720 4080.2 m
2876.94 4080.2 l
S
2874.91 4082.13 m
2874.91 4490.28 l
S
0 g
q

为什么您对这些说明的看法显示的数字不准确?以上为复制


n