在PDF位置解析中,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:在PDF位置解析中,CTM矩阵与先前状态的相乘与身份矩阵的相乘?,pdf,pdfbox,Pdf,Pdfbox,我在CTM矩阵计算中使用了不同的解决方案(其中一些是和) 我对内容流的了解是,当“q”遇到问题时,我们需要在图形堆栈中推送标识矩阵,并保持与下一个位置运算符(cm、Tm、Td、Td)CTM相乘。当“Q”遇到时,我们需要弹出最后一个矩阵 当“BT”在位置堆栈中遇到推入式标识矩阵并与下一个位置运算符(cm、Tm、Td、Td)CTM相乘时,用于文本定位解析。当“ET”遇到时,我们需要弹出最后一个矩阵 这里有些时候我们需要和最后一个CTM矩阵相乘,有些时候我们只需要和单位矩阵相乘。这些情况何时发生 案例
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受制于cm、q和q。文本和文本行矩阵受BT、Tm、Td、。。。要确定绘制文本的确切位置和方向,需要绘制文本时文本矩阵和CTM的乘积
这些运算符如何更改矩阵,见PDF规范ISO 32000第1部分或第2部分
来自ISO 32000-1表57-图形状态运算符-
- cm:通过连接指定矩阵来修改当前变换矩阵(CTM)
- q:保存当前图形状态,包括图形状态堆栈上的CTM
- Q:通过从堆栈中删除最近保存的状态并使其成为当前状态,恢复包括CTM在内的图形状态
- BT:开始一个文本对象,将文本矩阵Tm和文本行矩阵Tlm初始化为标识矩阵
- tx tyTd:移动到下一行的开始,与当前行的开始偏移(tx,ty)。更准确地说,该操作员应执行以下任务:
- a b c d e fTm:设置文本矩阵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