簡(jiǎn)述
????????以下全部代碼無(wú)法完美對(duì)圖片、表格等非文字形式的內(nèi)容轉(zhuǎn)化。要較好的效果需要使用光學(xué)字符分析等方法進(jìn)行轉(zhuǎn)化
? ? ? ? 我懶,不想將代碼模塊拆分出來(lái)寫注釋
? ? ? ? 除代碼1中有詳細(xì)注釋外,剩下的代碼僅在關(guān)鍵部分進(jìn)行注釋
代碼1:小規(guī)模文件的轉(zhuǎn)換
代碼簡(jiǎn)介
????????不使用線程,挨個(gè)文件轉(zhuǎn)換格式。
????????適用于小規(guī)模的PDF文件批量轉(zhuǎn)換。
????????需要自己選擇PDF文件(可以全選文件,自動(dòng)篩選PDF格式)
代碼內(nèi)容
import os, sys # 導(dǎo)入操作系統(tǒng)接口和系統(tǒng)相關(guān)的參數(shù)和函數(shù)
from pdf2docx import Converter # 導(dǎo)入pdf2docx庫(kù)中的Converter類,用于將PDF文件轉(zhuǎn)換為docx格式
import tkinter as tk # 導(dǎo)入Tkinter庫(kù),用于創(chuàng)建圖形用戶界面
from tkinter import filedialog # 導(dǎo)入Tkinter庫(kù)中的filedialog模塊,用于打開(kāi)文件對(duì)話框
# 定義一個(gè)函數(shù),用于將PDF文件轉(zhuǎn)換為docx格式
def convert_pdf_to_docx(file_path):
if os.path.splitext(file_path)[1] == '.pdf': # 檢查文件的擴(kuò)展名是否為.pdf
pdf_filename = os.path.basename(file_path) # 從file_path中提取出文件名(不含路徑)
word_name = os.path.splitext(pdf_filename)[0] + ".docx" # 創(chuàng)建新的文件名,將.docx作為擴(kuò)展名
cv = Converter(pdf_filename) # 創(chuàng)建一個(gè)Converter對(duì)象,用于轉(zhuǎn)換文件
cv.convert(word_name) # 調(diào)用convert方法,將PDF文件轉(zhuǎn)換為docx格式,并將轉(zhuǎn)換后的文件保存為word_name
cv.close() # 關(guān)閉轉(zhuǎn)換器對(duì)象
print(f"**{pdf_filename}**處理完成") # 打印轉(zhuǎn)換完成的信息
# 創(chuàng)建一個(gè)Tkinter窗口,但不顯示它
root = tk.Tk()
root.withdraw()
# 使用filedialog模塊打開(kāi)一個(gè)文件選擇對(duì)話框,允許用戶選擇多個(gè)文件
file_paths = filedialog.askopenfilenames(title="選擇需要處理的文件")
if len(file_paths) == 0: # 如果沒(méi)有選擇文件,退出程序
sys.exit()
else:
print("待處理文件:") # 打印提示信息
for file_path in file_paths: # 遍歷所有選擇的文件路徑
print(" ", file_path) # 打印每個(gè)文件的路徑
# 遍歷所有選擇的文件路徑,并調(diào)用convert_pdf_to_docx函數(shù)進(jìn)行轉(zhuǎn)換
for file_path in file_paths:
convert_pdf_to_docx(file_path)
print("全部PDF轉(zhuǎn)換完成") # 打印所有PDF文件轉(zhuǎn)換完成的信息
功能的執(zhí)行
選擇需要轉(zhuǎn)換的文件
選擇你需要轉(zhuǎn)換的文件,可以直接全選
一次只能轉(zhuǎn)換一個(gè)文件夾中的全部文件,無(wú)法進(jìn)入到該文件夾的次級(jí)文件夾中

開(kāi)始轉(zhuǎn)換文件
請(qǐng)注意終端信息窗口,會(huì)提示轉(zhuǎn)換進(jìn)度

