【问题标题】:Can a text be searched Blockwise in a PDF using PyMuPDF?可以使用 PyMuPDF 在 PDF 中逐块搜索文本吗?
【发布时间】:2020-06-11 10:26:52
【问题描述】:
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.searchForfunction。逻辑上应该是可能的,但实际上我需要帮助。

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

谢谢

【问题讨论】:

    标签: python pdf text-search pymupdf


    【解决方案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))
    

    【讨论】:

    • 非常感谢@Jorj 理解问题并展示解决问题的方法。我希望它也对存储库页面有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 2022-08-05
    • 2022-09-26
    • 1970-01-01
    • 2019-05-09
    • 2013-06-10
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多