1分鐘用DeepSeek編寫一個PDF轉Word軟件

一、引言

如今,在線工具的普及讓PDF轉Word成為了一個常見需求,常見的pdf轉word工具有收費的wps,免費的有pdfgear,見下文:

PDFgear:一款免費的PDF編輯、格式轉化軟件-CSDN博客

還有網上在線的免費pdf轉word工具smallpdf, ilovepdf, 24pdf等。然而,大部分免費的在線轉換工具都存在一些嚴重的隱私風險——文件往往需要上傳至云端進行處理,這樣操作極容易泄露敏感信息。

而且,許多在線平臺都要求付費才能使用更高效的服務,如wps, 迅捷pdf等,這導致很多用戶在無法快捷使用轉換文件的服務。

為了避免上述問題,我決定利用Python開發一款本地化的PDF批量轉換為Word的軟件,不僅保證文件的隱私安全,還能提供完全免費、快捷、個性化的轉換服務。

更重要的是,這個項目也有助于我鞏固Python編程知識,深入運用DeepSeek模型提升編程能力。

二、軟件的主要功能

這款PDF轉word的主要功能包括:

1. 100%離線文檔轉換。有效地避免信息的泄露,同時也加快了文檔的處理速度。

2. 支持批量PDF轉Word:軟件會自動掃描選擇文件夾及其子文件夾(如果勾選了相關選項),并將其中的PDF文件轉換為Word文檔,可以節省用法大量的時間。

3. 文件夾選擇與管理:用戶可以選擇輸入和輸出文件夾,支持自定義中英文路徑。

4. 進度條顯示:在轉換過程中,軟件會實時更新進度條,顯示當前文件的轉換進度以及整體的轉換進度。

5. 自動打開目標文件夾:轉換完成后,用戶可以選擇是否自動打開目標文件夾,查看轉換結果,以便進一步操作。

三、設計過程

在設計這款應用時,我采用了Python的tkinter圖形化界面和pdf2docx庫來實現文件轉換功能。具體如下圖:

PDF轉Word界面

用戶界面:界面設計以簡潔易用為主。通過tkinter的標簽、文本框、按鈕等控件,我實現了文件夾選擇、設置選項、進度條顯示等功能。

PDF轉Word功能:因為有現成的pdf2docx的庫,我采用了這個輪來進行PDF到Word格式的轉換,再加上Python的批量處理功能,要以輕松滿足我的文件轉換需求。

多線程與進度更新:為避免界面卡頓,我使用了threading庫來將文件轉換操作放入獨立線程,并利用queue進行線程間通信,實時更新進度條顯示。

我們在設計時,借助了DeepSeek R1的深度思考模型。先上傳軟件圖片,然后給出指令:

軟件開發提示詞

為了減少錯誤,我們在提示詞加入了讓deepseek進行自我運行代碼,進行調試的功能,減少用戶本地測試中產生的bug。

在其回復中,我們看到它針對我的提問題也進行了回答,尤其是在指定的Python環境下進行了測試。

DeepSeek自主調試功能

經過測試,代碼運行無誤,但是缺少進度條功能,可能是沒有識別出來,或者漏掉了,于是通過追加提問:

這里我故意打錯了一個漢字,但是DeepSeek還能正確地進行理解,同時很好地解決了進度條缺失的問題。就這樣,我們通過兩步,不到1分鐘就可以把這個一個pdf轉word工具制作出來。

在開發過程中,我為DeepSeek提供了完整的開發環境,DeepSeek通過對項目需求的分析,建議我添加更多的異常處理機制,特別是在文件路徑不正確或者文件損壞的情況下的處理。最終,這些改進使得程序的穩定性和用戶體驗都得到了顯著提升。

經過多次的調試和優化,軟件終于成型,并可以穩定運行。用戶只需選擇文件夾并點擊轉換按鈕,程序就會自動處理所有PDF文件,最終輸出為Word格式。每一步的轉換進度都會實時更新,確保用戶能夠清晰地了解當前狀態。

四、代碼展示

廢話不多說,直接上軟件的全部代碼,同時提供了一些中文注釋,供大家學習使用

