非机构化解析【包含PDF、word、PPT】

此项目是针对PDF、docx、doc、PPT四种非结构化数据进行解析,识别里面的文本和图片。

代码结构

├── Dockerfile
├── requirements
├── resluts
├── test_data
│   ├── 20151202033304658.pdf
│   ├── 2020_World_Energy_Data.pdf
│   ├── 2022110404_pdf.docx
│   ├── 2022110404_pdf.pdf
│   ├── H3_AP201701200282787162_01.pdf
│   ├── H3_AP202205271568109307_1.pdf
│   ├── H3_AP202205271568109307_1.pptx
│   ├── test.pdf
│   ├── test.pptx
│   ├── test_table.pdf
│   └── test_word.docx
├── Unstr_ApiSever.py ###----------API服务
├── Unstructured_PDF_Operation_Code.py
├── Unstructured_PPT_Operation_Code.py
├── Unstructured_Word_Operation_Code.py

PDF操作

部分代码展示

import fitz,os
doc = fitz.open('./test_data/2022110404_pdf.pdf')
def func(doc):
    for i in range(len(doc)):
        imglist = doc.getPageImageList(i)
        for j, img in enumerate(imglist):
            xref = img[0]
            pix = fitz.Pixmap(doc, xref)  # make pixmap from image
            if pix.n - pix.alpha < 4:  # can be saved as PNG
                pix.writePNG("p%s-%s.png" % (i + 1, j + 1))
            else:  # CMYK: must convert first
                pix0 = fitz.Pixmap(fitz.csRGB, pix)
                pix0.writePNG("p%s-%s.png" % (i + 1, j + 1))
                pix0 = None  # free Pixmap resources
            pix = None  # free Pixmap resources
            
if __name__ == "__main__":
    func(doc=fitz.open('./test_data/2022110404_pdf.pdf'))         # input the path of pdf file
    func1('./test_data')  # input the path of pdf file            
	pdf_path = "./test_data/2022110404_pdf.pdf"
	doc = fitz.open(pdf_path)
	num_pages = doc.page_count
	# Text info of PDF
	for page_index in range(num_pages):
	    page = doc.load_page(page_index)
	    text = page.get_text()
	    print(f"第{page_index + 1}页的文本内容为:\n{text}\n")

结果如下:
在这里插入图片描述

word操作

import docx
import os, re
from docx import Document

class Word:
    """
    Word操作
    """
    def Word_get_pictures(self,infile):
        try:
            in_File = infile.split('/')[2][:-5]  ##---------Word名称
            new_filepath = os.path.join('%s/%s') % ('./resluts', in_File)
            doc = docx.Document(infile)
            dict_rel = doc.part._rels
            for rel in dict_rel:
                rel = dict_rel[rel]
                if "image" in rel.target_ref:
                    if not os.path.exists(new_filepath):
                        os.makedirs(new_filepath)
                    img_name = re.findall("/(.*)", rel.target_ref)[0]
                    word_name = os.path.splitext(new_filepath)[0]
                    if os.sep in word_name:
                        new_name = word_name.split('\\')[-1]
                    else:
                        new_name = word_name.split('/')[-1]
                    img_name = f'{new_name}-' + '-' + f'{img_name}'
                    with open(f'{new_filepath}/{img_name}', "wb") as f:
                        f.write(rel.target_part.blob)
        except:
            pass

    def Word_Get_txt(self,infile):
        in_File = infile.split('/')[2][:-5]  ##---------Word名称
        new_filepath = os.path.join('%s/%s') % ('./resluts', in_File)
        document = Document(infile)
        all_paragraphs = document.paragraphs
        all_tables = document.tables
        with open(os.path.join("%s/%s.txt") % (new_filepath, "resluts"), 'w', encoding='utf-8') as f:
            for paragraph in all_paragraphs:
                # print(paragraph.text.replace("   ", "").replace(" ", ""))
                f.write(paragraph.text.replace("   ", "").replace(" ", ""))
            for table in all_tables:
                for row in table.rows:
                    for cell in row.cells:
                        f.write(cell.text)
                        # print(cell.text)  # 打印
if __name__ == '__main__':
    # 获取文件夹下的word文档列表,路径自定义
    # os.chdir("./test_data/2022110404_pdf.docx")

    Word().Word_get_pictures("./test_data/2022110404_pdf.docx")
    Word().Word_Get_txt("./test_data/2022110404_pdf.docx")

