当前位置: 首页 > 知识库问答 >
问题:

将亮点/注释映射到pdf中的文本

上官思博
2023-03-14

因此,我有一个pdf文件示例,其中三个单词分别位于不同的行上:

"
hello
there
world
"

我在第二行突出显示了“那里”一词。在pdf内部,我试图将突出显示/注释结构映射到文本(BT)区域。

对应于单词“there”的部分看起来像这样:

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)?我是否在正确的位置查找并正确解释我的文本和/或突出显示注释坐标?

更新:

我想添加更多关于我如何创建此测试pdf的信息。

重新创建pdf非常简单。我去了谷歌文档,创建了一个空文档。我写了三行文字,如上所述。我下载了一个pdf文件,然后在adobe acrobat阅读器DC(我认为是最新的)中打开了它。然后,我使用adobe acrobat reader突出显示指定的行并重新保存。之后,我使用一些python解压缩pdf部分。用于解压缩pdf部分的python代码:

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

共有1个答案

堵琨
2023-03-14

不幸的是,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 坐标。

因此,现在be有一个坐标系统,原点在左上角,y坐标向下增加。

稍后在内容流中缩放坐标系

.75062972 0 0 .75062972 0 0 cm

因此,坐标单元被压缩到其原始宽度和高度的约3/4,即沿x或y的每个单元仅1/96“宽/高。

只有在将这些变换应用于坐标系之后,才会绘制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之间的注释矩形(见上文)匹配。

所以

我对我的文本如何映射到我所拥有的这个亮点有点困惑。坐标似乎不匹配(130 y vs 690 y)?我是否在正确的位置查找并正确解释我的文本和/或突出显示注释坐标?

坐标确实匹配,您只需确保应用当前转换矩阵和文本矩阵的转换即可。

 类似资料:
  • 问题内容: 几天前,我开始与Hibernate合作时,我只是想知道:假设您正在从头开始一个项目。您是否将使用基于注释的映射或Hibernate映射文件来生成数据库模式。 据我了解,Hibernate映射文件提供了一些注解所没有的功能(至少不是完全等效的功能)。但是,我仍然感觉到,如今,使用Hibernate的项目宁愿基于注释而不是Hibernate映射文件。 有没有人选择过注解上的映射文件,如果是

  • 我想让hibernate生成一些带有外键的表等等。我将给出我希望hibernate生成的查询的一个示例: 所以这个查询应该由hibernate通过注释生成。与此对应的类是: 有关中的应映射到的内容的示例(中的每个助记符在中只有一个值): 正如您所看到的,我在文档的帮助下做了一些尝试,但是我不能让Hibernate生成外键。如果有人能告诉我这个类需要的注释和值,那就太好了,这样我就可以自己为其他类做

  • 问题内容: 我有一张桌子DEAL和一张桌子DEAL_TYPE。我想映射以下代码: 问题在于数据已经存在于数据库中。而且我很难将类映射到数据库。 数据库看起来像这样: 我知道我可以在交易类型之间使用简单的@OneToMany关系,但是我更喜欢使用枚举。这可能吗? 我几乎可以通过使用EnumType.ORDINAL类型来使其工作。但不幸的是,我的交易类型表中的ID不是连续的,并且不是从1开始。 有什么

  • 问题内容: 今天,我试图使用Hibernate作为ORM创建一个应用程序。因此在创建时我有一个疑问。使用Hibernate映射文件(.hbm文件)或注释的最佳实践是什么?它的优缺点是什么?请帮助我理解。 问题答案: 没有功能上的差异。您可以使用两种方法(几乎)执行相同的操作 xml文件是在Java具有注释(在1.5中添加)之前使用的,因此可以将它们视为过时的映射方式 通常首选使用JPA注释,而不是

  • 我有一个简单的Maven servlet/jsp应用程序,我部署到本地Tomcat 9(通过Eclipse)。JSP页面存储在根文件夹()下,当Maven安装WAR时,它们位于根文件夹(旁边的和)下。 servlet的URL模式是为每个servlet注释的,例如,等。大多数servlet执行对各种JSP页面的调度,但是我在其中一个页面上有一个直接的锚链接。 我想将这些JSP页面移动到各自的目录中,

  • 问题内容: 我想要一个带pdf并返回文档中注释注释文本列表的python函数。我看过python- poppler(https://code.launchpad.net/~poppler-python/poppler- python/trunk ),但我不知道如何获取它来给我有用的东西。 我找到了该方法,并修改了通过调用它的演示程序,但是我不知道该如何处理AnnotMapping对象。它似乎没有完