PyPDF2提取pdf中的信息
一、说在前面
0、还没系统学习,很迷茫,整体思路不明朗
1、完成了将pdf中的文字信息提取到txt,提取pdf中的前两级结构
2、下阶段完成从文本中抽取目标数据
3、所用包:pdfminer,PyPDF2
二、将pdf中的文字信息提取到txt(为抽取目标数据做准备)
# _*_coding:utf-8_*_ import os from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfpage import PDFPage from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal, LAParams from pdfminer.pdfpage import PDFTextExtractionNotAllowed def parse(Path, Save_name): parser = PDFParser(Path) document = PDFDocument(parser) if not document.is_extractable: raise PDFTextExtractionNotAllowed else: rsrcmgr = PDFResourceManager() laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.create_pages(document): interpreter.process_page(page) layout = device.get_result() for x in layout: if (isinstance(x, LTTextBoxHorizontal)): with open('%s' % (Save_name), 'a') as f: results = x.get_text().encode('utf-8') try: f.write(results.decode()) #print(results.decode()) except: print("error") #print(results.decode('raw_unicode_escape')) #print(str(results).encode('raw_unicode_escape').decode()) def file_name(file_dir): for root, dirs, files in os.walk(file_dir): return files if __name__ == '__main__': file_dir = "data" files = file_name(file_dir) print(files) for i in range(len(files)): print(i, files[i]) Path = open(file_dir+'/'+files[i], 'rb') names = files[i].split('.') parse(Path, 'rs/'+names[0]+'.txt')
三、提取pdf中的前两级结构
import os from PyPDF2 import PdfFileReader as pdf_read #每个书签的索引格式 #{'/Title': '书签名', '/Page': '指向的目标页数', '/Type': '类型'} directory_str = '' def bookmark_listhandler(list): global directory_str for message in list: if isinstance(message, dict): directory_str += message['/Title'] + '\n' # print(message['/Title']) else: bookmark_listhandler(message) def file_name(file_dir): for root, dirs, files in os.walk(file_dir): return files file_dir = "data" files = file_name(file_dir) print(files) for i in range(len(files)): print(i, files[i]) with open(file_dir+'/'+files[i], 'rb') as f: pdf = pdf_read(f) # 检索文档中存在的文本大纲,返回的对象是一个嵌套的列表 text_outline_list = pdf.getOutlines() bookmark_listhandler(text_outline_list) names = files[i].split('.') with open(names[0]+'.txt', 'w', encoding='utf-8') as f: f.write(directory_str)