轉(zhuǎn)換完成

轉(zhuǎn)換效果:
代碼2:較大規(guī)模文件的轉(zhuǎn)換
更新功能
1.使用多線程模式,一個(gè)文件一條線程的轉(zhuǎn)換文件
2.增加時(shí)間計(jì)算,統(tǒng)計(jì)轉(zhuǎn)換文件需要多少時(shí)間,方便后繼繼續(xù)優(yōu)化提高轉(zhuǎn)換速度
詳細(xì)代碼
import os
import sys
from pdf2docx import Converter
import tkinter as tk
from tkinter import filedialog
import threading
import time
# 定義一個(gè)函數(shù),用于將PDF文件轉(zhuǎn)換為docx格式
def convert_pdf_to_docx(file_path):
try:
if os.path.splitext(file_path)[1] == '.pdf':
#pdf_filename = os.path.basename(file_path)
#word_name = os.path.splitext(pdf_filename)[0] + ".docx"
cv = Converter(file_path)
cv.convert(os.path.splitext(os.path.basename(file_path))[0] + ".docx")
cv.close()
except Exception as e:
print(f"轉(zhuǎn)換 {os.path.basename(file_path)} 時(shí)發(fā)生錯(cuò)誤: {e}")
# 創(chuàng)建一個(gè)Tkinter窗口,但不顯示它
root = tk.Tk()
root.withdraw()
# 使用filedialog模塊打開(kāi)一個(gè)文件選擇對(duì)話框,允許用戶選擇多個(gè)文件
file_paths = filedialog.askopenfilenames(title="選擇需要處理的文件")
if not file_paths:
sys.exit("沒(méi)有選擇文件,操作取消。")
# 打印待處理的文件
print("待處理文件:")
for file_path in file_paths:
print(" ", file_path)
# 創(chuàng)建一個(gè)線程列表用于存儲(chǔ)所有的轉(zhuǎn)換線程
threads = []
# 遍歷所有選擇的文件路徑,并創(chuàng)建轉(zhuǎn)換線程
for file_path in file_paths:
thread = threading.Thread(target=convert_pdf_to_docx, args=(file_path,))
threads.append(thread)
# 記錄開(kāi)始時(shí)間
start_time = time.time()
# 啟動(dòng)所有的轉(zhuǎn)換線程
for thread in threads:
thread.start()
# 等待所有的轉(zhuǎn)換線程完成
for thread in threads:
time.sleep(0.1)# 暫停程序1毫秒
thread.join()
# 記錄結(jié)束時(shí)間
end_time = time.time()
# 計(jì)算并打印轉(zhuǎn)換完成所需的總時(shí)間
total_time = end_time - start_time
print(f"所有文件轉(zhuǎn)換完成,總共耗時(shí): {total_time:.2f} 秒。")
代碼3:超大規(guī)模文件的轉(zhuǎn)換
功能的更新
1.引入線程池,控制程序消耗的系統(tǒng)資源
詳細(xì)代碼
import os
import logging
from tkinter import Tk, filedialog
from concurrent.futures import ThreadPoolExecutor, as_completed
from pdf2docx import Converter
# 配置日志格式和級(jí)別
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
# 定義一個(gè)函數(shù)來(lái)處理單個(gè)PDF文件的轉(zhuǎn)換
def process_pdf_file(pdf_path):
try:
pdf_dir = os.path.dirname(pdf_path)
file_name = os.path.splitext(os.path.basename(pdf_path))[0]
docx_path = os.path.join(pdf_dir, f"{file_name}.docx")
# 轉(zhuǎn)換PDF到Word
cv = Converter(pdf_path)
cv.convert(docx_path, start=0, end=None)
cv.close()
# 記錄文件保存的信息
logging.info(f"Converted file saved to {docx_path}")
except Exception as e:
# 如果發(fā)生錯(cuò)誤,記錄錯(cuò)誤信息而不是轉(zhuǎn)換成功信息
logging.error(f"Error processing file {pdf_path}: {e}")
# 創(chuàng)建主窗口
root = Tk()
root.withdraw() # 隱藏主界面
# 選擇PDF文件
pdf_paths = filedialog.askopenfilenames(title="選擇PDF文件", filetypes=[("PDF files", "*.pdf")])
if pdf_paths:
# 創(chuàng)建一個(gè)線程池,限制線程數(shù)量為CPU核心數(shù)
with ThreadPoolExecutor(max_workers=os.cpu_count()*2) as executor:
# 將任務(wù)提交到線程池
futures = [executor.submit(process_pdf_file, pdf_path) for pdf_path in pdf_paths]
# 使用as_completed迭代器等待所有任務(wù)完成
for future in as_completed(futures):
future.result()
if future.exception() is not None:
logging.error(f"An error occurred: {future.exception()}")
else:
logging.info(f"File processed successfully: {future.result()}")
# 所有文件處理完成后,關(guān)閉窗口并退出程序
root.destroy()
else:
logging.info("沒(méi)有選擇PDF文件。")
代碼4:超快速PDF文件轉(zhuǎn)換
功能更新
只轉(zhuǎn)換文字,對(duì)任何圖片表格會(huì)出現(xiàn)問(wèn)題
詳細(xì)代碼
import os
import logging
from tkinter import Tk, filedialog
from concurrent.futures import ThreadPoolExecutor, as_completed
import fitz # PyMuPDF
# 配置日志格式和級(jí)別
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
# 定義一個(gè)函數(shù)來(lái)處理單個(gè)PDF文件的轉(zhuǎn)換
def process_pdf_file(pdf_path):
try:
pdf_dir = os.path.dirname(pdf_path)
file_name = os.path.splitext(os.path.basename(pdf_path))[0]
docx_path = os.path.join(pdf_dir, f"{file_name}.docx")
# 使用PyMuPDF讀取PDF內(nèi)容
pdf = fitz.open(pdf_path)
text = ""
for page in pdf:
text += page.get_text()
pdf.close()
# 將文本寫入Word文檔(這里需要一個(gè)將文本轉(zhuǎn)換為docx格式的函數(shù))
with open(docx_path, 'w', encoding='utf-8') as f:
f.write(text)
# 記錄文件保存的信息
logging.info(f"Converted file saved to {docx_path}")
except Exception as e:
# 如果發(fā)生錯(cuò)誤,記錄錯(cuò)誤信息而不是轉(zhuǎn)換成功信息
logging.error(f"Error processing file {pdf_path}: {e}")
# 創(chuàng)建主窗口
root = Tk()
root.withdraw() # 隱藏主窗口
# 選擇PDF文件
pdf_paths = filedialog.askopenfilenames(title="選擇PDF文件", filetypes=[("PDF files", "*.pdf")])
if pdf_paths:
# 創(chuàng)建一個(gè)線程池
with ThreadPoolExecutor(max_workers=min(len(pdf_paths), os.cpu_count())) as executor:
# 將任務(wù)提交到線程池
futures = [executor.submit(process_pdf_file, pdf_path) for pdf_path in pdf_paths]
# 等待所有任務(wù)完成
for future in as_completed(futures):
future.result()
# 所有文件處理完成后,關(guān)閉窗口并退出程序
root.destroy()
else:
logging.info("沒(méi)有選擇PDF文件。")
批量刪除文件夾內(nèi)的全部word:使用Python批量刪除文件夾內(nèi)的Word-CSDN博客文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-850431.html
程序打包方式見(jiàn)我的這個(gè)文章:在Vscode中將python打包為exe,超級(jí)簡(jiǎn)單,還能自定義exe的logo_怎么將vscode編寫的代碼打包成exe-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-850431.html
到了這里,關(guān)于使用Python批量將PDF轉(zhuǎn)Word的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!