首頁 > 軟體

詳解用Python把PDF轉為Word方法總結

2021-04-26 19:02:02

先講一下為啥要寫這個文章,網上其實很多這種PDF轉化的程式碼和軟體。我一直想用Python做,但是網上搜到的程式碼很多都不能用,很多是2.7版本的程式碼,再就是PDF需要用到的庫在匯入的時候,很多的報錯,解決起來特別費勁,而且自從2021年初以來,似乎網上很少有關PDF轉化的程式碼出現了。我在研究了很多程式碼和pdfminer的用法後,總結了幾個方法,目前這幾種方法可以解決大多數格式的轉化,後面我也專門放了提取PDF表格的程式碼,文末有高效的免費線上工具推薦。

下面這個是我最最推薦的方法 ,簡單高效 ,只要是標準PDF檔案,裡面的圖片和表格都可以保留格式

# pip install pdf2docx #安裝依賴庫
from pdf2docx import Converter

pdf_file = r'C:UsersAdministratorDesktop新建資料夾mednine.pdf'
docx_file = r'C:UsersAdministratorDesktopPython教學2.docx'

# convert pdf to docx
cv = Converter(pdf_file)
cv.convert(docx_file, start=0, end=None)
cv.close()

下面是另外三種常用方法

1 把標準格式的PDF轉為Word,測試環境Python3.6.5和3.6.6(注意PDF內容僅僅是文字為主的裡面沒有圖片圖表的適用,不適合掃描版PDF,因為那隻能用圖片識別的方式進行)

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
import sys
import string
from docx import Document


def convert_pdf_2_text(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    
    device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    
    with open(path, 'rb') as fp:
        for page in PDFPage.get_pages(fp, set()):
            interpreter.process_page(page)
            #print(retstr.getvalue())  
        text = retstr.getvalue()
    device.close()
    retstr.close()
    return text


def pdf2txt():
    text=convert_pdf_2_text(path)
    with open('real.txt','a',encoding='utf-8') as f:
        for line in text.split('n'):
            f.write(line+'n')

        

def remove_control_characters(content):
    mpa = dict.fromkeys(range(32))
    return content.translate(mpa)
    
def save_text_to_word(content, file_path):     

    doc = Document()
    for line in content.split(''):
        print(line)
            
        paragraph = doc.add_paragraph()
        paragraph.add_run(remove_control_characters(line))
    doc.save(file_path)


if __name__ == '__main__':
    path = r'C:UsersmaynDesktop程式臨時培訓教材.pdf'  # 你自己的pdf檔案路徑及檔名 不適合掃描版 只適合標準PDF檔案
    text = convert_pdf_2_text(path)
    save_text_to_word(text, 'output.doc')  #PDF轉為word方法
    #pdf2txt()  #PDF轉為txt方法

2專門提取PDF裡面的表格,使用pdfplumber適合標準格式的PDF

import pdfplumber
import pandas as pd
import time
from time import  ctime
import psutil as ps 
#import threading
import gc
pdf = pdfplumber.open(r"C:UsersAdministratorDesktop新建資料夾mednine.pdf")
N=len(pdf.pages)
print('總共有',N,'頁')

def pdf2exl(i): # 讀取了第i頁,第i頁是有表格的,
    print('********************************************************************************************************************************************************')
    print('正在輸出第',str(i+1),'頁表格')
    print('********************************************************************************************************************************************************')   
    p0 = pdf.pages[i]
    try:
        table = p0.extract_table()
        print(table)
    
        df = pd.DataFrame(table[1:], columns=table[0])
    #print(df)
        df.to_excel(r"C:UsersAdministratorDesktop新建資料夾Model"+str(i+1)+".xlsx")
    
        #df.info(memory_usage='deep')
        
        
    except Exception as e:
        print('第'+str(i+1)+'頁無表格,或者檢查是否存在表格')       
       
        pass
    #print('目前記憶體佔用率是百分之',str(ps.virtual_memory().percent),'    第',str(i+1),'頁輸出完畢')
    print('**********************************************************************************************************************************************************')
    print('nnn') 
    time.sleep(5)


def dojob1():  #此函數  直接回圈提取PDF裡面各個頁面的表格 
    print('*********************')
    for i in range(0,N):
        pdf2exl(i)    

3也可以提取PDF裡面的表格,使用camelot(camelot的安裝可能需要點耐心,反正用的人不多)

import camelot
import wand

# 從PDF檔案中提取表格

def output(i):  
    #print(tables)
    #for i in range(5):
    tables = camelot.read_pdf(r'C:UsersAdministratorDesktop新建資料夾mednine.pdf', pages=str(i), flavor='stream')
    print(tables[i])
    
# 表格資料
    print(tables[i].data)
    
    tables[i].to_csv(r'C:UsersAdministratorDesktop新建資料夾02'+str(i)+r'.csv')


def plotpdf():
        # 這個是畫pdf 結構的函數 現在不能用 不要開啟
    
    #print(tables[0])
    tables = camelot.read_pdf(r'C:UsersmaynDesktopvcode工作區11路基.pdf', pages='200', flavor='stream')
    camelot.plot(tables[0], kind='text')
    print(tables[0])
    plt.show()
    # 繪製PDF檔案的座標,定位表格所在的位置  
    #plt = camelot.plot(tables[0],kind='text')
    #plt.show()
    #table_df = tables[0].df

#plotpdf() 
#i=3
#output(i)
for i in range(0,2):
    try:    
        output(i)
    except Exception as e:
        print('第'+str(i)+'頁沒找到表格啊啊啊')
        pass 
    continue

以下是pdfplumber測試效果

原始檔如下

提取結果

最後補充2個免費轉換的網站感覺還比較好用,關鍵是免費

http://pdfdo.com/pdf-to-word.aspx

http://app.xunjiepdf.com/pdf2word/

到此這篇關於詳解用Python把PDF轉為Word方法總結的文章就介紹到這了,更多相關Python把PDF轉為Word內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com