import os
import urllib
import importlib ,sys
importlib.reload(sys)
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
from pdfminer.pdfdevice import PDFDevice
def parse(DataIO, save_path):
# 用文件对象创建一个PDF文档分析器
parser = PDFParser(DataIO)
# 创建一个PDF文档
doc = PDFDocument()
# 分析器和文档相互连接
parser.set_document(doc)
doc.set_parser(parser)
# 提供初始化密码,没有默认为空
doc.initialize()
# 检查文档是否可以转成TXT,如果不可以就忽略
if not doc.is_extractable:
raise PDFTextExtractionNotAllowed
else:
# 创建PDF资源管理器,来管理共享资源
rsrcmagr = PDFResourceManager()
# 创建一个PDF设备对象
laparams = LAParams()
# 将资源管理器和设备对象聚合
device = PDFPageAggregator(rsrcmagr, laparams=laparams)
# 创建一个PDF解释器对象
interpreter = PDFPageInterpreter(rsrcmagr, device)
# 循环遍历列表,每次处理一个page内容
# doc.get_pages()获取page列表
for page in doc.get_pages():
interpreter.process_page(page)
# 接收该页面的LTPage对象
layout = device.get_result()
# 这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象
# 一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像
# 想要获取文本就得获取对象的text属性
for x in layout:
try:
if(isinstance(x, LTTextBoxHorizontal)):
with open('%s' % (save_path), 'a', encoding="utf-8") as f:
result = x.get_text()
print (result)
f.write(result + "\n")
except:
print("Failed")
if __name__ == '__main__':
# 解析本地PDF文本,保存到本地TXT
pdf_name = r'text_pdf.pdf'
with open(pdf_name, 'rb') as pdf_html:
parse(pdf_html, pdf_name.split(".")[0] + ".txt")
以上的转换方法,对于表格类的PDF不太友好,可以尝试另外一种,附链接:pdfplumber