在 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 文件中查找文本位置的主要内容,如果未能解决你的问题,请参考以下文章