1. 程式人生 > >Pdfminer讀取PDF檔案內容儲存到本地TXT

Pdfminer讀取PDF檔案內容儲存到本地TXT

from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
from pdfminer.pdfparser import PDFParser, PDFDocument
import pandas as
pd def Pdf_to_txt(fp): # 建立一個pdf文件分析器 praser_pdf = PDFParser(fp) # # 建立一個PDF文件 document = PDFDocument(praser_pdf) # 連線分析器 與文件物件 praser_pdf.set_document(document) document.set_parser(praser_pdf) # 檢測文件是否提供txt轉換,不提供就忽略 if not document.is_extractable: raise
PDFTextExtractionNotAllowed else: # 建立PDf資源管理器 來管理共享資源 rsrcmgr = PDFResourceManager() # 建立一個PDF引數分析器 laparams = LAParams() # 建立聚合器 device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 建立一個PDF頁面直譯器物件 interpreter = PDFPageInterpreter(rsrcmgr, device) # 迴圈遍歷列表,每次處理一頁的內容
# doc.get_pages() 獲取page列表 for page in document.get_pages(): # 使用頁面直譯器來讀取 interpreter.process_page(page) # 使用聚合器獲取內容 layout = device.get_result() title = [] lin1, lin2, lin3, lin4, lin5, lin6, lin7, lin8 = [], [], [], [], [], [], [], [] num = 0 # 這裡layout是一個LTPage物件 裡面存放著 這個page解析出的各種物件 一般包括LTTextBox, # LTFigure, LTImage, LTTextBoxHorizontal 等等 想要獲取文字就獲得物件的text屬性, for lin in layout: # 判斷是否含有get_text()方法,圖片之類的就沒有 if isinstance(lin, LTTextBoxHorizontal): results = lin.get_text() results = results.strip('\n') print("results: " + results) if num == 0: title.append(results) elif num == 1: lin1.append(results) elif num == 2: lin2.append(results) elif num == 3: lin3.append(results) elif num == 4: lin4.append(results) elif num == 5: lin5.append(results) elif num == 6: lin6.append(results) elif num == 7: lin7.append(results) elif num == 8: lin8.append(results) num = 0 num += 1 Lin_num = len(lin8) data = {'Lin1': lin1[:Lin_num], 'Lin2': lin2[:Lin_num], 'Lin3': lin3[:Lin_num], 'Lin4': lin4[:Lin_num], 'Lin5': lin5[:Lin_num], 'Lin6': lin6[:Lin_num], 'Lin7': lin7[:Lin_num], 'Lin8': lin8[:Lin_num]} df = pd.DataFrame(data, columns=['Lin1', 'Lin2', 'Lin3', 'Lin4', 'Lin5', 'Lin6', 'Lin7', 'Lin8']) file_name = title[0] + '_page' + str((i + 1)) df.to_csv('tool/pdf解析/%s.txt' % file_name, index=False, sep='\t') if __name__ == '__main__': filename = 'E:/tempFile/Monthly_new_MA_listing_April_2017.pdf' fp = open(filename, 'rb') Pdf_to_txt(fp)