将 highlights/annotations 映射到 pdf 中的文本
mapping highlights/annotations to text in pdf
所以我有这个示例 pdf 文件,在不同的行上有三个词:
"
hello
there
world
"
我在第二行突出显示了单词“there”。在内部,在 pdf 中,我试图将 highlight/annotation 结构映射到文本 (BT) 区域。
单词“那里”对应的部分看起来是这样的:
BT
/F0 14.6599998 Tf
1 0 0 -1 0 130 Tm
96 0 Td <0057> Tj
4.0719757 0 Td <004B> Tj
8.1511078 0 Td <0048> Tj
8.1511078 0 Td <0055> Tj
4.8806458 0 Td <0048> Tj
ET
我还有一个注释部分,其中我的突出显示具有以下矩形尺寸:
18 0 19 15 20 694 21 786 22 853 23 1058 24 1331 [19 0 R 20 0 R]<</AP<</N 10 0 R>>
...
(I left the top part of the annotation out on purpose because it is long. I extracted what i thought were the most important parts.
Rect[68.0024 690.459 101.054 706.37]
我对我的文本如何映射到我拥有的这一高亮显示感到困惑。坐标似乎不匹配(130 y vs 690 y)?我是否在正确的位置查看并解释了我的文本 and/or 正确突出显示注释坐标?
更新:
我想添加更多关于我如何创建此测试 pdf 的信息。
重新创建 pdf 非常简单。我去了 google 文档并创建了一个空文档。在三行上,我如上所述写了我的文本。我将其下载为 pdf 格式,然后在 adobe acrobat reader DC(我认为是最新的)中打开它。然后我使用 adobe acrobat reader 突出显示指定的行并重新保存它。之后,我使用了一些 python 来解压缩 pdf 部分。
python 解压缩 pdf 部分的代码:
import re
import zlib
pdf = open("helloworld.pdf", "rb").read()
stream = re.compile(r'.*?FlateDecode.*?stream(.*?)endstream', re.S)
for s in stream.findall(pdf):
s = s.strip('\r\n')
try:
print(zlib.decompress(s))
print("")
except:
pass
不幸的是,OP 只解释了他是如何创建文档的,并没有分享文档本身。我按照他的指示进行操作,但注释的坐标不同。不过,由于我只有这份文件用于解释,因此 OP 将不得不根据他的文件中的精确数字在心理上调整以下内容。
起始坐标系
文档中的起始(默认)用户坐标系由裁剪框暗示。在手边的文档中,裁剪框定义为
/CropBox [0 0 596 843]
即可见页面的宽度为 596 个单位,高度为 843 个单位(默认用户单位为 1/72",这是 A4 格式),原点位于左下角。x 坐标向右增加,y坐标向上增加。因此,通常也是数学开始的坐标系。
注释矩形
这也是标注矩形坐标的坐标系
就目前的情况而言,他们是
/Rect [68.0595 741.373 101.138 757.298]
即左下角在 (68.0595, 741.373) 和右上角在 (101.138, 757.298) 的矩形。
坐标系变换
在页面内容流中,直到 OP 已经识别的文本对象,坐标系被变换了很多次。
镜像、翻译
在页面内容的第一行
1 0 0 -1 0 843 cm
此变换将原点向上移动 843 个单位并镜像(乘以 -1)y 坐标。
这样,现在就有了一个坐标系,原点在左上,y坐标向下递增
缩放
稍后在内容流中缩放坐标系
.75062972 0 0 .75062972 0 0 cm
因此,坐标单元被压缩到其原始宽度和高度的大约 3/4,即每个单元沿 x 或 y 仅为 1/96" wide/high.
文本“那里”
只有将这些变换应用于坐标系后,才会绘制 OP 标识的文本对象。它从设置和更改文本矩阵开始:
1 0 0 -1 0 130 Tm
这将文本矩阵设置为在 y 方向平移 130 个单位并再次镜像 y 坐标。 (再次向后镜像是必要的,否则文本将被颠倒绘制。)
96 0 Td
这通过沿 x 轴移动 96 个单位来更改文本矩阵。
并且绘制文字的起点是坐标系的原点,先镜像和平移,然后对当前变换矩阵进行缩放,再根据文字进行镜像和平移矩阵.
匹配吗?
这个点在默认的用户坐标系中是哪个坐标?
x = (0 + 96) * .75062972 = 72 (approximately)
y = (((0 * (-1)) + 130) * .75062972) * (-1) + 843 = 745,4 (approximately)
这与 x 坐标在 68.0595 和 101.138 之间,y 坐标在 741.373 和 757.298 之间的注释矩形(见上文)匹配。
所以
I'm kind of confused about how my text is mapped to this one highlight that I have. The coordinates do not seem to match (130 y vs 690 y)? Am I looking in the right place and interpreting my text and/or highlight annotation coordinates correctly?
坐标确实匹配,您只需确保应用当前变换矩阵和文本矩阵的变换即可。
所以我有这个示例 pdf 文件,在不同的行上有三个词:
"
hello
there
world
"
我在第二行突出显示了单词“there”。在内部,在 pdf 中,我试图将 highlight/annotation 结构映射到文本 (BT) 区域。
单词“那里”对应的部分看起来是这样的:
BT
/F0 14.6599998 Tf
1 0 0 -1 0 130 Tm
96 0 Td <0057> Tj
4.0719757 0 Td <004B> Tj
8.1511078 0 Td <0048> Tj
8.1511078 0 Td <0055> Tj
4.8806458 0 Td <0048> Tj
ET
我还有一个注释部分,其中我的突出显示具有以下矩形尺寸:
18 0 19 15 20 694 21 786 22 853 23 1058 24 1331 [19 0 R 20 0 R]<</AP<</N 10 0 R>>
...
(I left the top part of the annotation out on purpose because it is long. I extracted what i thought were the most important parts.
Rect[68.0024 690.459 101.054 706.37]
我对我的文本如何映射到我拥有的这一高亮显示感到困惑。坐标似乎不匹配(130 y vs 690 y)?我是否在正确的位置查看并解释了我的文本 and/or 正确突出显示注释坐标?
更新:
我想添加更多关于我如何创建此测试 pdf 的信息。
重新创建 pdf 非常简单。我去了 google 文档并创建了一个空文档。在三行上,我如上所述写了我的文本。我将其下载为 pdf 格式,然后在 adobe acrobat reader DC(我认为是最新的)中打开它。然后我使用 adobe acrobat reader 突出显示指定的行并重新保存它。之后,我使用了一些 python 来解压缩 pdf 部分。 python 解压缩 pdf 部分的代码:
import re
import zlib
pdf = open("helloworld.pdf", "rb").read()
stream = re.compile(r'.*?FlateDecode.*?stream(.*?)endstream', re.S)
for s in stream.findall(pdf):
s = s.strip('\r\n')
try:
print(zlib.decompress(s))
print("")
except:
pass
不幸的是,OP 只解释了他是如何创建文档的,并没有分享文档本身。我按照他的指示进行操作,但注释的坐标不同。不过,由于我只有这份文件用于解释,因此 OP 将不得不根据他的文件中的精确数字在心理上调整以下内容。
起始坐标系
文档中的起始(默认)用户坐标系由裁剪框暗示。在手边的文档中,裁剪框定义为
/CropBox [0 0 596 843]
即可见页面的宽度为 596 个单位,高度为 843 个单位(默认用户单位为 1/72",这是 A4 格式),原点位于左下角。x 坐标向右增加,y坐标向上增加。因此,通常也是数学开始的坐标系。
注释矩形
这也是标注矩形坐标的坐标系
就目前的情况而言,他们是
/Rect [68.0595 741.373 101.138 757.298]
即左下角在 (68.0595, 741.373) 和右上角在 (101.138, 757.298) 的矩形。
坐标系变换
在页面内容流中,直到 OP 已经识别的文本对象,坐标系被变换了很多次。
镜像、翻译
在页面内容的第一行
1 0 0 -1 0 843 cm
此变换将原点向上移动 843 个单位并镜像(乘以 -1)y 坐标。
这样,现在就有了一个坐标系,原点在左上,y坐标向下递增
缩放
稍后在内容流中缩放坐标系
.75062972 0 0 .75062972 0 0 cm
因此,坐标单元被压缩到其原始宽度和高度的大约 3/4,即每个单元沿 x 或 y 仅为 1/96" wide/high.
文本“那里”
只有将这些变换应用于坐标系后,才会绘制 OP 标识的文本对象。它从设置和更改文本矩阵开始:
1 0 0 -1 0 130 Tm
这将文本矩阵设置为在 y 方向平移 130 个单位并再次镜像 y 坐标。 (再次向后镜像是必要的,否则文本将被颠倒绘制。)
96 0 Td
这通过沿 x 轴移动 96 个单位来更改文本矩阵。
并且绘制文字的起点是坐标系的原点,先镜像和平移,然后对当前变换矩阵进行缩放,再根据文字进行镜像和平移矩阵.
匹配吗?
这个点在默认的用户坐标系中是哪个坐标?
x = (0 + 96) * .75062972 = 72 (approximately)
y = (((0 * (-1)) + 130) * .75062972) * (-1) + 843 = 745,4 (approximately)
这与 x 坐标在 68.0595 和 101.138 之间,y 坐标在 741.373 和 757.298 之间的注释矩形(见上文)匹配。
所以
I'm kind of confused about how my text is mapped to this one highlight that I have. The coordinates do not seem to match (130 y vs 690 y)? Am I looking in the right place and interpreting my text and/or highlight annotation coordinates correctly?
坐标确实匹配,您只需确保应用当前变换矩阵和文本矩阵的变换即可。