parsing - 对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
解决方案
初始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) 的平移。
(当然,这仍然会受到页面轮换的影响......)
推荐阅读
- thrift - 如何在 Apache Thrift 中表示一种类型的值?
- java - 如何在 SQLite 中使用 android 中的多个数据库助手类进行内部连接
- python-3.x - 从 Fuzzywuzzy 获取匹配的令牌列表
- r - 如何使用 case_when 和 mutate_all 插入变量值
- javascript - 如何使用数组或对象中的值在 Google 表格中动态创建下拉列表?
- javascript - 为什么 Javascript DOM 有这种奇怪的行为?
- java - 如何解决 SAXParseException: cvc-elt.1 -> 'bpm-platform'?
- anaconda - 找不到 Anaconda 导航器或 Anaconda 提示符
- javascript - 这种选择排序的实现有什么问题?
- c# - 无法使用 SendGrid WebApi lib 发送电子邮件