对pdf解析器的文本矩阵和转换矩阵感到困惑

时间:2019-12-06 05:54:10

标签: parsing pdf canvas

我正在开发PdfParser,我想在坐标平面上打印pdf的文本内容。下面是文本对象和用于呈现文本的矩阵。如何隔离缩放,旋转和平移并用于在画布上的精确坐标上打印文本内容?

//Decoded text stream containing text objects
S
Q

q
0.000 0.750 0.750 -0.000 15.000 301.890 cm
0.000 g
/F10 16.000 Tf
0 Tr
0.000 Tc
BT
1 0 0 -1 20.000 13.600 Tm
[<007a>]TJ
ET
Q

q
0.000 0.750 0.750 -0.000 15.000 301.890 cm
1.000 0.416 0.000 rg
/F10 6.667 Tf
0 Tr
0.000 Tc
BT
1 0 0 -1 136.667 13.600 Tm
[<0024>12<0046><0046><0058><0055>6<0048><0003><0032><0058><0057><0053><0058><0057><0003><0036>-4<0052><004f><0058><0057><004c><0052><0051><0003><0026>3<004f><0052><0058><0047><0003><0048><0051>18<0059><004c><0055>6<0052><0051><0050><0048><0051>3<0057>7<000f><0003><0027><0028><0030><0032><0003><0044><0046><0046><0058><0055>6<0048>]TJ
ET
Q

q
0.000 0.750 0.750 -0.000 15.000 301.890 cm
0.000 g
/F10 16.000 Tf
0 Tr
0.000 Tc
BT
1 0 0 -1 603.333 13.600 Tm
[<007a>]TJ
ET
Q

q

1 个答案:

答案 0 :(得分:2)

最初的S Q是上一个指令块的剩余部分,该指令块以某种路径描边和图形状态恢复结束。由于我们什么都不知道,因此我们假设'Q'恢复到初始图形状态,尤其是恢复到未经修改的当前变换矩阵(CTM)。

由于我们对根据默认用户空间坐标系的坐标感兴趣,因此可以假定当前的CTM是单位矩阵,

让我们看一下区块

q
0.000 0.750 0.750 -0.000 15.000 301.890 cm
0.000 g
/F10 16.000 Tf
0 Tr
0.000 Tc
BT
1 0 0 -1 20.000 13.600 Tm
[<007a>]TJ
ET
Q

正如您在评论中所暗示的那样,在文本渲染指令[<007a>]TJ开始执行时,总转换矩阵的唯一相关指令是

0.000 0.750 0.750 -0.000 15.000 301.890 cm

1 0 0 -1 20.000 13.600 Tm

将当前变换矩阵设置为

 0      0.75 0     1 0 0      0      0.75 0
 0.75   0    0  *  0 1 0  =   0.75   0    0
15.00 301.89 1     0 0 1     15.00 301.89 1

以及文本和文本行矩阵都

 1    0   0
 0   -1   0
20.0 13.6 1

因此,文本矩阵和当前转换矩阵的作用组合为:

 1    0   0      0      0.75 0      0      0.75 0
 0   -1   0  *   0.75   0    0  =  -0.75   0    0
20.0 13.6 1     15.00 301.89 1     25.2  316.89 1

您可以像这样缩放,旋转和平移该组合矩阵:

 0      0.75 0     0.75 0    0      0 1 0      1      0    0
-0.75   0    0  =  0    0.75 0  *  -1 0 0  *   0      1    0
25.2  316.89 1     0    0    1      0 0 1     25.2  316.89 1

我们的缩放比例为.75,逆时针旋转90°,平移为(25.2,316.89)。

(当然,这仍然可以旋转页面...)