我正在开发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
答案 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)。
(当然,这仍然可以旋转页面...)