首页 > 技术文章 > PyPDF2提取pdf中的信息

20183544-wangzhengshuai 2021-06-10 21:40 原文

一、说在前面

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')
View Code

 

 三、提取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)
View Code

 

推荐阅读