在PDF位置解析中,CTM矩阵与先前状态的相乘与身份矩阵的相乘?

在PDF位置解析中,CTM矩阵与先前状态的相乘与身份矩阵的相乘?,pdf,pdfbox,Pdf,Pdfbox,我在CTM矩阵计算中使用了不同的解决方案(其中一些是和) 我对内容流的了解是,当“q”遇到问题时,我们需要在图形堆栈中推送标识矩阵,并保持与下一个位置运算符(cm、Tm、Td、Td)CTM相乘。当“Q”遇到时,我们需要弹出最后一个矩阵 当“BT”在位置堆栈中遇到推入式标识矩阵并与下一个位置运算符(cm、Tm、Td、Td)CTM相乘时,用于文本定位解析。当“ET”遇到时,我们需要弹出最后一个矩阵 这里有些时候我们需要和最后一个CTM矩阵相乘,有些时候我们只需要和单位矩阵相乘。这些情况何时发生 案例

我在CTM矩阵计算中使用了不同的解决方案(其中一些是和)

我对内容流的了解是,当“q”遇到问题时,我们需要在图形堆栈中推送标识矩阵,并保持与下一个位置运算符(cm、Tm、Td、Td)CTM相乘。当“Q”遇到时,我们需要弹出最后一个矩阵

当“BT”在位置堆栈中遇到推入式标识矩阵并与下一个位置运算符(cm、Tm、Td、Td)CTM相乘时,用于文本定位解析。当“ET”遇到时,我们需要弹出最后一个矩阵

这里有些时候我们需要和最后一个CTM矩阵相乘,有些时候我们只需要和单位矩阵相乘。这些情况何时发生

案例1:

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

案例2:

在这种情况下,矩阵推送和计算将如何进行

案例3:

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:

请至少在10点之前解析这些位置。此文件的源文件

案例5:

在上述情况下,需要计算l位置。我用1到4个数字突出显示。我需要计算每个l的位置怎么做

案例6:

当页面()旋转到90度、180度、270度和315度时,计算有什么变化

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

感兴趣的操作员 首先,我觉得你混淆了两个不同的方面。有当前变换矩阵(CTM),有文本和文本行矩阵。CTM受制于cmqq。文本和文本行矩阵受BTTmTd、。。。要确定绘制文本的确切位置和方向,需要绘制文本时文本矩阵和CTM的乘积

这些运算符如何更改矩阵,见PDF规范ISO 32000第1部分或第2部分

来自ISO 32000-1表57-图形状态运算符-
  • cm:通过连接指定矩阵来修改当前变换矩阵(CTM)
  • q:保存当前图形状态,包括图形状态堆栈上的CTM
  • Q:通过从堆栈中删除最近保存的状态并使其成为当前状态,恢复包括CTM在内的图形状态
来自ISO 32000-1表107-文本对象运算符-
  • BT:开始一个文本对象,将文本矩阵Tm和文本行矩阵Tlm初始化为标识矩阵
来自ISO 32000-1表108–文本定位运算符-
  • tx tyTd:移动到下一行的开始,与当前行的开始偏移(tx,ty)。更准确地说,该操作员应执行以下任务:

  • a b c d e fTm:设置文本矩阵Tm和文本行矩阵Tlm:

此外,TDT*以使用TD运算符指定的方式对Tm和Tlm进行操作

来自ISO 32000-1第9.4.4节-文本空间详细信息- 无论何时绘制图示符,其从文本空间的整个转换都可以由文本渲染矩阵Trm表示:

其中,Tfs是当前字体大小,Th是当前水平缩放因子,Trise是当前文本上升值

绘制该轮廓后,Tm将根据轮廓位移进行更新

在水平模式下,tx为位移,ty为零;在垂直模式下,tx为零,ty为位移。适用值计算如下:

例1

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

CTM作为身份矩阵开始,由于此处没有cm操作,因此始终保持不变。另一方面,Tm和Tlm会发生变化:

