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

Parsing 对pdf解析器的文本矩阵和转换矩阵感到困惑,parsing,pdf,canvas,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 [

我正在开发一个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
//包含文本对象的解码文本流
s
Q
Q
0.000 0.750 0.750-0.000 15.000 301.890厘米
0.000克
/F10 16.000 Tf
0 Tr
0.000 Tc
英国电信
100-120.000 13.600 Tm
[]TJ
ET
Q
Q
0.000 0.750 0.750-0.000 15.000 301.890厘米
1.000 0.416 0.000 rg
/F10 6.667 Tf
0 Tr
0.000 Tc
英国电信
100TM-1136.66713.600 Tm
[126-43186376]TJ
ET
Q
Q
0.000 0.750 0.750-0.000 15.000 301.890厘米
0.000克
/F10 16.000 Tf
0 Tr
0.000 Tc
英国电信
100-1603.333 13.600 Tm
[]TJ
ET
Q
Q

初始的
sq
是前一个指令块的剩余部分,以某种路径笔划和图形状态恢复结束。由于我们不知道任何相反的情况,让我们假设“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

将当前变换矩阵设置为

 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.2316.89)


(当然,这仍然可能受到页面旋转的影响…

您所说的“隔离缩放、旋转和平移”是什么意思?他们毕竟不是独立的!例如,先按系数2进行缩放,然后按(1,0)进行平移,显然与先按(1,0)进行平移,然后按系数2进行缩放不同。因此,您需要确定分解转换的顺序。此外,您只提到缩放、旋转和平移,但变换可能包括倾斜和镜像,听起来您不仅仅是在编写PDFParse,还“在画布上的精确坐标上打印文本内容”渲染。您要查找的信息在这里的第8节和第9节中:如果分解矩阵对您很重要,那么请参阅类似的内容,了解如何将2D PDF矩阵分解为缩放、旋转等。尽管这不是mkl指出的100%解决方案。@mkl,我想要的是使用诸如cm,Tm之类的操作符在画布上呈现这些文本。我想知道如何提取精确的x、y坐标和旋转角度以及其他细节,但坐标和旋转角度对我来说是最重要的。串联意味着将参数从左侧乘以当前变换矩阵值。如果你计算这个乘积的方法出现了错误的值,你应该展示一个例子以及你是如何计算这个乘积的。我不知道你为什么要分解,但是仅仅分解一个cm参数是没有任何帮助的,你需要分解产品。也就是说,如果没有q,这只是之前所有cm参数的串联。。。随信附上一些如果有的话。非常感谢你的回答。这消除了我的疑虑。我还是想知道你分割组合矩阵的方式。是否所有pdf生成器都有特定的顺序,或者您如何知道矩阵的拆分顺序?例如,这里的顺序是缩放、旋转和平移。这可能是旋转、缩放和平移吗?@Chiranga我在回答中选择了顺序。最简单的方法是首先将译文分开,使其成为最后一个因素。因为在你的例子中,x和y的缩放比例是相同的,所以如果你切换它们的顺序,缩放和旋转保持不变。但是,通常情况下,这些因素会根据顺序而变化,正如您在问题的第一条评论中所说的,您必须决定分解整个转换的顺序。这取决于在绘图中应用不同变换类型的顺序。有没有办法将旋转矩阵从具有旋转和倾斜属性的组合矩阵中分解出来?@Chiranga“有没有办法…”-很可能是的,但转换成什么?问题是我想得到转换,特定Trm矩阵的缩放和旋转。此文本也会出现倾斜。到目前为止,我能够通过分解Trm来分离平移和缩放矩阵。我很难将旋转矩阵从其他矩阵中分离出来。Trm矩阵:-0.000000044,-1,1,-0.000000044130.44711.89您能分解上述矩阵并解释分离旋转矩阵的方法吗?
 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