使用pymupdf實現PDF內容搜索并顯示功能

簡介:
在日常工作和學習中,我們可能需要查找和提取PDF文件中的特定內容。本文將介紹如何使用Python編程語言和wxPython圖形用戶界面庫來實現一個簡單的PDF內容搜索工具。我們將使用PyMuPDF模塊來處理PDF文件,并結合wxPython構建一個用戶友好的界面。
C:\pythoncode\new\pdffindcontent.py
在這里插入圖片描述

準備工作

在開始之前,請確保已經安裝了Python和相應的模塊。可以使用pip來安裝wxPython和PyMuPDF模塊,具體安裝方法可以參考官方文檔。

創建GUI界面

我們首先需要創建一個GUI界面,以便用戶選擇要搜索的PDF文件并輸入要查找的內容。我們使用wxPython庫來創建界面。

def __init__(self, parent, title):super(PDFSearchFrame, self).__init__(parent, title=title, size=(800, 600))panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 選擇文件按鈕file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_OPEN|wx.FLP_FILE_MUST_EXIST)file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_selected)vbox.Add(file_picker, 0, wx.EXPAND|wx.ALL, 10)# 輸入框和按鈕hbox = wx.BoxSizer(wx.HORIZONTAL)self.search_text = wx.TextCtrl(panel)search_button = wx.Button(panel, label='搜索')search_button.Bind(wx.EVT_BUTTON, self.on_search)hbox.Add(self.search_text, 1, wx.EXPAND|wx.ALL, 5)hbox.Add(search_button, 0, wx.ALL, 5)vbox.Add(hbox, 0, wx.EXPAND|wx.ALL, 10)# 顯示框self.display_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY)vbox.Add(self.display_text, 1, wx.EXPAND|wx.ALL, 10)panel.SetSizer(vbox)self.Show()

在上述代碼中,我們創建了一個名為PDFSearchFrame的窗口類,它繼承自wxPython的wx.Frame類。在該類的構造函數中,我們創建了界面的各個組件,包括選擇文件按鈕、輸入框和搜索按鈕以及顯示框。

PDF內容搜索和提取

接下來,我們需要在代碼中添加PDF內容搜索和提取的功能。我們將使用PyMuPDF模塊來處理PDF文件。

# 導入所需模塊
import wx
import fitzdef on_search(self, event):search_text = self.search_text.GetValue()if not search_text or not self.pdf_path:returndoc = fitz.open(self.pdf_path)matches = []for page in doc:text = page.get_text().lower()if search_text.lower() in text:matches.append((page.number, text))self.display_text.SetValue('')if matches:for page_num, text in matches:self.display_text.AppendText(f"Page {page_num}:\n{text}\n\n")else:self.display_text.AppendText("未找到匹配的內容。")doc.close()

在上述代碼中,我們在on_search方法中添加了PDF內容搜索和提取的代碼。首先,我們使用fitz.open函數打開選擇的PDF文件,并遍歷每一頁的文本內容。然后,我們將文本內容轉換為小寫,并檢查搜索文本是否在其中。如果找到合適的匹配項,我們將它們存儲在matches列表中。最后,我們將匹配的結果顯示在顯示框中,如果沒有找到匹配的內容,則顯示相應的提示信息。

全部代碼

import wx
import fitzclass PDFSearchFrame(wx.Frame):def __init__(self, parent, title):super(PDFSearchFrame, self).__init__(parent, title=title, size=(800, 600))panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 選擇文件按鈕file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_OPEN|wx.FLP_FILE_MUST_EXIST)file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_selected)vbox.Add(file_picker, 0, wx.EXPAND|wx.ALL, 10)# 輸入框和按鈕hbox = wx.BoxSizer(wx.HORIZONTAL)self.search_text = wx.TextCtrl(panel)search_button = wx.Button(panel, label='搜索')search_button.Bind(wx.EVT_BUTTON, self.on_search)hbox.Add(self.search_text, 1, wx.EXPAND|wx.ALL, 5)hbox.Add(search_button, 0, wx.ALL, 5)vbox.Add(hbox, 0, wx.EXPAND|wx.ALL, 10)# 顯示框self.display_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY)vbox.Add(self.display_text, 1, wx.EXPAND|wx.ALL, 10)panel.SetSizer(vbox)self.Show()def on_file_selected(self, event):self.pdf_path = event.GetPath()def on_search(self, event):search_text = self.search_text.GetValue()if not search_text or not self.pdf_path:returndoc = fitz.open(self.pdf_path)matches = []for page in doc:text = page.get_text().lower()if search_text.lower() in text:matches.append((page.number, text))self.display_text.SetValue('')if matches:for page_num, text in matches:self.display_text.AppendText(f"Page {page_num}:\n{text}\n\n")else:self.display_text.AppendText("未找到匹配的內容。")doc.close()if __name__ == '__main__':app = wx.App()PDFSearchFrame(None, title="PDF搜索")app.MainLoop()