import os
import tkinter as tk
from tkinter import ttk,filedialog, messagebox
from pdf2docx import Converter
import threading
import queueclass PDFToWordConverter:def __init__(self, master):self.master = mastermaster.title("PDF批量轉Word")master.geometry("610x295")# 輸入文件夾self.lbl_input = tk.Label(master, text="輸入文件夾:")self.ent_input = tk.Entry(master, width=30)self.btn_input = tk.Button(master, text="選擇", command=self.select_input)# 輸出文件夾self.lbl_output = tk.Label(master, text="輸出文件夾:")self.ent_output = tk.Entry(master, width=30)self.btn_output = tk.Button(master, text="選擇", command=self.select_output)# 復選框self.var_subdir = tk.BooleanVar()self.var_open = tk.BooleanVar(value=True)self.chk_subdir = tk.Checkbutton(master, text="包含子文件夾", variable=self.var_subdir)self.chk_open = tk.Checkbutton(master, text="轉換完成后打開目標文件夾", variable=self.var_open)# 轉換按鈕self.btn_convert = tk.Button(master, text="開始轉換", command=self.start_conversion)# 布局self.lbl_input.grid(row=0, column=0, padx=10, pady=10, sticky=tk.W)self.ent_input.grid(row=0, column=1, padx=5, pady=10, sticky=tk.EW)self.btn_input.grid(row=0, column=2, padx=10, pady=10)self.lbl_output.grid(row=1, column=0, padx=10, pady=10, sticky=tk.W)self.ent_output.grid(row=1, column=1, padx=5, pady=10, sticky=tk.EW)self.btn_output.grid(row=1, column=2, padx=10, pady=10)self.chk_subdir.grid(row=2, column=1, padx=5, pady=5, sticky=tk.W)self.chk_open.grid(row=3, column=1, padx=5, pady=5, sticky=tk.W)self.btn_convert.grid(row=4, column=1, pady=10)# 新增進度組件self.progress_label = tk.Label(master, text="準備就緒")self.progress_bar = ttk.Progressbar(master, orient=tk.HORIZONTAL, mode='determinate')# 調整布局(新增兩行)self.progress_label.grid(row=5, column=0, columnspan=3, padx=10, pady=5, sticky=tk.W)self.progress_bar.grid(row=6, column=0, columnspan=3, padx=10, pady=10, sticky=tk.EW)# 消息隊列用于線程通信self.queue = queue.Queue()master.after(100, self.process_queue)# 配置列權重master.columnconfigure(1, weight=1)def select_input(self):path = filedialog.askdirectory()if path:self.ent_input.delete(0, tk.END)self.ent_input.insert(0, path)def select_output(self):path = filedialog.askdirectory()if path:self.ent_output.delete(0, tk.END)self.ent_output.insert(0, path)def start_conversion(self):# 重置進度條self.progress_bar['value'] = 0self.progress_label.config(text="正在掃描PDF文件...")input_dir = self.ent_input.get()output_dir = self.ent_output.get()if not input_dir or not output_dir:messagebox.showerror("錯誤", "請先選擇輸入和輸出文件夾!")return# 禁用轉換按鈕self.btn_convert.config(state=tk.DISABLED)threading.Thread(target=self.convert_files, args=(input_dir, output_dir), daemon=True).start()def get_pdf_list(self, input_dir):pdf_list = []for root, dirs, files in os.walk(input_dir):if not self.var_subdir.get() and root != input_dir:continuefor file in files:if file.lower().endswith('.pdf'):pdf_list.append(os.path.join(root, file))return pdf_listdef convert_files(self, input_dir, output_dir):self.pdf_files = self.get_pdf_list(input_dir)try:total_files = len(self.pdf_files)for index, pdf_path in enumerate(self.pdf_files):# 更新當前文件進度self.queue.put(("file_progress", (index+1, total_files, pdf_path)))# 構建輸出路徑relative_path = os.path.relpath(os.path.dirname(pdf_path), input_dir) if self.var_subdir.get() else ""output_path = os.path.join(output_dir, relative_path)os.makedirs(output_path, exist_ok=True)# 轉換文件docx_path = os.path.join(output_path, f"{os.path.splitext(os.path.basename(pdf_path))[0]}.docx")cv = Converter(pdf_path)cv.convert(docx_path, progress_callback=self.update_page_progress)cv.close()self.queue.put(("complete", None))except Exception as e:self.queue.put(("error", str(e)))def update_page_progress(self, current, total):# 頁面級別進度(每文件0-100%)progress = (current / total) * 100 if total != 0 else 0self.queue.put(("page_progress", progress))def process_queue(self):try:while True:msg_type, data = self.queue.get_nowait()if msg_type == "file_progress":current, total, path = datafile_progress = (current / total) * 100self.progress_bar['value'] = file_progressself.progress_label.config(text=f"正在轉換 {current}/{total}:{os.path.basename(path)}")elif msg_type == "page_progress":# 綜合進度 = 文件進度 + 頁面進度/總文件數current_file_progress = self.progress_bar['value']page_progress = data / len(self.pdf_files)self.progress_bar['value'] = current_file_progress + page_progresselif msg_type == "complete":messagebox.showinfo("完成", "轉換完成!")if self.var_open.get():os.startfile(self.ent_output.get())self.btn_convert.config(state=tk.NORMAL)self.progress_label.config(text="轉換完成")elif msg_type == "error":messagebox.showerror("錯誤", f"轉換出錯:{data}")self.btn_convert.config(state=tk.NORMAL)self.progress_label.config(text="轉換出錯")except queue.Empty:passfinally:self.master.after(100, self.process_queue)
if __name__ == "__main__":root = tk.Tk()app = PDFToWordConverter(root)root.mainloop()

