XPS 文本位置——我不明白什么?

XPS text position -- what am I not understanding?

我有多个例子,这只是第一个。我一直在从这个文件中提取一些信息(我真的希望有更好的方法!)并且一些改变破坏了我的解析器。这是问题的示例:

第一行在右边距显示结束日期,第二行在页面下方的左边距以稍大的粗体显示“Room 1”。但请注意,第一条线的 Y 位置比第二条线低约 250 个单位。显然我不了解该位置。

(我只需要能够正确地对项目进行 Y 排序。虽然这个顺序正确,但我过去发现它们顺序不对。)

<Glyphs RenderTransform="0.0403884,0,0,0.0403119,0,0" Fill="#ff000000" FontUri="/Documents/1/Resources/Fonts/6C15166D-E658-4B97-A6C0-E217017F767F.odttf" FontRenderingEmSize="327.68" StyleSimulations="None" OriginX="14079.4" OriginY="2270.24" Indices="26,60;17,61;3,59;48,63;68,60;85,60;70,60;75,61;3,62;21,60;19,60;21,61;21" UnicodeString="7. March 2022" />
<Glyphs RenderTransform="0.0646215,0,0,0.0644991,0,0" Fill="#ff000000" FontUri="/Documents/1/Resources/Fonts/FF418D14-C0F5-49FA-8F94-42C185369528.odttf" FontRenderingEmSize="327.68" StyleSimulations="None" OriginX="836.8" OriginY="1929.92" Indices="53,59;82,60;82,59;80,62;3,58;20" UnicodeString="Room 1" />

您看到这种反直觉行为的原因可以通过仔细阅读(如果痛苦的话)XPS standard 来确定。您正在比较两组字形的 OriginY 值。根据规范第 12.1 节,OriginY 在有效坐标 space 中指定。再往下一点,它提到 RenderTransform 为字形 运行 建立了一个新的坐标系,这样做会影响字形的原点 x 和原点 y。

要确定页面上字形的实际坐标,您需要对 OriginX 和 OriginY 应用渲染变换。可以在第 14.4.1

节中找到 RenderTransform 如何工作的解释

对于这个具体示例,可以通过将 OriginX 乘以 RenderTransform 中的第一个值并将 OriginY 乘以 RenderTransform 中的第四个值来恢复字形的实际坐标。这并非在所有情况下都适用,因为第五个和第六个值可能指定额外的 x 和 y 偏移量,第二个和第三个值也会引入倾斜和旋转效果。