gpt4 book ai didi

pdf - CTM矩阵乘法与先前状态与PDF位置解析中的单位矩阵?

转载 作者:行者123 更新时间:2023-12-04 10:49:03 25 4
gpt4 key购买 nike

我在 CTM 矩阵计算上经历了不同的解决方案(其中一些是 thisthis )。

我对内容流的了解是,当“ q ”遇到我们需要将单位矩阵插入 graphics_stack 并保持与下一个位置运算符(cm ,Tm,Td,TD)CTM 相乘时。当“ Q ”遇到时,我们需要弹出最后一个矩阵。

当“ BT ”在 position_stack 中遇到单位矩阵的 push 并保持与下一个位置 operator(cm , Tm, Td, TD) CTM 相乘时的文本定位解析。当“ ET ”遇到时,我们需要弹出最后一个矩阵。

这里有时我们需要与最后一个 CTM 矩阵相乘,有时只需与单位矩阵相乘。这些情况是什么时候发生的?

情况1:

enter image description here

如图 1 和图 2 所示,只是将新矩阵从 Td 替换为 Tm。从 2 到 3 又是最后一次 CTM 乘法。我怎么知道?(通过视觉我可以通过外观来判断)

案例2:

enter image description here

在这种情况下,矩阵推送和计算将如何进行?

案例3:

BT
TT_1 20 Tf
35.56 150.24533 Td _______________ 1
(some sample text) Tj
50.526 250.36 Td ________________ 2
(second line new replace) Tj
0 -16.2 Td _____________________ 3
(Line end.) Tj
ET

这种情况1和2只是替换,2和3之前的矩阵乘法。我怎么知道?

案例4:



请至少解析这些位置到 10。这个 pdf 的源文件

案例5:

enter image description here

在上面一个需要计算l位置。我用 1 到 4 个数字突出显示。我需要计算每个人的位置 l 如何做到这一点? pdf

案例6:

当页面( pdf )旋转到 90 或 180 或 270 和 315 度时,计算有什么变化?

这些是我看到的一些案例。我还能遇到什么其他情况,解决这个问题的通用方法是什么?

最佳答案

