首页 > 其他分享 >非机构化解析【包含PDF、word、PPT】

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

时间:2024-04-07 18:03:46浏览次数:31  
标签:word name text PPT new pdf PDF path os

此项目是针对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)

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

标签:word,name,text,PPT,new,pdf,PDF,path,os
From: https://blog.csdn.net/zhanghan11366/article/details/137471811

相关文章

  • 【专题】2024年3月电商行业报告合集汇总PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35663原文出处:拓端数据部落公众号随着数字技术的飞速发展,电商行业正经历着前所未有的变革。本报告合集汇总旨在梳理2024年3月电商领域的最新动态和发展趋势。我们将从行业趋势与细分领域研究入手,深入探讨3C数码商用品、母婴营养品以及AI数字人产......
  • TypeScript: pdf.js v4.0.379
     <!doctypehtml><html><head><metacharset="utf-8"> <metahttp-equiv="X-UA-Compatible"content="chrome=1"><metaname="viewport"content="width=device-width,initial-sc......
  • PageOffice6 实现 word 全文检索
    在文档服务器中存储有成千上万个文档的情况下,用户想要找到并打开包含特定关键字的文档,无疑是一项艰巨的任务。如何高效地管理和检索大量的Word文档呢?在现有的技术解决方案中,许多方法都依赖于服务器端的ApachePOI技术。这种技术的基本原理是,先将所有文档的文本内容提取出来,然后存......
  • 基于SpringBoot的“垃圾分类网站”的设计与实现(源码+数据库+文档+PPT)
    基于SpringBoot的“垃圾分类网站”的设计与实现(源码+数据库+文档+PPT)开发语言:Java数据库:MySQL技术:SpringBoot工具:IDEA/Ecilpse、Navicat、Maven系统展示系统功能结构图系统功能界面图用户登录、用户注册界面图4垃圾图谱界面图管理员登录界面图用户......
  • 基于SpringBoot的“汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)
    基于SpringBoot的“汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)开发语言:Java数据库:MySQL技术:SpringBoot工具:IDEA/Ecilpse、Navicat、Maven系统展示系统功能结构图管理员登录界面图管理员功能界面图用户管理界面图车辆品牌管理界面图车辆颜色管......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--可视化编辑pdf
    Pdfium.Net.Free支持.NETFramework4.0.NETFramework4.5.NETStandard2.0.Net8.0可以和PdfiumViewer.Free共同使用预览pdf,也可以直接引用Pdfium.Net.Free操作pdf,解决部分.NetCore调用的问题,Pdfium.Net.Free封装了现有Pdfium的函数,实现了部分操作pdf的功能,部分功......
  • 凡人修仙传8w字大纲pdf
    凡人修仙传8w字大纲pdf全资料包括主角韩立的一生、法宝法器、修炼体系、人物、妖兽、地理、宗门、设定、丹药、灵草、术法、材料、功法典籍、阵法等等详细进行了介绍。总pdf136页,内容来自于网络,仅用于学习交流,版权归原作者所有,侵权删。pdf永久网盘地址:https:/......
  • MC14516BDR2G倒数计数器芯片中文资料PDF数据手册参数引脚图图片特性概述
    产品概述:MC14516B同步正数/倒数二进制计数器在一个单片结构中使用MOSP沟道和N沟道增强模式器件构造。此计数器可通过对预设输入(P0、P1、P2、P3)应用所需的二进制值,然后将预设启用(PE)置于高电平,来进行预设。计数方向通过向UP/DOWN输入应用高电平(用于正数)或低电平(用于......
  • 使用POI填充Word文档,一些注意事项以及解决办法
    有这样一个需求:需要将用户输入的数据填写到准备好的Word模版中并提供下载,最终选择POI-tl和POI来完成上述需求。在这个过程中,主要遇到了以下两个问题:1.Word的两个格式doc和docx(两种文件的区别大家可以自行百度了解下),POI并没有提供统一的处理类。分别用HWPFDocument处理doc......
  • Word中字体间距变大且无法修改字体
    Word中字体间距变大且无法修改字体问题描述今天在Word中写文档的时候不知怎么触发了输入法全角半角设置快捷键,在Word中输入的英文字体间距很大,起初我以为是字体问题,然而修改字体后无任何变化,仔细研究一番后注意到输入法英文状态下为全角输入,这才找到问题所在,如下图所示全......