CTM矩阵与先前状态的比较与在PDF位置解析中的恒等矩阵的比较?

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

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

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

用于“ BT”遇到position_stack中的单位矩阵的推入时的文本定位解析,并与下一个位置运算符(cm,Tm,Td,TD)CTM保持乘法。当遇到“ ET”时,我们需要弹出最后一个矩阵。

有些时候,我们需要与最后一个CTM矩阵相乘,有些时候需要与恒等矩阵相乘。这些情况何时发生?

情况1:

enter image description here

如图1和图2所示,仅是将新矩阵从Td替换为Tm。从2到3,这也是最后一次CTM乘法。我怎么知道的(通过外观我可以通过外观分辨出来)

案例2:

enter image description here

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

案例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:

enter image description here

这里1和2只是替换,而2和3是CTM乘法。这里代表乘法?

这些是我所看到的一些情况。我还可能遇到什么情况?解决此问题的通用方法是什么?

pdf pdfbox
1个回答
2
投票

感兴趣的运营商

首先,我给您的印象是您将两个不同的方面混为一谈。您具有当前转换矩阵(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:开始一个文本对象,将文本矩阵T m和文本行矩阵T lm初始化为恒等矩阵。
  • 从ISO 32000-1表108 –文本定位运算符–

  • t x t y Td:移至下一行的开头,与当前行的开头偏移(< [t xt y)。更准确地说,该操作员应执行以下分配:“”

  • a b c d e f

  • Tm:设置文本矩阵T m和文本行矩阵T lm“”

    此外,

    TD

T *'T mT lm 使用Td运算符指定的方式。根据ISO 32000-1第9.4.4节–文本空间详细信息–

无论何时绘制字形,其从文本空间的整个转换都可以用文本渲染矩阵表示,

T rm“”

其中

T

fs是当前字体大小,T h是当前水平缩放因子,并且T rise是当前字体文字上升值。绘制该字形后,

T

m根据字形位移进行更新
“”

在水平模式下,t

x

为位移,t y为零,在垂直模式下,t x为零,t y为位移。适用值的计算方式为
“”

示例1

“”

[在以下段落中,我使用舍入值将重点放在要点上。

CTM作为身份矩阵开始,并且由于这里没有

cm

操作,因此一直保持不变。另一方面,T mT lm确实会发生变化:
BT

T

mT lm都设置为单位矩阵
/GS0 gs /T1_0 10 Tf

T

mT lm不变。
317 65 Td
这将如上所述的转换矩阵从左向

T

lm的前一个值相乘,并设置T mT lm 到结果:
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
转换矩阵替代,但实际上是一个乘法。

(F)Tj

这将绘制由文本渲染矩阵转换的字形
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
此后

T

m
如上所述更新。不幸的是,我们没有字体的宽度

T1_0,因此我们无法计算更新后的值。1 0 0 1 370 87 Tm

这将文本矩阵
T
m
和文本行矩阵

T lm设置为给定矩阵: 1 0 0 T = T = 0 1 0 m lm 370 87 1 所以现在我们再次知道当前的[[T

m值。

-47 -22 Td

这将如上所述的转换矩阵从左向T
lm
的前一个值相乘,并设置
T

m和T lm 到结果: 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 [(igure)-251(2.3:)-621(P)16...] TJ

这将以起始文本呈现矩阵]绘制参数数组中的字符串>
       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
如上所述一次又一次地更新
T

m

示例2

“”

[在以下段落中,我使用舍入值将重点放在要点上。

CTM作为身份矩阵开始。

q

这将保存当前图形状态,包括当前CTM。由于示例中没有

Q

操作,因此我们暂时可以忽略它。
.24 0 0 .24 91 740 cm

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

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
BT

T
m和
T

lm都设置为单位矩阵133 0 0 133 0 0 Tm 这将文本矩阵T

m和文本行矩阵
T

lm设置为给定矩阵: 133 0 0 T = T = 0 133 0 m lm 0 0 1 /TT1.0 1 Tf .002 Tc

未更改CTM,
T
m或
T

lm。

[(The)1( )1(Long )1(Tai)1(l)]TJ 这将以起始文本呈现矩阵]绘制参数数组中的字符串> 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
如上所述一次又一次地更新
T

m

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

[在以下段落中,我使用舍入值将重点放在要点上。

CTM作为身份矩阵开始,并且由于这里没有
cm

操作,因此一直保持不变。另一方面,

T m

T

lm确实会发生变化:
BT T
m和
T

lm

都设置为单位矩阵
TT_1 20 Tf T
m或
T

lm

不变。
36 150 Td 这将如上所述的转换矩阵从左向T
lm的前一个值相乘,并设置
T

m

T lm 到结果:
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转换矩阵替代,但实际上是一个乘法。(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

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

51 250 Td

这将如上所述的转换矩阵从左向

T lm的前一个值相乘,并设置T

m
T
lm 到结果:

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 所以现在我们再次知道当前的[[T m值。(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
此后

T

m
如上所述更新。不幸的是,我们没有字体的宽度[[TT_1,因此我们无法计算更新后的值。
0 -16 Td
这将如上所述的转换矩阵从左向

T

lm的前一个值相乘,并设置

T

m
T lm 到结果:
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
所以现在我们再次知道当前的[[T 

m值。(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 此后T
m
如上所述更新。不幸的是,我们没有字体的宽度[[TT_1
,因此我们无法计算更新后的值。
© www.soinside.com 2019 - 2024. All rights reserved.