使用Python將PDF轉(zhuǎn)化為word


60行Python代碼,實(shí)現(xiàn)多線程PDF轉(zhuǎn)Word

分解任務(wù)

把PDF轉(zhuǎn)為Word,分幾步??jī)刹?,第一步讀取PDF文件,第二步寫入Word文件。


是的,就是這么簡(jiǎn)單,借助Python第三方包,可以輕松實(shí)現(xiàn)上面兩個(gè)過程,我們要用到pdfminer3kpython-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




https://zhuanlan.zhihu.com/p/34109582

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容