非机构化解析【包含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 imageif pix.n - pix.alpha < 4:  # can be saved as PNGpix.writePNG("p%s-%s.png" % (i + 1, j + 1))else:  # CMYK: must convert firstpix0 = fitz.Pixmap(fitz.csRGB, pix)pix0.writePNG("p%s-%s.png" % (i + 1, j + 1))pix0 = None  # free Pixmap resourcespix = None  # free Pixmap resourcesif __name__ == "__main__":func(doc=fitz.open('./test_data/2022110404_pdf.pdf'))         # input the path of pdf filefunc1('./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 PDFfor 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 Documentclass 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._relsfor 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:passdef 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.paragraphsall_tables = document.tableswith 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 Documentclass 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_filepathdef 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: continuefor 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_framefor 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Web】纯萌新的BUUCTF刷题日记Day1

目录 [RoarCTF 2019]Easy Java [网鼎杯 2018]Fakebook [CISCN2019 华北赛区 Day2 Web1]Hack World [BJDCTF2020]The mystery of ip [网鼎杯 2020 朱雀组]phpweb [BSidesCF 2020]Had a bad day [BJDCTF2020]ZJCTF&#xff0c;不过如此 [BUUCTF 2018]Online Tool [GXYCTF…

虚拟主机VPS和共享服务器有什么区别?VPS和共享服务器怎么选择,VPS和云服务器区别

今天易极赞小编来跟大家科普一个新的知识“虚拟主机和云服务器有什么区别&#xff1f;”看完这篇文章后你应该就能知道虚拟主机和云服务器哪个更适合你了。 如果你不知道服务器的常见类型有哪些&#xff0c;查看下面这篇文章&#xff1a; 服务器7中常见的类型&#xff0c;服务…

【C语言】如何判断一个机器的大小端

如何判断一个机器的大小端 一&#xff1a;什么是机器的大小端二&#xff1a;为什么会有大小端三&#xff1a;设计一个小程序来判断当前机器的大小端方法一&#xff1a;指针类型强转方法二&#xff1a;联合体 一&#xff1a;什么是机器的大小端 机器的大小端是指在内存中存储多…

【移动安全】对webview漏洞的一些分析

这次分析的app如下&#xff1a; 打开发现该app发现需要登录界面&#xff1a; 拖进jadx看一下&#xff0c;先来看一下AndroidManifest.xml文件 发现有两个类是导出&#xff0c;再来分析这两个类 这个RegistrationWebView类利用webview.loadUrl进行加载网页 java public class…

JS——判断节假日(假日包括周末,不包括调休上班的周末)

思路&#xff1a;创建两个数组&#xff0c;数组1为节假日数组&#xff0c;数组2为是周末上班日期数组。如果当前日期&#xff08;或某日期&#xff09;同时满足2个条件&#xff08;1.在节假日数组内或在周末。2.不在周末上班日期数组&#xff09;即为节假日&#xff0c;否则即为…

SystemC入门学习Demo用例的工程化配置

背景&#xff1a;对不同的用例文件&#xff0c;使用CMakeLists.txt进行工程化管理的演示&#xff0c;这样开发者可以更加关注在代码开发上。 1&#xff0c;首先安装好系统环境的systemC库&#xff1a;ubuntu系统安装systemc-2.3.4流程-CSDN博客 2&#xff0c;准备好一个demo用…

再续前缘——C++【入门】

目录 1. 引用 引用概念 使用场景 1. 做参数 2. 引用做返回值 3.传值、传引用效率比较 4. 引用和指针的不同点 2. 内联函数 3.auto关键字 推导应用场景 auto不能推导的场景 4.基于范围的for循环(C11) 5.指针空值nullptr(C11) 1. 引用 引用概念 引用不是新定义一个…

JUC:手写实现一个简易的线程池(Java)

目录 ​编辑 先上完整代码&#xff1a; 解析&#xff1a; 任务队列&#xff1a; 线程池类&#xff1a; 拒绝策略&#xff1a; 先上完整代码&#xff1a; public class MyThreadPool {public static void main(String[] args) {ThreadPool threadPool new ThreadPool(2, …

Linux进程状态深度解析:探索进程的生命周期

