非机构化解析【包含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.hqwc.cn/news/599071.html

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

相关文章

【CSS】新闻页面制作 案例一

&#xff08;大家好&#xff0c;今天我们将通过案例实战对之前学习过的CSS知识进行复习巩固&#xff0c;大家和我一起来吧&#xff0c;加油&#xff01;&#x1f495;&#xff09; 目录 一、前述 二、素材 案例文字素材 案例图片素材 三、案例分析 四、案例实施 五、应用…

基于Spring Boot的旅游管理系统设计与实现

基于Spring Boot的旅游管理系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 旅游方案&#xff0c;用户通过旅游方案可以查看方案编号…

Collection与数据结构 Stack与Queue(二):队列与Queue

1. 队列 1.1 概念 只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列&#xff1a;进行删除操作…

Android Studio学习12——Android中Activity之间的跳转

显示跳转 隐式跳转 不常用 跳转到浏览器 打开相机 ……

Svg Flow Editor 原生svg流程图编辑器(五)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

性能优化-如何爽玩多线程来开发

前言 多线程大家肯定都不陌生&#xff0c;理论滚瓜烂熟&#xff0c;八股天花乱坠&#xff0c;但是大家有多少在代码中实践过呢&#xff1f;很多人在实际开发中可能就用用Async&#xff0c;new Thread()。线程池也很少有人会自己去建&#xff0c;默认的随便用用。在工作中大家对…

将excel,csv中合并块中某条记录的值应用到整个块(使用多行的值,来填充新列数据)。

背景描述 在excel中使用其它列的值&#xff0c;根据某种计算规则来填充另一列&#xff08;或新列&#xff09;很容易实现。但是如果需要根据合并块中的多行来填充列时&#xff0c;就不容易实现&#xff0c;由于对excel不是太常用&#xff0c;因此这里使用的命令行工具实现的。…

nodejs应用程序不同部署环境下的差异配置方案

一、背景 nodejs应用程序&#xff0c;不同于java语言使用分布式配置&#xff0c;当部署于不同的环境里&#xff0c;因为环境的差异&#xff0c;配置项的值也不尽相同。 最常见的差异就是数据库的连接信息&#xff0c;而代码是一份&#xff0c;不能把生产环境的信息暴露在非生产…

分布式主键ID生成策略

业务系统对分布式ID的要求 唯一性&#xff1a;在分布式系统中&#xff0c;每个节点都需要生成唯一的标识符来确保数据的唯一性。传统的单点生成ID方式无法满足分布式环境下的需求&#xff0c;而分布式ID能够在整个系统中保证每个节点生成的ID都是唯一的。 顺序性&#xff1a;某…

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑(Vital_Signs、IWR6843AOPEVM)

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑&#xff08;Vital_Signs、IWR6843AOPEVM&#xff09; 文章目录 生命体征基本介绍IWR6843AOPEVM的配置上位机配置文件避坑上位机start测试距离检测心跳检测呼吸频率检测空环境测试 附录&#xff1a;结构框架雷达基…

rocketMQ的主题

1.主题 2.队列 一个topic的queue中 的消息只能被一个消费者消费 3.分片 4.消息标识 5.生产者和消费者 工作流程

网络安全意识也是基础防御中的关键一环

在当今数字化时代&#xff0c;网络安全已经成为企业和个人生活中不可或缺的一部分。网络攻击的不断演进和加剧使得保护个人隐私、商业机密和国家安全变得尤为重要。然而&#xff0c;网络安全并非仅仅是技术层面的问题&#xff0c;更是一个综合性的挑战&#xff0c;需要广泛的参…