Tm和Tlm均设置为单位矩阵

Tm或Tlm没有变化

(William Shakespeare) Tj
这将如上所述的平移矩阵从左到Tlm的前一个值相乘,并将Tm和Tlm设置为结果:

             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
              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   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
            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
            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
由于前一个值是恒等式,这看起来像是被Td转换矩阵替换,但实际上是一个乘法

这将绘制由文本渲染矩阵变换的图示符

       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
       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
       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
       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
       8 × 1   0  0       1    0   0     1     0      0      8     0       0
T   =       0  8  0  *    0    1   0  *  0     1      0  =   0     8       0
 rm         0  0  1     46.22 5.6  1    366.18 508.73 1     412.4 514.33  1
此后,Tm将按上述方式更新。不幸的是,我们没有字体的宽度T1\u 0,因此无法计算更新后的值

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

              1  0  0
T  = T   =    0  1  0
 m    lm    370 87  1
        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
            133   0  0
T  = T   =    0 133  0
 m    lm      0   0  1
        1      0      0     1 0 0      1      0      0
CTM =   0      0      0  *  0 1 0  =   0      1      0    ----- 2
        62.692 277.67 1     0 0 1     62.692  277.67 1
              1   0    0
T  = T   =    0   1    0
 m    lm      0   5.6  1
现在我们又知道了当前的Tm值

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

             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
              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   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
            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
            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
这将使用起始文本呈现矩阵绘制参数数组中的字符串

       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
       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

例2

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

CTM从身份矩阵开始

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

这将根据给定的矩阵更新CTM:

36 150 Td
            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
(some sample text) Tj
       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
51 250 Td
            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
(second line new replace) Tj
       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
0 -16 Td
            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
(Line end.) Tj
       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
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 
q
0.1 0 0 0.1 0 0 cm
       0.1 0   0
CTM =  0   0.1 0
       0   0   1
/R108 gs
...
0 G
722.023 4082.13 m
722.023 4490.28 l
S
                      0.1 0   0
[722.023 4082.13]  *  0   0.1 0  = [72.2023 408.213]
                      0   0   1

                      0.1 0   0
[722.023 4490.28]  *  0   0.1 0  = [72.2023 449.028]
                      0   0   1
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
q
1 0 0 1 62.692 277.671 cm
        1      0      0     1 0 0      1      0      0
CTM =   0      0      0  *  0 1 0  =   0      1      0    ----- 2
        62.692 277.67 1     0 0 1     62.692  277.67 1
q
q
1 0 0 1 286.59 207.54 cm
      1      0      0   1      0      0        1      0      0
CTM = 0      1      0 * 0      0      0    =   0      1      0    ----- 3
      286.49 207.54 1  62.692 277.67 1        349.18 485.21  1
q
.75 .75 .75 RG
n
11.33 19.84 171.67 232.146 re
S
Q
1 0 0 1 17.007 23.52 cm 
      1      0      0   0      1      0        0      1      0
CTM = 0      1      0 * 0      0      0    =   0      1      0    ----- 4
      17.007 23.52  1  349.18 485.21  1        366.18 508.73 1
q
BT
1 0 0 1 0 5.6 Tm
              1   0    0
T  = T   =    0   1    0
 m    lm      0   5.6  1
46.22 0 Td
             1   0  0     1 0   0       1     0  0
T  = T   =   0   1  0  *  0 1   0  =    0     1  0
 m    lm   46.22 0  1     0 5.6 1       46.22 5.6  1
12 TL
(William Shakespeare) Tj
       8 × 1   0  0       1    0   0     1     0      0      8     0       0
T   =       0  8  0  *    0    1   0  *  0     1      0  =   0     8       0
 rm         0  0  1     46.22 5.6  1    366.18 508.73 1     412.4 514.33  1
T*
             1   0  0     1     0   0       1       0   0
T  = T   =   0   1  0  *  0     1   0  =    0       1   0
 m    lm     0  -12 1     46.22 5.6 1       46.22 -6.4  1