背景:
本人有个pdf文档,想提取里面的信息;
方式1:使用电脑自带的记事本打开乱码;
方式2:使用open(),读取,报错;
下面尝试pdfminer3k,读取pdf文件成功;
首先,安装pdfminer3k
其次,使用如下代码,
path 替换为自己pdf的路径、
toPath 替换为自己txt(即pdf文档转换成txt文档)的路径;
import sys import importlib 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 def readPDF(path, toPath): # 以二进制形式打开pdf文件 with open(path, "rb") as f: # 创建一个pdf文档分析器 parser = PDFParser(f) # 创建pdf文档 pdfFile = PDFDocument() # 链接分析器与文档对象 parser.set_document(pdfFile) pdfFile.set_parser(parser) # 提供初始化密码 pdfFile.initialize() # 检测文档是否提供txt转换 if not pdfFile.is_extractable: raise PDFTextExtractionNotAllowed else: # 解析数据 # 数据管理 manager = PDFResourceManager() # 创建一个PDF设备对象 laparams = LAParams() device = PDFPageAggregator(manager, laparams=laparams) # 解释器对象 interpreter = PDFPageInterpreter(manager, device) # 开始循环处理,每次处理一页 for page in pdfFile.get_pages(): interpreter.process_page(page) layout = device.get_result() for x in layout: if(isinstance(x, LTTextBoxHorizontal)): with open(toPath, "a") as f: str = x.get_text() # print(str) f.write(str+" ") path = r"D:1.pdf" toPath = r"D:1.txt" readPDF(path, toPath)
但是呢,我的诉求是,提取pdf文档的考点信息
经过改良后的代码
import sys import importlib importlib.reload(sys) import re #正则表达式 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 def readPDF(path, result): # 以二进制形式打开pdf文件 with open(path, "rb") as f: # 创建一个pdf文档分析器 parser = PDFParser(f) # 创建pdf文档 pdfFile = PDFDocument() # 链接分析器与文档对象 parser.set_document(pdfFile) pdfFile.set_parser(parser) # 提供初始化密码 pdfFile.initialize() # 检测文档是否提供txt转换 if not pdfFile.is_extractable: raise PDFTextExtractionNotAllowed else: # 解析数据 # 数据管理 manager = PDFResourceManager() # 创建一个PDF设备对象 laparams = LAParams() device = PDFPageAggregator(manager, laparams=laparams) # 解释器对象 interpreter = PDFPageInterpreter(manager, device) # 开始循环处理,每次处理一页 for page in pdfFile.get_pages(): interpreter.process_page(page) layout = device.get_result() for x in layout: if(isinstance(x, LTTextBoxHorizontal)): str = x.get_text() result+=str # with open(toPath, "a") as f: # str = x.get_text() # print(str) # f.write(str+" ") # print(result) n = re.findall('考点 (.*)', result) # print(n) for i in n: print(i) path = r"D:初会《初级会计实务》第八章——政府会计基础.pdf" # toPath = r"D:1.txt" r='' readPDF(path, r)
运行结果
1:政府会计标准体系 2:政府会计要素及其确认和计量 3:政府财务报告和决算报告 4:政府会计核算模式 5:单位会计核算概述 6:国库集中支付业务 7:非财政拨款收支业务 8:预算结转结余及分配业务 9:净资产业务 10:资产业务 11:负债业务
一共有几十个PDF文档,这样大大提升了效率,嘻嘻!!!