最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用PyMuPDF實(shí)現(xiàn)PDF文件的智能注釋

 更新時(shí)間:2025年07月11日 10:39:44   作者:威碼視界  
在數(shù)字化辦公的浪潮中,處理和分析大量文檔成為了我們?nèi)粘9ぷ鞯囊徊糠?本文主要來(lái)和大家深入了解下Python如何使用PyMuPDF實(shí)現(xiàn)PDF文件的智能注釋吧

引言

在數(shù)字化辦公的浪潮中,處理和分析大量文檔成為了我們?nèi)粘9ぷ鞯囊徊糠?。尤其是面?duì)PDF文件,手動(dòng)檢索和標(biāo)注信息不僅耗時(shí)耗力,還難免疏漏。為了提升效率并減少人為失誤,我精心打造了這款Python腳本,它能夠智能化地在PDF文檔中定位并標(biāo)注Excel表格所指定的關(guān)鍵文本。本文將深入探討這一腳本的內(nèi)在邏輯,并指導(dǎo)你如何輕松駕馭這一自動(dòng)化工具。

程序的核心功能在于,它能夠識(shí)別Excel文件中B列的特定文本,一旦這些文本在PDF文檔中被找到,腳本便會(huì)自動(dòng)在這些文本周?chē)L制矩形框,并在相鄰位置以注釋的形式展示同一行A列的內(nèi)容。這一過(guò)程不僅提高了PDF文檔處理的速度,同時(shí)也確保了信息標(biāo)注的準(zhǔn)確性和一致性。接下來(lái),我將逐步展開(kāi),詳細(xì)解釋這一自動(dòng)化流程的每個(gè)關(guān)鍵步驟。

值得注意的是,隨著PyMuPDF庫(kù)的不斷更新迭代,PyMuPDF庫(kù)的語(yǔ)法已經(jīng)產(chǎn)生不小的變化和以及新功能的加入,使得現(xiàn)有網(wǎng)絡(luò)上的許多教程和文檔的語(yǔ)法已經(jīng)在某些情況下不再適用于最新版本使用需求。基于這一現(xiàn)狀,筆者投入了不少時(shí)間和精力進(jìn)行研究和實(shí)踐,以確保本腳本使用的是最新的、正確的語(yǔ)法和方法。

在這篇文章中,你將看到:

  • 最新版本的PyMuPDF的正確使用方式。
  • 如何利用PyMuPDF的強(qiáng)大功能來(lái)實(shí)現(xiàn)復(fù)雜的PDF處理任務(wù)。
  • 實(shí)用技巧和最佳實(shí)踐,幫助你避免常見(jiàn)的陷阱和錯(cuò)誤。

我希望通過(guò)分享這些經(jīng)過(guò)驗(yàn)證的知識(shí)和經(jīng)驗(yàn),能夠幫助你在自動(dòng)化PDF和Excel文件處理的道路上少走彎路,直接掌握最前沿的技術(shù)。無(wú)論你是編程新手還是資深開(kāi)發(fā)者,這篇文章都將為你提供寶貴的信息和指導(dǎo)。讓我們一起探索自動(dòng)化魔法的奧秘,釋放你的工作效率吧!

環(huán)境準(zhǔn)備

在開(kāi)始之前,請(qǐng)確保你的Python環(huán)境中安裝了以下庫(kù):

  • PyMuPDF:用于讀取、修改PDF文件。
  • openpyxl:用于讀取Excel文件。
  • Tkinter:用于創(chuàng)建圖形用戶界面(GUI)。

要安裝這三個(gè)庫(kù),你可以使用Python的包管理器pip。以下是安裝命令:

對(duì)于PyMuPDF:

pip install PyMuPDF

對(duì)于openpyxl:

pip install openpyxl

對(duì)于Tkinter(通常Python的安裝已經(jīng)包含了Tkinter,但如果沒(méi)有,你可以使用以下命令安裝):

pip install tk

請(qǐng)注意,如果你使用的是Python 3.x版本,通常pip命令已經(jīng)內(nèi)置在Python中,你可以直接使用它來(lái)安裝這些庫(kù)。如果你使用的是Python 2.x版本,可能需要使用pip2或pip3來(lái)指定正確的Python版本。

