1
page.getTextBlocks()

输出

[(42.5, 86.45002746582031, 523.260009765625, 100.22002410888672, TEXT, 0, 0),
(65.75, 103.4000244140625, 266.780029296875, 159.59010314941406, TEXT, 1, 0),
(48.5, 86.123456, 438.292048492, 100.92920404974, TEXT, 0, 0)]

(x0, y0, x1, y1, "块中的行", block_type, block_no)

我的主要目标是:

在 PDF 中搜索文本并将其突出显示 必须搜索的文本在一页中可以存在 n 次。使用tp.search(text,hit_max=1)它可能会限制出现的最大数量,但它不会解决问题,因为它会选择文本的第一次出现,但对我来说可能是第二次或第三次出现很重要。

我的想法是:

getTextBlocks 提取上面提到的文本,使用这个信息特别是 block_no,我想page.searchFor为那个特定的块执行功能。从逻辑上讲它应该是可能的,但实际上我需要关于如何做到这一点的帮助。

对于实现主要目标的任何投入,我将不胜感激。

谢谢

4

1 回答 1

1

作为前言,让我说您的问题将使我的存储库的问题页面受益。

Page.searchFor()在页面上搜索任意数量的文本项。限制是命中数,您必须在调用中指定一个限制。但是您可以在这里使用任何数字(例如 100)。此方法不提取文本,忽略字符大小写,还支持非水平文本或跨多行分布的文本。它的输出可直接用于创建文本标记注释等。

您当然可以通过使用变体来提取文本,Page.getText(option)然后运用您的技巧在输出中找到您想要的内容。option可以是“text”、“words”、“blocks”、“dict”、“rawdict”、“html”、“xhtml”或“xml”。每个输出都有其优点和缺点。许多变体带有文本位置信息或字体信息,包括文本颜色等。但正如所说:如何定位内容取决于您。让我再次建议我们在 Github repo 问题页面上继续这个对话,在那里我可以更好地指向其他资源。或者随时使用我的私人电子邮件。

如果您的问题是(1)定位文本出现,然后(2)将每个出现链接到一个文本块编号,那么只需制作一个块矩形列表并检查每个出现是否包含在块矩形中:

for j, rect in enumerate(page.searchFor(text,...)):
    for i, bbox in enumerate(block_rectangles):
        if rect in bbox:
            print("occurrence %i is contained in block %i" % (j, i))
于 2020-06-11T11:37:26.983 回答