
60行Python代碼,實(shí)現(xiàn)多線程PDF轉(zhuǎn)Word
分解任務(wù)
把PDF轉(zhuǎn)為Word,分幾步??jī)刹?,第一步讀取PDF文件,第二步寫入Word文件。

是的,就是這么簡(jiǎn)單,借助Python第三方包,可以輕松實(shí)現(xiàn)上面兩個(gè)過程,我們要用到pdfminer3k和python-docx這兩個(gè)包
讀取PDF
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
resource_manager = PDFResourceManager()
return_str = StringIO()
lap_params = LAParams()
device = TextConverter(resource_manager, return_str, laparams=lap_params)
process_pdf(resource_manager, device, file)? # file是使用open方法打開的PDF文件句柄
device.close()
# 此處content就是轉(zhuǎn)換為文字的PDF內(nèi)容
content = return_str.getvalue()
content變量存儲(chǔ)的就是我們從PDF文件中讀取出的文字內(nèi)容,可以看到,使用pdfminer3k可以輕松完成這個(gè)任務(wù)。接下來我們需要把文字內(nèi)容寫入成一個(gè)word文件。
寫入Word
from docx import Document
doc = Document()
for line in content.split('\n'):
? ? paragraph = doc.add_paragraph()
? ? paragraph.add_run(remove_control_characters(line))
doc.save(file_path)
content是我們前面讀取出的文字內(nèi)容,由于是講整個(gè)PDF讀成一個(gè)字符串,所以需要使用split方法將每一行分隔開,然后按行寫入word,否則所有的文字會(huì)在同一行。同時(shí)這段代碼使用了一個(gè)remove_control_characters函數(shù),這個(gè)函數(shù)是需要自己實(shí)現(xiàn)的,目的是移除控制字符(換行符、制表符、轉(zhuǎn)義符等),因?yàn)閜ython-docx是不支持控制字符寫入的。
def remove_control_characters(content):
? ? mpa = dict.fromkeys(range(32))
? ? return content.translate(mpa)
控制字符就是ASCII碼在32以下的,所以我們使用str的translate方法,把32以下的字符移除就可以。
用是能用,但是太慢了!
如果我們用上面代碼去轉(zhuǎn)換100個(gè)PDF文件,就會(huì)發(fā)現(xiàn)速度慢到難以接受,每個(gè)PDF都需要花很長(zhǎng)時(shí)間才能轉(zhuǎn)換好,怎么辦?別急,接下來我們引入多線程,同時(shí)轉(zhuǎn)換多個(gè)PDF,可以有效加快轉(zhuǎn)換速度。
import os
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(max_workers=int(config['max_worker'])) as executor:
? ? for file in os.listdir(config['pdf_folder']):
? ? ? ? extension_name = os.path.splitext(file)[1]
? ? ? ? if extension_name != '.pdf':
? ? ? ? ? ? continue
? ? ? ? file_name = os.path.splitext(file)[0]
? ? ? ? pdf_file = config['pdf_folder'] + '/' + file
? ? ? ? word_file = config['word_folder'] + '/' + file_name + '.docx'
? ? ? ? print('正在處理: ', file)
? ? ? ? result = executor.submit(pdf_to_word, pdf_file, word_file)
? ? ? ? tasks.append(result)
while True:
? ? exit_flag = True
? ? for task in tasks:
? ? ? ? if not task.done():
? ? ? ? ? ? exit_flag = False
? ? if exit_flag:
? ? ? ? print('完成')
? ? ? ? exit(0)
代碼中config是包含存儲(chǔ)PDF文件夾地址和word文件夾地址的字典,使用Python標(biāo)準(zhǔn)庫(kù)中的concurrent包,實(shí)現(xiàn)多進(jìn)程,pdf_to_word方法是對(duì)上面讀取PDF和寫入word邏輯的封裝。后面的while循環(huán)是查詢?nèi)蝿?wù)是否進(jìn)行完成。
效果
到這里,我們已經(jīng)實(shí)現(xiàn)了多線程批量轉(zhuǎn)換PDF為word文檔。拿謀篇著名文章來試驗(yàn)一下,效果如圖(左側(cè)是轉(zhuǎn)換后的word,右側(cè)是PDF):
不想寫代碼,只想用
本文介紹的所有代碼,已經(jīng)打包成了一個(gè)獨(dú)立可運(yùn)行的項(xiàng)目,存放在github,如果不想自己寫代碼,可以直接clone或下載github項(xiàng)目運(yùn)行。項(xiàng)目地址如下(記得點(diǎn)star)GitHub - qinweiming/pdf2word: 60行代碼實(shí)現(xiàn)多線程PDF轉(zhuǎn)Word