五、注意事項與啟示

文件路徑問題:在處理文件時,一定要注意文件路徑的正確性,尤其是在跨平臺使用時,路徑分隔符的差異可能會導致問題。

多線程同步:為了避免界面卡頓或響應不及時,使用線程來執行耗時任務是非常必要的。但在多線程操作中,確保線程間數據同步和UI更新是一個技術挑戰。

與AI工具合作:DeepSeek的輔助對我來說至關重要。在未來的開發過程中,AI工具不僅能提升我的編程效率,還能為項目帶來新的創意和解決方案。

通過這個項目,我利用DeepSeek R1模型,上傳軟件圖片,給出提示詞,讓它很快地開發出來一個可以平穩運行的軟件,通過與AI模型的持續會話,進一步修改和完善了軟件,直至可以使用。

有了DeepSeek這樣的模型,未來我們只需要想法,就可以讓大模型幫我們找到解決辦法,完成代碼撰寫任務,甚至還可以進行遠程調試,最終為用戶提供更加精確的代碼,大大縮短了項目開發的時間,讓我們體會到了大語言模型的強大。

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

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

相關文章

【找工作】C++和算法復習(自用)

文章目錄 C頭文件自定義排序函數stl 算法數據結構樹狀數組 數學字符串manacherkmp 自用隨便記錄 C 排序 stl 頭文件 全能頭文件&#xff1a; #include<bits/stdc.h>自定義排序函數 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }…

請談談 React 中的狀態管理,如何使用 Context API 和 Redux 進行狀態管理?

一、Context API 深度應用 1. 核心實現原理 通過createContext創建上下文對象&#xff0c;使用Provider組件包裹需要共享狀態的組件樹&#xff0c;子組件通過useContext Hook或Consumer組件消費數據。 代碼示例&#xff08;主題切換場景&#xff09;&#xff1a; // 創建上…

kotlin的Int類型調用toString()會導致空指針嗎

DeepSeek R1 思考 38 秒 思考過程 用戶的問題是關于Kotlin中Int類型調用toString()是否會導致空指針異常。首先&#xff0c;我需要回憶Kotlin的基本類型系統。Kotlin中的Int屬于基本數據類型&#xff0c;但它在語言層面被表示為非空類型。也就是說&#xff0c;Int變量本身不能…

網絡運維學習筆記 017 HCIA-Datacom綜合實驗01

文章目錄 綜合實驗1實驗需求總部特性 分支8分支9 配置一、 基本配置&#xff08;IP二層VLAN鏈路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 單臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 綜合實…

基于Hadoop的汽車大數據分析系統設計與實現【爬蟲、數據預處理、MapReduce、echarts、Flask】

文章目錄 有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹爬蟲數據概覽HIve表設計Cars Database Tables 1. cars_data2. annual_sales_volume3. brand_sales_volume4. city_sales_volume5. sales_volume_by_year_and_brand6. sales_distri…

springboot實現多文件上傳

springboot實現多文件上傳 代碼 package com.sh.system.controller;import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMap…

Java所有運算符理解

Java 運算符 算術運算符 表格中的實例假設整數變量A的值為10&#xff0c;變量B的值為20&#xff1a; 操作符描述例子加法 - 相加運算符兩側的值A B 等于 30-減法 - 左操作數減去右操作數A – B 等于 -10*乘法 - 相乘操作符兩側的值A * B等于200/除法 - 左操作數除以右操作數…

紛析云:賦能企業財務數字化轉型的開源解決方案

在企業數字化轉型的浪潮中&#xff0c;財務管理的高效與安全成為關鍵。紛析云憑借其開源、安全、靈活的財務軟件解決方案&#xff0c;為企業提供了一條理想的轉型路徑。 一、開源的力量&#xff1a;自主、安全、高效 紛析云的核心優勢在于其100%開源的財務軟件源碼。這意味著…