结果如下:
在这里插入图片描述

PPT操作

import os
from zipfile import ZipFile
from pptx import Presentation
from docx import Document

class PPT:
    def PPT_get_pictrue(self,infile):
        in_File = infile.split('/')[2][:-5] 
        new_filepath = os.path.join('%s/%s') % ('./resluts', in_File)
        if not os.path.exists(new_filepath):
            os.makedirs(new_filepath)
        with ZipFile(infile) as f:
            for file in f.namelist():
                if file.startswith("ppt/media/"):
                    f.extract(file, path=new_filepath)

        return new_filepath

    def PPT_get_words_to_txt(self,inpath, outpath):
        m_ppt = Presentation(inpath)
        # print(len(m_ppt.slides))
        with open(os.path.join('%s/%s.txt') % (outpath, 'resluts'), 'w', encoding='utf-8') as f:
            for slide in m_ppt.slides: 
                for shape in slide.shapes:
                    if not shape.has_text_frame: 
                        continue
                    for paragraph in shape.text_frame.paragraphs: 
                        for content in paragraph.runs:
                            f.write(content.text + '\n')

    def PPT_get_words_to_docx(self,filepath,save_path):
        wordfile = Document()
        pptx = Presentation(filepath)
        for slide in pptx.slides:
            for shape in slide.shapes:
                if shape.has_text_frame:
                    text_frame = shape.text_frame
                    for paragraph in text_frame.paragraphs:
                        wordfile.add_paragraph(paragraph.text)

        wordfile.save(save_path)


if __name__ == "__main__":
    infile = "./test_data/OpenCV算法解析.pptx"
    new_infile=PPT().PPT_get_pictrue(infile)
    PPT().PPT_get_words_to_txt(infile,new_infile)

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/523696.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM字节码与类的加载——class文件结构

文章目录 1、概述1.1、class文件的跨平台性1.2、编译器分类1.3、透过字节码指令看代码细节 2、虚拟机的基石&#xff1a;class文件2.1、字节码指令2.2、解读字节码方式 3、class文件结构3.1、魔数&#xff1a;class文件的标识3.2、class文件版本号3.3、常量池&#xff1a;存放所…

【MATLAB源码-第181期】基于matlab的32QAM调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;频率偏移是一种常见的问题&#xff0c;它会导致接收到的信号频率与发送信号的频率不完全匹配&#xff0c;进而影响通信质量。在调制技术中&#xff0c;QPSK&#xff08;Quadrature Phase Shift Keyi…

python打印杨辉三角形

杨辉三角形&#xff0c;这个在国外被叫做帕斯卡三角形&#xff0c;中华文明为何立于世界之颠&#xff0c;这个就是最好的证明&#xff0c;古人的杨辉至少是这个帕斯卡的鼻祖辈&#xff0c;比帕某早了393年发现&#xff0c;那时候可没有知识产权概率&#xff0c;不然就是妥妥的侵…

[尚硅谷 flink] 基于时间的合流——双流联结(Join)

文章目录 8.1 窗口联结&#xff08;Window Join&#xff09;8.2 **间隔联结&#xff08;Interval Join&#xff09;** 8.1 窗口联结&#xff08;Window Join&#xff09; Flink为基于一段时间的双流合并专门提供了一个窗口联结算子&#xff0c;可以定义时间窗口&#xff0c;并…

