在 PDF 文件中查找文本位置

Posted

技术标签:

【中文标题】在 PDF 文件中查找文本位置【英文标题】:Find text position in PDF file 【发布时间】:2018-05-09 21:18:04 【问题描述】:

我有一个 PDF 文件,我正在尝试在 PDF 中查找特定文本并使用 Python 突出显示它。 我找到了PyPDF2,当我们在文件中给出想要的高亮位置的坐标时,可以highlight part of a PDF。

我正在尝试寻找一种工具,它可以为我提供给定文本在 PDF 中的位置。

【问题讨论】:

您是否尝试过搜索能够解析 PDF 文件的 Python 库? 希望这会有所帮助:***.com/questions/8971243/… 目前还没有运气搜索此功能(希望通过命令行工作)... 【参考方案1】:

PyMuPDF 可以通过坐标查找文本。您可以将它与 PyPDF2 突出显示方法结合使用来完成您所描述的内容。 或者你也可以use PyMuPDF to highlight the text。

以下是使用 PyMuPDF 查找文本和突出显示的示例代码:

import fitz

### READ IN PDF
doc = fitz.open("input.pdf")

for page in doc:
    ### SEARCH
    text = "Sample text"
    text_instances = page.searchFor(text)

    ### HIGHLIGHT
    for inst in text_instances:
        highlight = page.addHighlightAnnot(inst)
        highlight.update()


### OUTPUT
doc.save("output.pdf", garbage=4, deflate=True, clean=True)

【讨论】:

在 windows 上我无法安装 fitz。 @keramat 32/64 位版本存在问题。您需要安装较低版本的 PyMuPDF。 pip install PyMuPDF==1.16.7 工作,但默认的和最新的没有请看这里了解更多信息; github.com/pymupdf/PyMuPDF/issues/414 感谢@cilantro Ditrek,请告诉我是否有办法在该文本周围画一个红线框,而不是仅仅突出显示 上面的代码需要一点帮助。在highlight = ... 之后添加highlight.update() 另外,如果pdf 文档超过一页,则将### SEARCH### HIGHLIGHT 部分包装在for page in doc: 循环中并去掉page = doc[0] 在 Ubuntu 18.04 ''Bionic" 中它适用于 pip3 install PyMuPDF==1.16 ;即使我已经安装了 libmupdf-dev 1.12 版【参考方案2】:

如果您在 Windows 上使用 Acrobat Pro(不是阅读器),您可以尝试使用 Python 或 VBA 的旧组件对象模型。

import win32com, winerror, os
from win32com.client.dynamic import ERRORS_BAD_CONTEXT
ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL)
win32com.client.gencache.EnsureModule('E64169B3-3592-47d2-816E-602C5C13F328', 0, 1, 1)
avDoc = win32com.client.DispatchEx('AcroExch.AVDoc')
avDoc.Open(src, src)

avDoc.BringToFront()
pdDoc = avDoc.GetPDDoc()
jsoObject = pdDoc.GetJSObject()

for pageNo in range(1):
    pdfPage = pdDoc.AcquirePage(pageNo)
    pageHL = win32com.client.DispatchEx('AcroExch.HiliteList')
    _ = pageHL.Add(0, 9000)
    pageSel = pdfPage.CreatePageHilite(pageHL)

    pdfText = ""
    for wordNo in range(pageSel.GetNumText()):
        word = pageSel.GetText(wordNo)
        pdfText += word

        if keyword in pdfText:
            wordToHl = win32com.client.DispatchEx('AcroExch.HiliteList')
            wordToHl.Add(wordNo, 1)
            wordHl = pdfPage.CreateWordHilite(wordToHl)
            rect = wordHl.GetBoundingRect()
            annot = jsoObject.AddAnnot()
            props = annot.GetProps()
            props.Type = "Square"
            props.Page = pageNo
            props.Hidden = False
            props.Lock = True
            props.Name = word
            props.NoView = False
            props.Opacity = 0.3
            props.ReadOnly = True
            props.Style = "S"
            props.ToggleNoView = False
            props.PopupOpen = False
            popupRect = [rect.Left - 5, rect.Top + 5, rect.Left + 40, rect.Top - 20]
            props.Rect = popupRect
            props.PopupRect = popupRect
            props.StrokeColor = jsoObject.Color.Red
            props.FillColor = jsoObject.Color.Yellow

            annot.SetProps(props)
            print(f'Found keyword')

【讨论】:

以上是关于在 PDF 文件中查找文本位置的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 PDF 内文本的位置/坐标?

Linux Shell 文本处理工具

如何使用python代码查找PDF文件每一段的字体大小?

linux文本处理常用技巧

在 php 中使用 grep 命令在特定文件中查找字符串

python中怎么返回指定查找字符的位置