1. 程式人生 > 其它 >PDF檔案轉換為TXT檔案

PDF檔案轉換為TXT檔案

PDF檔案轉換為TXT檔案

import sys
import importlib
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
import glob
import re

importlib.reload(sys)


def get_file_name(path_string):
"""獲取檔名稱"""
pattern = re.compile(r'([^<>/\\\|:""\*\?]+)\.\w+$')
data = pattern.findall(path_string)
if data:
return data[0]


def parse(text_path):
"""解析PDF文字,並儲存到TXT檔案中"""
pdfname = get_file_name(text_path)
fp = open(text_path, 'rb') # 'rb'表示解讀為二進位制資料
# 用檔案物件建立一個PDF文件分析器
parer = PDFParser(fp)
# 建立一個PDF文件
doc = PDFDocument()
# 連線分析器,與文件物件--也就說內容與載體連線
parer.set_document(doc)
doc.set_parser(parer)

# 提供初始化密碼,如果沒有密碼,就建立一個空的字串
doc.initialize()

# 檢測文件是否提供txt格式轉化,不提供就忽略
if not doc.is_extractable:
raise PDFTextExtractionNotAllowed
else:
# 建立PDF,資源管理器,來共享資源
rsrcmgr = PDFResourceManager()
# 建立一個PDF裝置物件
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
# 建立一個PDF解釋其物件
interpreter = PDFPageInterpreter(rsrcmgr, device)

# 迴圈遍歷列表,每次處理一個page內容
# doc.get_pages() 獲取pages列表
for page in doc.get_pages():
interpreter.process_page(page)
# 接受該頁面的LTPage物件
layout = device.get_result()
# 這裡layout是一個LTpage物件,裡面存放著這個page解析出的各種物件
# 一般包括LTTextBox,LTFigure,LTImage,LTTextHorizontal等等
# 想要獲得文字就獲得物件的text屬性
for x in layout:
if (isinstance(x, LTTextBoxHorizontal)):
with open(r"../paperchangtxt1/"+pdfname+".txt", 'a', encoding='utf-8') as f:
results = x.get_text()
# return results
f.write(results + '\n')


if __name__ == '__main__':
pdf_path = r'C:\Users\黃某人\Desktop\ICCV2019'
pdfs = glob.glob("{}/*.pdf".format(pdf_path))
list = []
for pdf in pdfs:
# parse(pdf_path)
print(pdf)
try:
parse(pdf)
except:
list.append(pdf)
with open(r"../log/list_url.txt", 'a', encoding='utf-8') as f:
# return results
sep = ';'
f.write(sep.join(list))