鲸鱼优化算法(Whale Optimization Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 鲸鱼优化算法&#xff08;Whale Optimization Algorithm, WOA&#xff09;是一种模拟鲸鱼捕食行为的优化算法。想象一下&#xff0c;你…

一文学会Semaphore(信号量)

// 空出来椅子 semaphore.release(count); } } catch (Exception e){ } } }; t.setName("Thread --> " i); t.start(); } } 程序将一直执行下去&#xff0c;不会漏单&#xff0c;也不会出现椅子占用数量大于20的情况。 AQS基础 Semaphore是一种共享锁&#xf…

若依框架mysql 搜索中文等于不生效

背景&#xff0c;字段存储的是中文 不生效代码如下 <if test"constellation ! null and constellation ! ">AND u.constellation #{constellation}</if> 正确生效的代码如下 <if test"constellation ! null and constellation ! ">A…

kubernetes集群添加到jumpserver堡垒机里管理

第一步、在kubernetes集群中获取一个永久的token。 jumpserver堡垒机用api的来管理kubernetes&#xff0c;所以需要kubernetes的token&#xff0c;这个token还需要是一个永久的token&#xff0c;版本变更&#xff1a;Kubernetes 1.24基于安全方面的考虑&#xff08;特性门控Le…

C语言自定义类型变量——结构体(二)

前言&#xff1a;上一篇内容中我们概述了结构体的基本内容&#xff0c;包括结构体的定义&#xff0c;声明&#xff0c;创建和初始化&#xff0c;内存对齐等问题&#xff0c;本篇将进一步深入结构体相关内容&#xff0c;包括为什么会存在内存对齐&#xff0c;结构体如何传参&…

【JavaWeb】Day35.MySQL概述——数据库设计-DDL(二)

表操作 关于表结构的操作也是包含四个部分&#xff1a;创建表、查询表、修改表、删除表。 1.创建 语法 create table 表名( 字段1 字段1类型 [约束] [comment 字段1注释 ], 字段2 字段2类型 [约束] [comment 字段2注释 ], ...... 字段n 字段n类型 [约束] [comment …

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…

二. CUDA编程入门-双线性插值计算

目录 前言0. 简述1. 执行一下我们的第十个CUDA程序2. Bilinear interpolation3. 代码分析总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 Note&#xff1a;关于 CUDA 加速双线程插值的内容博主…

王权与自由国际服加速器推荐 一键下载王权与自由加速器分享

《王权与自由》&#xff0c;还记得第一天进游戏各个服务器爆满锁服的盛况&#xff0c;好不容易挤进去&#xff0c;地图上人山人海&#xff0c;NPC埋没在玩家的人海里&#xff0c;差点找不到。迎来了12月20日的大型更新后&#xff0c;再进入游戏&#xff0c;服务器每一个都空闲无…

【C语言】函数递归编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 总结 题目一&#xff1a; 题目&#xff1a;接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。&#xff08;递归完成&#xff09; 列如&#xff1a; …

0104练习与思考题-算法基础-算法导论第三版

2.3-1 归并示意图 问题&#xff1a;使用图2-4作为模型&#xff0c;说明归并排序再数组 A ( 3 , 41 , 52 , 26 , 38 , 57 , 9 , 49 ) A(3,41,52,26,38,57,9,49) A(3,41,52,26,38,57,9,49)上的操作。图示&#xff1a; tips:&#xff1a;有不少在线算法可视化工具&#xff08;软…

C#基础:类,对象,类成员简介(第四节课)

本节内容&#xff1a; 类与对象的关系 什么时候叫“对象”&#xff0c;什么时候叫实例引用变量与实例的关系 类的三大成员 属性方法事件 类的静态成员与实例成员 关于“绑定” 1.什么是类&#xff1a;&#xff08;再详细一点&#xff09; 类是对现实世界事物进行抽象所…

网络基础三——初识IP协议

网络基础三 ​ 数据通过应用层、传输层将数据传输到了网络层&#xff1b; ​ 传输层协议&#xff0c;如&#xff1a;TCP协议提供可靠性策略或者高效性策略&#xff0c;UDP提供实时性策略&#xff0c;保证向下层交付的数据是符合要求的的&#xff1b;而网络层&#xff0c;如&a…

59 使用 uqrcodejs 生成二维码

前言 这是一个最近的一个来自于朋友的需求, 然后做了一个 基于 uqrcodejs 来生成 二维码的一个 demo package.json 中增加以依赖 "uqrcodejs": "^4.0.7", 测试用例 <template><div class"hello"><canvas id"qrcode&qu…

2023天梯赛

2023天梯赛 L1-089 最好的文档 分数 5 作者 陈越 单位 浙江大学 有一位软件工程师说过一句很有道理的话&#xff1a;“Good code is its own best documentation.”&#xff08;好代码本身就是最好的文档&#xff09;。本题就请你直接在屏幕上输出这句话。 输入格式&…

豆瓣9.7,这部Java神作第3版重磅上市!

Java 程序员们开年就有重磅好消息&#xff0c;《Effective Java 中文版&#xff08;原书第 3 版&#xff09;》要上市啦&#xff01; 该书的第1版出版于 2001 年&#xff0c;当时就在业界流传开来&#xff0c;受到广泛赞誉。时至今日&#xff0c;已热销近20年&#xff0c;本书…