文章目录 一、引言1、进程的概念与重要性2、Linux系统下进程状态的意义3、进程状态与系统性能的关系 二、Linux下进程状态概述1、Linux进程状态的分类2、进程状态信息的获取方法 三、Linux下进程状态详解1、运行状态&#xff08;Running&#xff09;2、可中断睡眠状态&#xff…

27.WEB渗透测试-数据传输与加解密(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;26.WEB渗透测试-BurpSuite&#xff08;五&#xff09; BP抓包网站网址&#xff1a;http:…

实现Hello Qt 程序

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、使用 "按钮" 实现 1、纯代码方式实现 2、可视化操作实现 &#xff08;1&#xff09…

Hive3.0.0建库表命令测试

Hive创建表格格式如下&#xff1a; create [external] table [if not exists] table_name [(col_name data_type [comment col_comment],)] [comment table_comment] [partitioned by(col_name data_type [comment col_comment],)] [clustered by (col_name,col_name,...)…

对抗样本攻击

对抗样本是指经过特殊设计或调整的输入数据&#xff0c;旨在欺骗人工智能模型&#xff0c;使其产生错误的预测或输出。对抗样本通常是通过对原始输入进行微小但精心计算的改变&#xff0c;使得模型产生意外的结果。这种模糊化的输入可能难以从人类角度甄别&#xff0c;但对机器…

gma 教程:计算标准化降水指数(SPI)

安装 gma&#xff1a;pip install gma &#xff08;依赖的 gdal 需自行安装&#xff09; 本文基于&#xff1a;gma 2.0.8&#xff0c;Python 3.10 本文用到数据请从 gma 网站获取&#xff1a;https://gma.luosgeo.com/UserGuide/climet/Index/SPI.html 。 SPEI 函数简介 gma.c…

比较720组结构数列的收敛过程

在行&#xff0c;列可自由变换的平面上3点结构只有6个 这次计算由这6个结构排列组合&#xff0c;构成的所有720个不重复数列的递推收敛过程。 结果表明&#xff0c;所有的数列都可以在有限步内收敛。 有461个数列在3-4-3的递推过程中是天然稳定的&#xff0c;收敛结果就是本身…

STM32学习和实践笔记(4):分析和理解GPIO_InitTypeDef GPIO_InitStructure (c)

第二个成员变量是GPIOSpeed_TypeDef GPIO_Speed&#xff1b;也与int a一样同理。 GPIOSpeed_TypeDef是一个枚举类型&#xff0c;其定义如下&#xff1a; typedef enum { GPIO_Speed_10MHz 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef; #define IS_GPI…

Leetcode刷题-哈希表详细总结(Java)

哈希表 当我们想使⽤哈希法来解决问题的时候&#xff0c;我们⼀般会选择如下三种数据结构。 数组set &#xff08;集合&#xff09;map&#xff08;映射&#xff09; 当我们遇到了要快速判断⼀个元素是否出现集合⾥的时候&#xff0c;就要考虑哈希法。如果在做⾯试题⽬的时候…

Samba 总是需要输入网络凭证

输入网络凭证&#xff1a; 用户名是 cat /etc/samba/smb.conf&#xff0c;查看 valid users mxw 为用户名。而不是其他账号名或者用户名&#xff0c;更不是登录计算机时的计算机名&#xff1b; 密码是 需要记住安装samba服务器时&#xff0c;自己设置的password&#xff1…

LED发光模组的故障及解决方法

LED发光模组在应用过程中可能会出现各种故障&#xff0c;正确诊断并采取相应的解决方法至关重要&#xff0c;以下是一些常见故障现象及其解决方法的总结&#xff1a; 一、现象&#xff1a;所有的LED闪烁 问题&#xff1a;接触不良 解决方法&#xff1a;检查并重新固定松动处&am…

单片机为什么还在用C语言编程?

单片机产品的成本是非常敏感的。因此对于单片机开发来说&#xff0c;最重要的是在极其有限的ROM和RAM中实现最多产品的功能。或者反过来说&#xff0c;实现相同的产品功能&#xff0c;所需要的ROM和RAM越小越好&#xff0c;在开始前我有一些资料&#xff0c;是我根据网友给的问…