Pdfminer讀取PDF檔案內容儲存到本地TXT
阿新 • • 發佈:2019-02-15
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)