首页 > 解决方案 > 对pdf解析器的文本矩阵和转换矩阵感到困惑

问题描述

我正在开发一个 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

标签: parsingpdfcanvas

解决方案


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

我们有 0.75 的缩放、逆时针 90° 的旋转和 (25.2, 316.89) 的平移。

(当然,这仍然会受到页面轮换的影响......)


推荐阅读