【问题标题】:Confused about the Text Matrix and Transformation matrix of a pdf parser对pdf解析器的文本矩阵和转换矩阵感到困惑
【发布时间】:2019-12-17 20:57:57
【问题描述】:

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

【问题讨论】:

  • “隔离缩放、旋转和平移”是什么意思?毕竟他们不是独立的!例如。首先缩放 2 倍然后平移 (1, 0) 显然与首先平移 (1, 0) 然后缩放 2 倍不同。因此,您需要修复您想要的顺序分解变换。此外,您只提到了缩放、旋转和平移,但转换也可能包括倾斜和镜像
  • 听起来您不仅在编写 PDFParse,而且还“在画布上的精确坐标上打印文本内容”渲染。您要查找的信息在此处的第 8 节和第 9 节中:adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf
  • 如果分解矩阵对您很重要,那么请参阅类似的内容,了解如何将 2D PDF 矩阵分解为缩放、旋转等。stackoverflow.com/q/45159314/3761687 虽然这不是 mkl 的 100% 解决方案指出。
  • @mkl,我想要的是使用 cm,Tm 等运算符在画布上呈现这些文本。我想知道如何提取精确的x,y坐标和旋转角度等细节,但是坐标和旋转角度对我来说是最重要的。
  • Concatenating 表示将参数从左边乘以当前变换矩阵值。如果您计算该产品的方法得出错误的值,您应该展示一个示例以及如何计算该产品。我不确定你为什么要分解,但分解单个 cm 参数根本没有帮助,你需要分解产品。话虽如此,它只是之前所有 cm 参数的串联 if no q ... Q 包含一些 if 。

标签: parsing pdf canvas


【解决方案1】:

最初的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

正如您在评论中暗示的那样,在文本渲染指令 [&lt;007a&gt;]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) 的平移。

(当然,这仍然可以进行页面轮换...)

【讨论】:

  • 非常感谢您的回答。它消除了我的疑虑。我仍然想知道您拆分组合矩阵的方式。是否有所有 pdf 生成器的特定顺序,或者您如何知道应该拆分矩阵的顺序?例如,这里的顺序是缩放、旋转和平移。也可以是旋转、缩放和平移吗?
  • @Chiranga 我在回答中选择了顺序。首先分离翻译使其成为最后一个因素是最容易的。由于您的示例中的缩放比例与 xy 相同,因此如果您切换它们的顺序,缩放和旋转将保持不变。不过,总的来说,这些因素会根据顺序而变化,正如在对您的问题的第一条评论中已经说过的那样,您必须决定 您要分解的顺序整个转换。这取决于您要在绘图中应用不同转换类型的顺序。
  • 有什么方法可以从具有旋转和倾斜属性的组合矩阵中分解旋转矩阵?
  • @Chiranga "有什么办法可以..." - 很可能是的,但是进入什么?
  • 问题是我想从特定的 Trm 矩阵中获取平移、缩放和旋转。该文本也受到倾斜。到目前为止,我能够通过分解 Trm 来隔离平移和缩放矩阵。我很难将旋转矩阵与其他矩阵隔离开来。 trm matrix : -0.000000044, -1, 1, -0.000000044, 130.44, 711.89 能不能把上面的矩阵分解一下,解释一下隔离旋转矩阵的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2012-09-18
相关资源
最近更新 更多