腳本功能概述

本腳本具有以下核心功能:

  • 通過(guò)GUI讓用戶選擇PDF和Excel文件。
  • 讀取Excel文件中B列數(shù)據(jù)以獲取指定的文本,并在PDF中搜索這些文本。
  • 在PDF中找到的文本位置添加矩形框和文本注釋。
  • 保存修改后的PDF文件,并提供選項(xiàng)讓用戶選擇保存路徑。
  • 腳本運(yùn)行結(jié)束后,提示用戶按特定鍵退出程序。

腳本詳解

1. 圖形用戶界面(GUI)

使用Tkinter庫(kù)創(chuàng)建一個(gè)簡(jiǎn)潔的GUI,讓用戶能夠方便地選擇需要處理的文件。

# 創(chuàng)建Tk窗口對(duì)象并立即銷(xiāo)毀,用于文件對(duì)話框
root = Tk()
root.withdraw()

# 使用tkinter.filedialog獲取PDF文件路徑
input_file_pdf = filedialog.askopenfilename(
    title="請(qǐng)選擇PDF文件",  # 對(duì)話框標(biāo)題
    filetypes=(("PDF files", "*.pdf"), ("All files", "*.*"))  # 文件類(lèi)型過(guò)濾
)

# 如果用戶取消了文件選擇,就退出程序
if not input_file_pdf:
    print("未選擇文件,程序?qū)⑼顺觥?)
    exit()

2. 打開(kāi)和讀取文件

使用PyMuPDF打開(kāi)用戶選擇的PDF文件,使用openpyxl讀取Excel文件,并獲取活動(dòng)工作表。

# 打開(kāi)PDF文件
print("正在打開(kāi)PDF文件,請(qǐng)稍候...")
doc = fitz.open(input_file_pdf)  # 使用PyMuPDF打開(kāi)PDF文件
print("已打開(kāi)PDF文件,請(qǐng)稍候...")

# 使用tkinter.filedialog獲取Excel文件路徑
input_file_excel = filedialog.askopenfilename(
    title="請(qǐng)選擇Excel文件",  # 對(duì)話框標(biāo)題
    filetypes=(("Excel files", "*.xlsx"), ("All files", "*.*"))  # 文件類(lèi)型過(guò)濾
)

# 如果用戶取消了文件選擇,就退出程序
if not input_file_excel:
    print("未選擇文件,程序?qū)⑼顺觥?)
    exit()

3. 搜索和注釋

遍歷Excel工作表的每一行,使用PyMuPDF的搜索功能在PDF中查找指定文本,并在找到的位置添加矩形框和文本注釋。

# 遍歷Excel的每一行,從第二行開(kāi)始讀取
for row in ws.iter_rows(min_row=1, values_only=True):
    text = str(row[0])  # 獲取A列的值
    text_to_search = row[1]  # 獲取B列的值

    print(f"正在處理Excel中的文本:'{text}' 和 '{text_to_search}'")

    # 用于跟蹤是否在當(dāng)前循環(huán)中找到文本的變量
    page_text_found = False

    # 遍歷PDF的每一頁(yè)
    for page_number in range(len(doc)):
        page = doc[page_number]  # 訪問(wèn)當(dāng)前頁(yè)
        areas = page.search_for(text_to_search)  # 在當(dāng)前頁(yè)搜索文本

        # 如果在頁(yè)面上找到文本,添加擴(kuò)大的矩形框和文本注釋
        if areas:
            page_text_found = True

            for area in areas:
                x0, y0, x1, y1 = area
                print(f"在第 {page_number + 1} 頁(yè)找到文本 '{text_to_search}'")

                # 擴(kuò)大矩形框
                new_x0 = 27.7  # 根據(jù)需要調(diào)整
                new_y0 = y0 - down_size
                new_x1 = 524.6  # 根據(jù)需要調(diào)整
                new_y1 = y1 + up_size

                # 創(chuàng)建擴(kuò)大后的矩形區(qū)域
                rect = fitz.Rect(new_x0, new_y0, new_x1, new_y1)
                # 添加矩形注釋
                annot = page.add_rect_annot(rect)
                annot.set_border(width=2)
                annot.update(opacity=1)

                # 添加文本注釋
                new_rect = fitz.Rect(5, new_y0 + 3, 10 + 50, new_y0 + 15)
                annot = page.add_freetext_annot(new_rect, text, fontsize=12, text_color=(1, 0, 0))

            # 由于找到文本后已添加注釋?zhuān)梢蕴鰞?nèi)層循環(huán)
            break

    # 如果在當(dāng)前Excel行的搜索中沒(méi)有找到文本,則告知用戶
    if not page_text_found:
        print(f"在整個(gè)PDF中沒(méi)有找到文本 '{text_to_search}'。")

4. 保存和退出

用戶選擇保存路徑后,腳本將保存修改后的PDF文件,并在所有操作完成后提示用戶按特定鍵退出程序。

# 使用tkinter.filedialog獲取保存PDF的文件路徑
output_file_pdf = filedialog.asksaveasfilename(
    title="請(qǐng)輸入要保存的PDF文件路徑",
    filetypes=(("PDF files", "*.pdf"), ("All files", "*.*")),
    defaultextension=".pdf"  # 設(shè)置默認(rèn)擴(kuò)展名為PDF
)

# 如果用戶取消了保存文件選擇,就退出程序
if not output_file_pdf:
    print("未選擇保存路徑,程序?qū)⑼顺觥?)
    exit()

print("正在保存修改后的PDF文件,請(qǐng)稍候...")
doc.save(output_file_pdf)  # 保存修改后的PDF文件
print("修改后的PDF文件已保存。")

# 關(guān)閉文檔
doc.close()  # 關(guān)閉PyMuPDF文檔
print("搜索完成,PDF文件已關(guān)閉。")

代碼示例文件與截圖

Excel文件原內(nèi)容

PDF文件原內(nèi)容

程序運(yùn)行后PDF文件內(nèi)容

代碼運(yùn)行截圖

完整代碼

# 導(dǎo)入PyMuPDF庫(kù),用于處理PDF文件
import fitz
# 導(dǎo)入openpyxl庫(kù)中的load_workbook函數(shù),用于處理Excel文件
from openpyxl import load_workbook
# 導(dǎo)入Tk和filedialog,用于創(chuàng)建圖形用戶界面對(duì)話框
from tkinter import Tk, filedialog

# 創(chuàng)建Tk窗口對(duì)象并立即銷(xiāo)毀,用于文件對(duì)話框
root = Tk()
root.withdraw()

# 使用tkinter.filedialog獲取PDF文件路徑
input_file_pdf = filedialog.askopenfilename(
    title="請(qǐng)選擇PDF文件",  # 對(duì)話框標(biāo)題
    filetypes=(("PDF files", "*.pdf"), ("All files", "*.*"))  # 文件類(lèi)型過(guò)濾
)

# 如果用戶取消了文件選擇,就退出程序
if not input_file_pdf:
    print("未選擇文件,程序?qū)⑼顺觥?)
    exit()

# 打開(kāi)PDF文件
print("正在打開(kāi)PDF文件,請(qǐng)稍候...")
doc = fitz.open(input_file_pdf)  # 使用PyMuPDF打開(kāi)PDF文件
print("已打開(kāi)PDF文件,請(qǐng)稍候...")

# 使用tkinter.filedialog獲取Excel文件路徑
input_file_excel = filedialog.askopenfilename(
    title="請(qǐng)選擇Excel文件",  # 對(duì)話框標(biāo)題
    filetypes=(("Excel files", "*.xlsx"), ("All files", "*.*"))  # 文件類(lèi)型過(guò)濾
)

# 如果用戶取消了文件選擇,就退出程序
if not input_file_excel:
    print("未選擇文件,程序?qū)⑼顺觥?)
    exit()

# 打開(kāi)Excel文件
print("正在打開(kāi)Excel文件,請(qǐng)稍候...")
wb = load_workbook(filename=input_file_excel)  # 加載Excel文件
ws = wb.active  # 獲取活動(dòng)工作表

# 矩形擴(kuò)大的尺寸
up_size = 5  # 上邊擴(kuò)大的尺寸
down_size = 3  # 下邊擴(kuò)大的尺寸
left_size = 77.5  # 左邊擴(kuò)大的尺寸
right_size = 389.5  # 右邊擴(kuò)大的尺寸

# 遍歷Excel的每一行,從第二行開(kāi)始讀取
for row in ws.iter_rows(min_row=1, values_only=True):
    text = str(row[0])  # 獲取A列的值
    text_to_search = row[1]  # 獲取B列的值

    print(f"正在處理Excel中的文本:'{text}' 和 '{text_to_search}'")

    # 用于跟蹤是否在當(dāng)前循環(huán)中找到文本的變量
    page_text_found = False

    # 遍歷PDF的每一頁(yè)
    for page_number in range(len(doc)):
        page = doc[page_number]  # 訪問(wèn)當(dāng)前頁(yè)
        areas = page.search_for(text_to_search)  # 在當(dāng)前頁(yè)搜索文本

        # 如果在頁(yè)面上找到文本,添加擴(kuò)大的矩形框和文本注釋
        if areas:
            page_text_found = True

            for area in areas:
                x0, y0, x1, y1 = area
                print(f"在第 {page_number + 1} 頁(yè)找到文本 '{text_to_search}'")

                # 擴(kuò)大矩形框
                new_x0 = 27.7  # 根據(jù)需要調(diào)整
                new_y0 = y0 - down_size
                new_x1 = 524.6  # 根據(jù)需要調(diào)整
                new_y1 = y1 + up_size

                # 創(chuàng)建擴(kuò)大后的矩形區(qū)域
                rect = fitz.Rect(new_x0, new_y0, new_x1, new_y1)
                # 添加矩形注釋
                annot = page.add_rect_annot(rect)
                annot.set_border(width=2)
                annot.update(opacity=1)

                # 添加文本注釋
                new_rect = fitz.Rect(5, new_y0 + 3, 10 + 50, new_y0 + 15)
                annot = page.add_freetext_annot(new_rect, text, fontsize=12, text_color=(1, 0, 0))

            # 由于找到文本后已添加注釋?zhuān)梢蕴鰞?nèi)層循環(huán)
            break

    # 如果在當(dāng)前Excel行的搜索中沒(méi)有找到文本,則告知用戶
    if not page_text_found:
        print(f"在整個(gè)PDF中沒(méi)有找到文本 '{text_to_search}'。")

# 使用tkinter.filedialog獲取保存PDF的文件路徑
output_file_pdf = filedialog.asksaveasfilename(
    title="請(qǐng)輸入要保存的PDF文件路徑",
    filetypes=(("PDF files", "*.pdf"), ("All files", "*.*")),
    defaultextension=".pdf"  # 設(shè)置默認(rèn)擴(kuò)展名為PDF
)

# 如果用戶取消了保存文件選擇,就退出程序
if not output_file_pdf:
    print("未選擇保存路徑,程序?qū)⑼顺觥?)
    exit()

print("正在保存修改后的PDF文件,請(qǐng)稍候...")
doc.save(output_file_pdf)  # 保存修改后的PDF文件
print("修改后的PDF文件已保存。")

# 關(guān)閉文檔
doc.close()  # 關(guān)閉PyMuPDF文檔
print("搜索完成,PDF文件已關(guān)閉。")

# 提示用戶按下q鍵退出程序,并檢查輸入
print("程序運(yùn)行結(jié)束,按 'q' 鍵退出程序(不區(qū)分大小寫(xiě))。")
while True:  # 創(chuàng)建一個(gè)無(wú)限循環(huán)
    key = input().strip().lower()  # 獲取用戶輸入并轉(zhuǎn)換為小寫(xiě)
    if key == 'q':  # 檢查輸入是否是 'q'
        break  # 如果是 'q',退出循環(huán)
    else:
        print("請(qǐng)輸入 'q' 以退出程序。")

結(jié)語(yǔ)

這個(gè)Python腳本提供了一種高效、自動(dòng)化的方式來(lái)處理PDF和Excel文件,尤其適用于需要在大量文檔中搜索和標(biāo)記特定信息的場(chǎng)景。通過(guò)使用這個(gè)腳本,你可以節(jié)省寶貴的時(shí)間,減少人為錯(cuò)誤,提高工作效率。

到此這篇關(guān)于Python使用PyMuPDF實(shí)現(xiàn)PDF文件的智能注釋的文章就介紹到這了,更多相關(guān)Python PDF智能注釋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pandas DataFrame實(shí)現(xiàn)任意位置插入一列或一行

    Pandas DataFrame實(shí)現(xiàn)任意位置插入一列或一行

    Pandas是Python中最流行的數(shù)據(jù)處理和分析庫(kù)之一,在數(shù)據(jù)分析過(guò)程中,有時(shí)候需要在Dataframe中插入新的數(shù)據(jù)列,本文主要介紹了Pandas DataFrame實(shí)現(xiàn)任意位置插入一列或一行,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 基于Python實(shí)現(xiàn)煙花效果的示例代碼

    基于Python實(shí)現(xiàn)煙花效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python制作出煙花的效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-06-06
  • python第三方庫(kù)subprocess執(zhí)行cmd同時(shí)輸入密碼獲取參數(shù)

    python第三方庫(kù)subprocess執(zhí)行cmd同時(shí)輸入密碼獲取參數(shù)

    本文給大家介紹python subprocess執(zhí)行cmd同時(shí)輸入密碼獲取參數(shù),手動(dòng)輸入cmd命令,本文給大家逐一介紹這個(gè)命令的使用方法,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • django 認(rèn)證類(lèi)配置實(shí)現(xiàn)

    django 認(rèn)證類(lèi)配置實(shí)現(xiàn)

    本文主要介紹了django 認(rèn)證類(lèi)配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python中Mako庫(kù)實(shí)例用法

    python中Mako庫(kù)實(shí)例用法

    在本篇文章里小編給大家分享的是一篇關(guān)于python中Mako庫(kù)實(shí)例用法的相關(guān)文章,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • Python跨文件調(diào)用函數(shù)以及在一個(gè)文件中執(zhí)行另一個(gè)文件

    Python跨文件調(diào)用函數(shù)以及在一個(gè)文件中執(zhí)行另一個(gè)文件

    這篇文章主要給大家介紹了關(guān)于Python跨文件調(diào)用函數(shù)以及在一個(gè)文件中執(zhí)行另一個(gè)文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Python pandas如何獲取數(shù)據(jù)的行數(shù)和列數(shù)

    Python pandas如何獲取數(shù)據(jù)的行數(shù)和列數(shù)

    這篇文章主要介紹了Python pandas如何獲取數(shù)據(jù)的行數(shù)和列數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python實(shí)現(xiàn)的堆排序算法原理與用法實(shí)例分析

    Python實(shí)現(xiàn)的堆排序算法原理與用法實(shí)例分析

    這篇文章主要介紹了Python實(shí)現(xiàn)的堆排序算法,簡(jiǎn)單描述了堆排序的原理,并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)堆排序的相關(guān)操作技巧,代碼中備有較為詳細(xì)的注釋便于理解,需要的朋友可以參考下
    2017-11-11
  • python數(shù)組和矩陣的用法解讀

    python數(shù)組和矩陣的用法解讀

    這篇文章主要介紹了python數(shù)組和矩陣的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解Python3中的Sequence type的使用

    詳解Python3中的Sequence type的使用

    這篇文章主要介紹了詳解Python3中的Sequence type的使用,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08

最新評(píng)論

根河市| 潞西市| 运城市| 上思县| 红安县| 牙克石市| 克拉玛依市| 荆门市| 孙吴县| 奉化市| 榆中县| 循化| 克拉玛依市| 徐汇区| 塔河县| 根河市| 榆中县| 嘉祥县| 绥化市| 健康| 三穗县| 广昌县| 常宁市| 绥中县| 隆安县| 天全县| 南和县| 盐亭县| 杂多县| 江永县| 苍梧县| 西乌| 华安县| 清丰县| 郸城县| 江达县| 嵊州市| 多伦县| 翁牛特旗| 扶沟县| 溧阳市|