Golang深度學習

前言 在2009年&#xff0c;Google公司發布了一種新的編程語言&#xff0c;名為Go&#xff08;或稱為Golang&#xff09;&#xff0c;旨在提高編程效率、簡化并發編程&#xff0c;并提供強大的標準庫支持。Go語言的設計者們希望通過Go語言能夠解決軟件開發中的一些長期存在的問…

博客系統筆記總結 2( Linux 相關)

Linux 基本使用和程序部署 基本命令 文件操作 顯示當前目錄下的文件 ls&#xff1a;顯示當前目錄下的文件 ll&#xff1a;以列表的形式展示&#xff0c;包括隱藏文件 進入目錄 && 顯示當前路徑 cd&#xff1a;進入目錄&#xff08;后面跟相對路徑或者絕對路徑&…

開源基準測試模擬器:BlueROV2 水下機器人的控制

拜讀An Open-Source Benchmark Simulator: Control of a BlueROV2 Underwater Robot 非常感謝Esben Uth的幫助。 本文介紹了在 Simulink? 中實現的常用且低成本的遙控潛水器 &#xff08;ROV&#xff09; BlueROV2 的仿真模型環境&#xff0c;該環境已針對水下航行器的基準控…

Unity打包APK報錯 using a newer Android Gradle plugin to use compileSdk = 35

Unity打包APK報錯 using a newer Android Gradle plugin to use compileSdk 35 三個報錯信息如下 第一個 WARNING:We recommend using a newer Android Gradle plugin to use compileSdk 35This Android Gradle plugin (7.1.2) was tested up to compileSdk 32This warning…

HTML5特殊字符

HTML中常用的特殊符號一般都以“&”開頭&#xff0c;以“;”結束。

本地大模型編程實戰(23)用智能體(Agent)實現基于SQL數據構建問答系統(2)

本文將用 智能體(Agent) 實現對 SQLite 數據庫的查詢&#xff1a;用戶用自然語言提出問題&#xff0c;智能體也用自然語言根據數據庫的查詢結果回答問題。 本次將分別在英文、中文環境下&#xff0c;使用 qwen2.5 、 MFDoom/deepseek-r1-tool-calling:7b 以及 llama3.1 做實驗。…

nodejs npm install、npm run dev運行的坎坷之路

1、前面的種種都不說了&#xff0c;好不容易運行起來oap-portal項目&#xff0c;運行idm-ui項目死活運行不起來&#xff0c;各種報錯&#xff0c;各種安裝&#xff0c;各種卸載nodejs&#xff0c;卸載nvm&#xff0c;重裝&#xff0c;都不好使。 2、甚至后來運行npm install會…

gotool在線工具集

1. 包含各種 sql 處理 2. 包含 json 處理 3. 包含 圖片處理 4. 跨平臺傳輸 gotool

猿大師播放器:智慧交通Web網頁低延遲播放監控RTSP H.265視頻解決方案

在智慧城市建設加速推進的今天&#xff0c;智慧交通作為城市"神經系統"正面臨前所未有的發展機遇。據統計&#xff0c;2023年全國交通視頻監控設備保有量已突破4500萬臺&#xff0c;日均產生的視頻數據量超50PB。但在這些龐大數字背后&#xff0c;行業卻普遍面臨著&q…

Web自動化之Selenium控制已經打開的瀏覽器(Chrome,Edge)

在使用selenium進行web自動化或爬蟲的時候,經常會面臨登錄的情況,對于這種情況,我們可以利用Selenium控制已經打開的瀏覽器&#xff0c;從而避免每次都需要重新打開瀏覽器并進行登錄的繁瑣步驟。 目錄 說明 啟動瀏覽器 注意 --user-data-dir說明 代碼設定 代碼 改進代…

【Alertmanager】Alertmanager告警路由,告警靜默,告警抑制,高可用的實現

?? 歡迎大家來到景天科技苑?? ???? 養成好習慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構師,華為云開發者社區專家博主,阿里云開發者社區專家博主,CSDN全棧領域優質創作者,掘金優秀博主,51CTO博客專家等。 ??《博客》:Python全…

Vue3 + Vite + TS,使用 配置項目別名屬性:resolve

使用 resolve 配置全局項目路徑別名 1.優化了開發中單頁面引用其他模塊的路徑復雜性 2.妥妥解決了&#xff0c;組件復用當中提高開發效率 // 不使用配置 import { useStore } from ../../../stores // 使用配置 可根據開發者需求任意定義&#xff0c;較多 import { useStore…