運行程序

完成以上步驟后,我們可以保存并運行這個程序。一個具有搜索功能的PDF內容搜索工具的窗口將會彈出。我們可以選擇要搜索的PDF文件,輸入要查找的內容,并點擊搜索按鈕。程序將會將匹配的結果顯示在顯示框中,包括找到的頁面號和相應的文本內容。

總結:
本文介紹了如何使用Python和wxPython庫來實現一個簡單的PDF內容搜索工具。通過結合PyMuPDF模塊和wxPython圖形界面,我們能夠方便地選擇PDF文件,并在輸入框中輸入要查找的內容。程序將搜索匹配的內容,并將找到的頁面內容提取到顯示框中。這個工具可以幫助我們快速查找和提取PDF文件中的特定內容,提高工作效率。

關鍵詞:Python、wxPython、PDF、內容搜索、PyMuPDF

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37238.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態HTTP代理與競爭情報收集的關聯

Hey,各位爬友們!作為一名專業的爬蟲HTTP代理提供者,今天我要和大家聊一聊動態HTTP代理與競爭情報收集之間的關聯。在這篇文章中,我將向大家解釋怎么使用動態HTTP代理完成在競爭中的情報收集,并分享一些實用的技巧。 首…

虹科方案 | 汽車總線協議轉換解決方案(二)

上期說到,虹科的PCAN-LIN網關在CAN、LIN總線轉換方面有顯著的作用,尤其是為BMS電池通信的測試提供了優秀的解決方案。假如您感興趣,可以點擊文末相關鏈接進行回顧! 而今天,虹科將繼續給大家帶來Router系列在各個領域的…

Netty:判斷ByteBuf底層是否被NIO direct buffer支撐

說明 io.netty.buffer.ByteBuf的函數isDirect()可以判斷該ByteBuf底層是否被NIO direct buffer支撐。如果結果返回true,表示底層被NIO direct buffer支撐。 示例 package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; imp…

elasticsearch 基礎

ES 搜索技術歷史 今天看的是《Elasticsearch實戰與原理解析》 第一章 搜索技術發展史 1、搜索技術發展史 宏觀而言,搜索引擎的發展經歷了五個尖端和兩大分類。五個階段分別是ftp文件檢索階段、分類目錄階段、文本相關性檢索階段、網頁鏈接分析階段和用戶意圖識別…

算法leetcode|69. x 的平方根(rust重拳出擊)

文章目錄 69. x 的平方根:樣例 1:樣例 2:提示: 分析:題解:rust:go:c:python:java: 69. x 的平方根: 給你一個非負整數 x &#xff0c…

win10電腦npm run dev報錯解決

npm run dev報錯解決 出現錯誤前的操作步驟錯誤日志解決步驟 出現錯誤前的操作步驟 初始化Vue項目 $ npm create vue3.6.1創建項目文件夾client Vue.js - The Progressive JavaScript Framework? Project name: ? client ? Add TypeScript? ? No ? Add JSX Support? …

【Pytorch:nn.Embedding】簡介以及使用方法:用于生成固定數量的具有指定維度的嵌入向量embedding vector

文章目錄 1、nn.Embedding2、使用場景 1、nn.Embedding 首先我們講解一下關于嵌入向量embedding vector的概念 1)在自然語言處理NLP領域,是將單詞、短語或其他文本單位映射到一個固定長度的實數向量空間中。嵌入向量具有較低的維度,通常在幾…

計算機網絡中速率和帶寬的區別

速率,指的是連接在計算機網絡上的主機在數字信道上傳送數據的速率,它也稱為數據率或比特率,單位是bps。速率往往指的是額定速率或者標稱速率,意思也就是在非常理想的情況下才能達到的數據傳送的速率,然而在現實生活中是…

[Mongodb 5.0]單機啟動

安裝完mongodb后,會自動生成下面兩個目錄(mongod.conf中設定的),用來存放日志和數據 /var/lib/mongo (數據目錄) /var/log/mongodb (日志目錄) 要啟動一個單機版的mongodb,一般有兩種方式: 第一種啟動方式:直接使用…

