PDF轉Word完全免費?這麼好的事情我怎麼不知道????
- 2019 年 10 月 6 日
- 筆記
」閱讀此篇需要三分鐘「
首先來看看來個PDF文件
我們來選擇其中一個論文摘要
|
|
V
使用我們的python程式碼轉化後:
是不是很神奇?
現在網路上大部分的PDF轉Word都是收費的,基本都是按頁收費,有了我們的python程式碼後,我們就可以完全免費的將PDF轉成Word了,這麼好的福利我們趕緊來了解一下吧!
首先來看看我們要安裝一些什麼模組:
attrs==17.4.0 lxml==4.1.1 pdfminer3k==1.3.1 pluggy==0.6.0 ply==3.11 py==1.5.2 pytest==3.4.1 python-docx==0.8.6 six==1.11.0
使用pip模組管理工具即可安裝。
如上圖,將每個模組都安裝好。
或者直接將模組放到requirements.txt文件里,運行
pip install -r requirements
安裝即可
下一步就來開始coding了!
首先導入需要使用的模組:
import os from io import StringIO from io import open from concurrent.futures import ProcessPoolExecutor from pdfminer.pdfinterp import PDFResourceManager from pdfminer.pdfinterp import process_pdf from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from docx import Document
然後定義好PDF文件的讀取路徑和Word文件的生成路徑。
pdf_folder = r'/Users/wuyuqing/Desktop/Code/pdf2word/pdf' word_folder = r'/Users/wuyuqing/Desktop/Code/pdf2word/word'
接下來我們定義使用的方法:
def read_from_pdf(file_path): with open(file_path, 'rb') as file: resource_manager = PDFResourceManager() return_str = StringIO() lap_params = LAParams() device = TextConverter( resource_manager, return_str, laparams=lap_params) process_pdf(resource_manager, device, file) device.close() content = return_str.getvalue() return_str.close() return content
通過位元組流的方式打開文件,讀取內容。我們主要使用process_pdf這個函數處理pdf,詳情處理步驟我們可以看看API是這麼處理的(這API寫好的程式碼,供參考,不需要你再次手寫):
def process_pdf(rsrcmgr, device, fp, pagenos=None, maxpages=0, password='', caching=True, check_extractable=True): # Create a PDF parser object associated with the file object. parser = PDFParser(fp) # Create a PDF document object that stores the document structure. doc = PDFDocument(caching=caching) # Connect the parser and document objects. parser.set_document(doc) doc.set_parser(parser) # Supply the document password for initialization. # (If no password is set, give an empty string.) doc.initialize(password) # Check if the document allows text extraction. If not, abort. if check_extractable and not doc.is_extractable: raise PDFTextExtractionNotAllowed( 'Text extraction is not allowed: %r' % fp)# Create a PDF interpreter object. interpreter = PDFPageInterpreter(rsrcmgr, device) # Process each page contained in the document. for (pageno,page) in enumerate(doc.get_pages()): if pagenos and (pageno not in pagenos): continue interpreter.process_page(page) if maxpages and maxpages <= pageno+1: break
下面我們考慮將位元組流存成docx文檔:
def save_text_to_word(content, file_path): doc = Document() for line in content.split('n'): paragraph = doc.add_paragraph() paragraph.add_run(remove_control_characters(line)) doc.save(file_path)
# 將兩個函數封裝起來def pdf_to_word(pdf_file_path, word_file_path):content = read_from_pdf(pdf_file_path) save_text_to_word(content, word_file_path)
主要功能完成,這樣就算完工了
下面我們來調用讀取pdf生成docx的方法
tasks = [] with ProcessPoolExecutor(max_workers=5) as executor: for file in os.listdir(pdf_folder): extension_name = os.path.splitext(file)[1] if extension_name != '.pdf': continue file_name = os.path.splitext(file)[0] pdf_file = pdf_folder + '/' + file word_file = 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)
這樣就可以生成doc文件了,怎麼樣是不是很簡單?