【实例简介】
首先安装这个 pip install pdfminer3k
然后将 附件中 1-297.pdf文件 放到 D:/test 目录下
然后在 python 3.6 环境下 运行 ParserPdf.py文件,即可看到如下效果
【实例截图】
【核心代码】
#!/usr/bin/env python
# encoding: utf-8
"""
@author: guoliang
@software: PyCharm
@file: prase_pdf.py
@time: 2018/1/25
"""
import 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
'''
解析pdf 文本,保存到txt文件中
'''
path = r'D:\test\1-297.pdf'
def parse():
contentText = ""
fp = open(path, 'rb') # 以二进制读模式打开
#用文件对象来创建一个pdf文档分析器
praser = PDFParser(fp)
# 创建一个PDF文档
doc = PDFDocument()
# 连接分析器 与文档对象
praser.set_document(doc)
doc.set_parser(praser)
# 提供初始化密码
# 如果没有密码 就创建一个空的字符串
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的内容
for page in doc.get_pages(): # doc.get_pages() 获取page列表
interpreter.process_page(page)
# 接受该页面的LTPage对象
layout = device.get_result()
# 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
for x in layout:
if (isinstance(x, LTTextBoxHorizontal)):
with open(r'D:\test\1-297.txt', 'a',encoding='utf8') as f:
results = x.get_text()
# if r"摘 要" in results:
# results.replace(r'摘 要', r'摘 要:')
if r"企 业 管 理" in results :
# or r"管 理 科 学" in results \
# or r"财 税 统 计" in results or r"地 质 矿 山" in results \
# or r"工 程 技 术" in results or r"建 筑 施 工" in results \
# or r"市 政 建 设" in results or r"法 律 园 地" in results \
# or r"社 科 论 坛" in results or r"实 用 科 技" in results \
# or r"信 息 技 术" in results or r"职 业 教 育" in results \
# or r"科 学 实 践" in results :
print ("--------------------栏目:" results)
count = 0
count = 1
if count==2 and len(results)<60:
print("题目:" results)
if results.startswith("要要要"):
print("副标题:" results[3:])
elif count == 3 and len(results)<9:
print("作者:" results)
# contentText=contentText results
if count == 4 and len(results) < 9:
print("作者:" results)
# if count == 5 and len(results) < 9:
# print("单位:" results)
if results.startswith("摘 要"):
list=results.split('\n')
str=""
for i in list:
if ("关键词") in i:
break
str=str i
print("摘要:" str[4:])
print("关键词:" results.split('\n')[-2][4:])
if not results.startswith("摘 要") and len(results) >159:
print("正文:" results)
if r"参考文献" in results:
print("参考文献:" results)
f.write(results '\n')
return contentText
def contentParse(contentStr):
list=contentStr.split(r'企 业 管 理')
print (list)
if __name__ == '__main__':
contentStr=parse()
# contentParse(contentStr)