可以使用 PyMuPDF 在 PDF 中按块搜索文本吗?
Can a text be searched Blockwise in a PDF using PyMuPDF?
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, "lines in block", block_type, block_no)
我的主要目标是:
在 PDF 中搜索文本并将其突出显示
要搜索的文本可以在一个页面中出现 n 次。使用 tp.search(text,hit_max=1)
它可以限制出现的最大次数,但它不会解决问题,因为它会 select 文本的第一次出现,但对我来说可能是第二次或第三次出现很重要。
我的想法是:
getTextBlocks 如上所述提取文本,使用此信息特别是 block_no,我想为该特定块执行 page.searchFor
功能。从逻辑上讲它应该是可能的,但实际上我需要关于如何去做的帮助。
对于实现主要目标的任何意见,我将不胜感激。
谢谢
作为序言,我想说你的问题会对我存储库的问题页面有所帮助。
Page.searchFor()
搜索页面上的任意数字文本项。限制是命中数,您必须在调用中指定一个限制。但是你可以在这里使用任何数字(例如 100)。此方法 不提取 文本,忽略字符大小写,还支持非水平文本或跨多行的文本。它的输出可以直接用于创建文本标记注释等。
您当然可以使用 Page.getText(option)
的变体来自由提取文本,然后运用您的技巧在输出中找到您想要的内容。 option
可能是 "text"、"words"、"blocks"、"dict"、"rawdict"、"html"、"xhtml" 或"xml"。显然,每个输出都有其优点和缺点。许多变体都带有文本位置信息或字体信息,包括文本颜色等。
但正如所说:这取决于你如何定位东西。让我再次建议我们在 Github 回购问题页面上继续这个对话,在那里我可以更好地指向其他资源。或者随时使用我的私人电子邮件。
如果您的问题的意思是 (1) 定位文本出现位置,然后 (2) link 每个出现的文本块编号,那么只需制作一个块矩形列表并检查每个出现的位置是否正确包含在块矩形中:
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))
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, "lines in block", block_type, block_no)
我的主要目标是:
在 PDF 中搜索文本并将其突出显示
要搜索的文本可以在一个页面中出现 n 次。使用 tp.search(text,hit_max=1)
它可以限制出现的最大次数,但它不会解决问题,因为它会 select 文本的第一次出现,但对我来说可能是第二次或第三次出现很重要。
我的想法是:
getTextBlocks 如上所述提取文本,使用此信息特别是 block_no,我想为该特定块执行 page.searchFor
功能。从逻辑上讲它应该是可能的,但实际上我需要关于如何去做的帮助。
对于实现主要目标的任何意见,我将不胜感激。
谢谢
作为序言,我想说你的问题会对我存储库的问题页面有所帮助。
Page.searchFor()
搜索页面上的任意数字文本项。限制是命中数,您必须在调用中指定一个限制。但是你可以在这里使用任何数字(例如 100)。此方法 不提取 文本,忽略字符大小写,还支持非水平文本或跨多行的文本。它的输出可以直接用于创建文本标记注释等。
您当然可以使用 Page.getText(option)
的变体来自由提取文本,然后运用您的技巧在输出中找到您想要的内容。 option
可能是 "text"、"words"、"blocks"、"dict"、"rawdict"、"html"、"xhtml" 或"xml"。显然,每个输出都有其优点和缺点。许多变体都带有文本位置信息或字体信息,包括文本颜色等。
但正如所说:这取决于你如何定位东西。让我再次建议我们在 Github 回购问题页面上继续这个对话,在那里我可以更好地指向其他资源。或者随时使用我的私人电子邮件。
如果您的问题的意思是 (1) 定位文本出现位置,然后 (2) link 每个出现的文本块编号,那么只需制作一个块矩形列表并检查每个出现的位置是否正确包含在块矩形中:
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))