第5章:神經網絡

神經元模型 上述定義的簡單單元即為神經元模型。 多層網絡 誤差逆傳播算法 標準BP算法:參數更新非常頻繁,可能出現抵消現象。積累BP算法:下降到一定程度上,進行下一步會非常緩慢。 過擬合 早停:劃分訓練集和驗證集…

Java bean 是個什么概念?

Java bean可以把它比作一個"智能的容器",它具備封裝數據的能力。 Java bean是一種可重用的軟件組件,它主要用于在Java應用程序中存儲和傳遞數據。它是一種符合特定規范的Java類,通過封裝數據和提供訪問方法,使數據的管…

vue3+ts使用antv/x6

使用 2.x 版本 x6.antv 新官網: 安裝 npm install antv/x6 //"antv/x6": "^2.1.6",項目結構 1、初始化畫布 index.vue <template><div id"container"></div> </template><script setup langts> import { onM…

redis — 基于Spring Boot實現redis延遲隊列

1. 業務場景 延時隊列場景在我們日常業務開發中經常遇到&#xff0c;它是一種特殊類型的消息隊列&#xff0c;它允許把消息發送到隊列中&#xff0c;但不立即投遞給消費者&#xff0c;而是在一定時間后再將消息投遞給消費者。延遲隊列的常見使用場景有以下幾種&#xff1a; 在…

HoudiniVex筆記_P23_SDFBasics有向距離場

原視頻&#xff1a;https://www.youtube.com/playlist?listPLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI Bili&#xff1a;Houdini最強VEX算法教程 - VEX for Algorithmic Design_嗶哩嗶哩_bilibili Houdini版本&#xff1a;19.5 1、什么是SDF Houdini支持兩種體積類型&#xff0c;…

使用wxPython和PyMuPDF提取PDF頁面指定頁數的內容的應用程序

在本篇博客中&#xff0c;我們將探討如何使用wxPython和PyMuPDF庫創建一個簡單的Bokeh應用程序&#xff0c;用于選擇PDF文件并提取指定頁面的內容&#xff0c;并將提取的內容顯示在文本框中。 C:\pythoncode\new\pdfgetcontent.py 準備工作 首先&#xff0c;確保你已經安裝了…

44 | 酒店預訂及取消的數據分析

1.背景介紹 數據集來自Kaggle網站上公開的Hotel booking demand項目 該數據集包含了一家城市酒店和一家度假酒店的預訂信息,包括預訂時間、入住時間、成人、兒童或嬰兒數量、可用停車位數量等信息。 數據集容量約為12萬32 本次數據分析主要包含如下內容: 總覽數據,完成對…

大數據-玩轉數據-Flink網頁埋點PV統計

一、說明 衡量網站流量一個最簡單的指標&#xff0c;就是網站的頁面瀏覽量&#xff08;Page View&#xff0c;PV&#xff09;。用戶每次打開一個頁面便記錄1次PV&#xff0c;多次打開同一頁面則瀏覽量累計。 一般來說&#xff0c;PV與來訪者的數量成正比&#xff0c;但是PV并不…

虹科干貨 | 化身向量數據庫的Redis Enterprise——快速、準確、高效的非結構化數據解決方案!

用戶期望在他們遇到的每一個應用程序和網站都有搜索功能。然而&#xff0c;超過80%的商業數據是非結構化的&#xff0c;以文本、圖像、音頻、視頻或其他格式存儲。Redis Enterprise如何實現矢量相似性搜索呢&#xff1f;答案是&#xff0c;將AI驅動的搜索功能集成到Redis Enter…

STABLE DIFFUSION模型及插件的存放路徑

記錄下學習SD的一些心得&#xff0c;使用的是秋葉大佬的集成webui&#xff0c;下載了之后點擊啟動器即可開啟&#xff0c;文件夾中的內容如下 主模型存放在models文件下的stable-diffusion文件夾內&#xff0c;一些擴展類的插件是存放在extensions文件夾下

【MFC】12.雙緩沖序列化機制-筆記

雙緩沖 雙緩沖在之前寫字符雨的時候&#xff0c;已經簡單介紹過&#xff0c;今天我們來寫一個簡單的程序來體會雙緩沖機制 我們實現一個在屏幕上畫直線的功能&#xff1a; 在類中添加變量&#xff0c;保存起點坐標和終點坐標&#xff1a; //定義一個容器&#xff0c;保存每…