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:
如图 1 和图 2 所示,只是将新矩阵从 Td 替换为 Tm。从 2 到 3,它又是最后一个 CTM 乘法。我是怎么知道的?(从视觉上我可以看出来)
情况 2:
在这种情况下,矩阵的推送和计算将如何进行?
情况 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 |
这种情况1和2只是替换,2和3之前的矩阵乘法。我怎么知道?
案例 4:
在上面一个需要计算l的位置。我用 1 到 4 个数字突出显示。我需要计算每个人的位置 l 如何做到这一点? pdf
case6:?pb>
页面(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)。更准确地说,这个操作符应该执行这些赋值:
m 和 Tlm 进行操作。
来自 ISO 32000-1 第 9.4.4 节 a€"Text Space Details a€"
每当绘制一个字形时,它从文本空间的整个转换都可以由文本渲染矩阵 Trm 表示:
1BT
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
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