python 突出显示pdf文件中的文本,而不使用search_for()

ep6jt1vc  于 2023-02-11  发布在  Python
关注(0)|答案(1)|浏览(212)

我想使用PyMuPDF库高亮显示PDF文件中的文本。方法search_for()返回搜索单词的位置。问题是这个方法忽略空格。上下case.it只适用于ASCII字符。
是否有任何解决方案可以使用search_for()获得没有的位置\坐标
我的代码:

pattern=re.compile(r'(\[V2G2-\d{3}\])(\s{1,}\w(.+?)\.  )')
for m in re.finditer(pattern,text):
     macted.append(m.group())

def doHighleigh():
    pdf_document = fitz.open("ISO_15.pdf")
    page_num = pdf_document.page_count
    
    for i in range(page_num):
        page = pdf_document[i]

        for item in macted:
            search_instances = page.search_page_for(item,quad=True)
            
            for q in search_instances:
                highlight = page.add_highlight_annot(q)
                #RGB(127, 255, 255)
                highlight.set_colors({"stroke": (0.5, 1, 1), "fill": (0.75, 0.8, 0.95)})
                highlight.update()
    pdf_document.save(r"output.pdf")

它忽略了第二个句子,因为单词之间的空格。

a64a0gku

a64a0gku1#

使用search方法只是***获得高亮显示所需坐标的一种***方法。您还可以使用page.get_text()的任何变体返回文本坐标。查看您的示例,"blocks"变体可能就足够了,或者"words"和"blocks"提取的组合。
page.get_text("blocks")返回一个类似(x0, y0, x1, y1, "line1\nline2\n, ...", blocknumber, blocktype)的项目列表。元组中的前4个项目是包络矩形的坐标。
page.get_text("words")您也可以提取具有类似项目的单词列表(不包含空格的字符串):(x0, y0, x1, y1, "wordstring", blocknumber, linenumber, wordnumber).
你可以检查"单词"中匹配正则表达式模式的项,然后突出显示相应的块。也许甚至可以不用正则表达式来完成。下面是一个片段,可以满足你的意图:

def matches(word):
    if word.startswith("[V2G2-") and word.endswith(("]", "].")):
        return True
    return False

def add_highlight(page, rect):
    """Highlight annots have no fill color"""
    annot = page.add_highlight_annot(rect)
    annot.set_colors(stroke=(0.5,1,1))
    annot.update()

flags = fitz.TEXTFLAGS_TEXT  # need identical flags for all extractions
for page in doc:
    blocks = page.get_text("blocks", flags=flags)
    words = page.get_text("words", flags=flags)
    for word in words:
        blockn = word[-3]  # block number
        if matches(word[4]):
            block = blocks[blockn]  # get the containing block
            block_rect = fitz.Rect(block[:4])
            add_highlight(page, block_rect)

因此,这里使用的方法是:检查块中是否有匹配的单词。如果有,突出显示。

相关问题