zoukankan      html  css  js  c++  java
  • 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')
    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'] + '
    '
                # 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

  • 相关阅读:
    不用写Windows服务实现定时器功能(FluentScheduler )
    (转).NET开发人员必备的可视化调试工具(你值的拥有)
    《C#本质论》读书笔记(14)支持标准查询操作符的集合接口
    关闭 Visual Studio 2013 的 Browser Link 功能
    《C#本质论》读书笔记(12)委托和Lambda表达式
    (2)Underscore.js常用方法
    JS中级
    .NET开发工具之Excel导出公共类
    (1)Underscore.js入门
    datatable绑定comboBox显示数据[C#]
  • 原文地址:https://www.cnblogs.com/20183544-wangzhengshuai/p/14872954.html
Copyright © 2011-2022 走看看