感兴趣的运营商
首先,我的印象是你混淆了两个不同的方面。您有当前的转换矩阵 (CTM) 以及文本和文本行矩阵。 CTM 受制于 厘米 , q , 和 .文本和文本行矩阵以 为准BT , 电话 , Td , ... 并且要确定绘制文本的确切位置和方向,您需要绘制文本时的文本矩阵和 CTM 的乘积。
PDF 规范 ISO 32000 第 1 部分或第 2 部分中描述了这些运算符如何更改矩阵。
来自 ISO 32000-1 表 57 – 图形状态运算符 –

  • 厘米 :通过连接指定矩阵
  • 来修改当前变换矩阵(CTM)
  • q : 在图形状态堆栈中保存当前图形状态,包括 CTM
  • :通过从堆栈中删除最近保存的状态并将其设为当前状态来恢复包括 CTM 在内的图形状态

  • 来自 ISO 32000-1 表 107 – 文本对象运算符 –
  • BT :开始一个文本对象,将文本矩阵 Tm 和文本行矩阵 Tlm 初始化为单位矩阵。

  • 来自 ISO 32000-1 表 108 – 文本定位操作符 –
  • tx ty Td : 移动到下一行的开头,从当前行的开头偏移(tx, ty)。更准确地说,此运算符应执行以下分配:

  • a b c d e f 电话 :设置文本矩阵 Tm 和文本行矩阵 Tlm:


  • 此外, TD , T* , ' , 和 " 以使用 Td 运算符指定的方式对 Tm 和 Tlm 进行操作。
    来自 ISO 32000-1 第 9.4.4 节 – 文本空间详细信息 –
    每当绘制字形时,它从文本空间的整个转换都可以由文本渲染矩阵 Trm 表示:

    其中 Tfs 是当前字体大小,Th 是当前水平缩放因子,Trise 是当前文本上升值。
    绘制该字形后,根据字形位移更新 Tm

    在水平模式下,tx 是位移,ty 为零;在垂直模式下,tx 为零,ty 是位移。适用值计算如下

    示例 1

    在下面的段落中,我使用四舍五入的值来专注于要点。
    CTM 作为单位矩阵开始,因为没有 厘米 在这里操作,一直如此。另一方面,Tm 和 Tlm 确实发生了变化:
    BT

    Tm 和 Tlm 都设置为单位矩阵
    /GS0 gs
    /T1_0 10 Tf

    Tm 或 Tlm 没有变化。
    317 65 Td

    这将如上所述的平移矩阵从左乘到 Tlm 的前一个值,并将 Tm 和 Tlm 设置为结果:
                 1  0  0     1 0 0       1  0  0
    T = T = 0 1 0 * 0 1 0 = 0 1 0
    m lm 317 65 1 0 0 1 317 65 1
    由于以前的值是身份,这可能看起来像是 的替代品。 Td 平移矩阵,但它实际上是一个乘法。
    (F)Tj

    这绘制了一个由文本渲染矩阵转换的字形
           10 × 1   0  0       1  0  0     1 0 0      10  0  0
    T = 0 10 0 * 0 1 0 * 0 1 0 = 0 10 0
    rm 0 0 1 317 65 1 0 0 1 317 65 1
    此后Tm如上所述被更新。不幸的是,我们没有字体的宽度 T1_0 ,因此我们无法计算更新后的值。
    1 0 0 1 370 87 Tm

    这将文本矩阵 Tm 和文本行矩阵 Tlm 设置为给定矩阵:
                  1  0  0
    T = T = 0 1 0
    m lm 370 87 1
    所以现在我们又知道了当前的 Tm 值。
    -47 -22 Td

    这将如上所述的平移矩阵从左乘到 Tlm 的前一个值,并将 Tm 和 Tlm 设置为结果:
                  1   0  0       1  0  0       1  0  0
    T = T = 0 1 0 * 0 1 0 = 0 1 0
    m lm -47 -22 1 370 87 1 323 65 1
    [(igure)-251(2.3:)-621(P)16...] TJ

    这将使用起始文本渲染矩阵绘制参数数组中的字符串
           10 × 1   0  0       1  0  0     1 0 0      10  0  0
    T = 0 10 0 * 0 1 0 * 0 1 0 = 0 10 0
    rm 0 0 1 323 65 1 0 0 1 323 65 1
    如上所述,一次又一次地更新 Tm。
    示例 2

    在下面的段落中,我使用四舍五入的值来专注于要点。
    CTM 作为单位矩阵开始。
    q

    这将保存当前的图形状态,包括当前的 CTM。因为没有 但是,我们可以暂时忽略示例中的操作。
    .24 0 0 .24 91 740 cm

    这通过给定的矩阵更新 CTM:
            0.24   0     0     1 0 0      0.24   0     0
    CTM = 0 0.24 0 * 0 1 0 = 0 0.24 0
    91 740 1 0 0 1 91 740 1
    BT

    Tm 和 Tlm 都设置为单位矩阵
    133 0 0 133 0 0 Tm

    这将文本矩阵 Tm 和文本行矩阵 Tlm 设置为给定矩阵:
                133   0  0
    T = T = 0 133 0
    m lm 0 0 1
    /TT1.0 1 Tf
    .002 Tc

    CTM、Tm 或 Tlm 没有变化。
    [(The)1( )1(Long )1(Tai)1(l)]TJ

    这将使用起始文本渲染矩阵绘制参数数组中的字符串
           1 × 1  0  0     133   0  0      0.24   0    0     32   0  0
    T = 0 1 0 * 0 133 0 * 0 0.24 0 = 0 32 0
    rm 0 0 1 0 0 1 91 740 1 91 740 1
    如上所述,一次又一次地更新 Tm。
    示例 3
    BT
    TT_1 20 Tf
    35.56 150.24533 Td _______________ 1
    (some sample text) Tj
    50.526 250.36 Td ________________ 2
    (second line new replace) Tj
    0 -16.2 Td _____________________ 3
    (Line end.) Tj
    ET
    在下面的段落中,我使用四舍五入的值来专注于要点。
    CTM 作为单位矩阵开始,因为没有 厘米 在这里操作,一直如此。另一方面,Tm 和 Tlm 确实发生了变化:
    BT

    Tm 和 Tlm 都设置为单位矩阵
    TT_1 20 Tf

    Tm 或 Tlm 没有变化。
    36 150 Td

    这将如上所述的平移矩阵从左乘到 Tlm 的前一个值,并将 Tm 和 Tlm 设置为结果:
                1   0  0     1 0 0      1   0  0
    T = T = 0 1 0 * 0 1 0 = 0 1 0
    m lm 36 150 1 0 0 1 36 150 1
    由于以前的值是身份,这可能看起来像是 的替代品。 Td 平移矩阵,但它实际上是一个乘法。
    (some sample text) Tj

    这将绘制由文本渲染矩阵转换的字形
           20 × 1   0  0      1   0  0     1 0 0     20   0  0
    T = 0 20 0 * 0 1 0 * 0 1 0 = 0 20 0
    rm 0 0 1 36 150 1 0 0 1 36 150 1
    此后Tm如上所述被更新。不幸的是,我们没有字体的宽度 TT_1 ,因此我们无法计算更新后的值。
    51 250 Td

    这将如上所述的平移矩阵从左乘到 Tlm 的前一个值,并将 Tm 和 Tlm 设置为结果:
                1   0  0      1   0  0      1   0  0
    T = T = 0 1 0 * 0 1 0 = 0 1 0
    m lm 51 250 1 36 150 1 87 400 1
    所以现在我们又知道了当前的 Tm 值。
    (second line new replace) Tj

    这将绘制由文本渲染矩阵转换的字形
           20 × 1   0  0      1   0  0     1 0 0     20   0  0
    T = 0 20 0 * 0 1 0 * 0 1 0 = 0 20 0
    rm 0 0 1 87 400 1 0 0 1 87 400 1
    此后Tm如上所述被更新。不幸的是,我们没有字体的宽度 TT_1 ,因此我们无法计算更新后的值。
    0 -16 Td

    这将如上所述的平移矩阵从左乘到 Tlm 的前一个值,并将 Tm 和 Tlm 设置为结果:
                1   0  0      1   0  0      1   0  0
    T = T = 0 1 0 * 0 1 0 = 0 1 0
    m lm 0 -16 1 87 400 1 87 384 1
    所以现在我们又知道了当前的 Tm 值。
    (Line end.) Tj

    这将绘制由文本渲染矩阵转换的字形
           20 × 1   0  0      1   0  0     1 0 0     20   0  0
    T = 0 20 0 * 0 1 0 * 0 1 0 = 0 20 0
    rm 0 0 1 87 384 1 0 0 1 87 384 1
    此后Tm如上所述被更新。不幸的是,我们没有字体的宽度 TT_1 ,因此我们无法计算更新后的值。
    示例 4
    我们在 your answer 中讨论了示例 4以及对它的评论。
    例 5
    q 0.1 0 0 0.1 0 0 cm
    /R108 gs
    0 g
    q
    ...
    Q
    0 0 1 rg
    q
    ...
    Q
    4.05 w
    0 G
    722.023 4082.13 m
    722.023 4490.28 l
    S
    723.961 4488.25 m
    2872.98 4488.25 l
    S
    404.1 w
    0 0 0.199951 0 K
    723.961 4284.18 m
    2872.98 4284.18 l
    S
    4.05 w
    0 G
    720 4080.2 m
    2876.94 4080.2 l
    S
    2874.91 4082.13 m
    2874.91 4490.28 l
    S
    0 g
    q
    为什么您对这些说明的看法显示的数字不准确?以上是从流内容中复制粘贴的,不需要像那样更改数字...
    q
    0.1 0 0 0.1 0 0 cm

    将 CTM 设置为
           0.1 0   0
    CTM = 0 0.1 0
    0 0 1
    /R108 gs
    ...
    0 G

    CTM 没有任何 react
    722.023 4082.13 m
    722.023 4490.28 l
    S

    我们必须将 CTM 应用于这些坐标
                          0.1 0   0
    [722.023 4082.13] * 0 0.1 0 = [72.2023 408.213]
    0 0 1

    0.1 0 0
    [722.023 4490.28] * 0 0.1 0 = [72.2023 449.028]
    0 0 1
    因此,一条线从 72.2023,408.213 到 72.2023,449.028。
    723.961 4488.25 m
    2872.98 4488.25 l
    S

    就像上面一样,从 72.3961,448.825 到 287.298,448.825 画了一条线。
    404.1 w
    0 0 0.199951 0 K
    723.961 4284.18 m
    2872.98 4284.18 l
    S

    同样,从 72.3961,428.418 到 287.298,428.418 画了一条线。这里唯一值得注意的是这条线很宽,大约。 40 个单位,所以这条“线”实际上看起来更像是一个填充的矩形,代表了具有洛伦兹力特征的文本框的背景。
    4.05 w
    0 G
    720 4080.2 m
    2876.94 4080.2 l
    S

    绘制了另一条线,再次变窄,因此看起来像一条线,这次是从 72,408.02 到 287.694 408.02。
    2874.91 4082.13 m
    2874.91 4490.28 l
    S

    最后一行,这次是从 287.491,408.213 到 287.491,449.028。

    关于pdf - CTM矩阵乘法与先前状态与PDF位置解析中的单位矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59573104/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com