Python 批量提取pdf/word中的图片,并生成markdown文档

from sdk.utils.util_class import PathParser
from sdk.temp.temp_supports import IsSolution, DM
这些全是自定义的工具包,自己去其他文章下找

# !/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: JHC000abc@gmail.com
@file: demo.py
@time: 2024/3/6 16:10 
@desc: docx/pdf 提取图片 转存成 markdown文档"""# python-docx
from docx import Document
# pymupdf
import fitz
import re
from sdk.utils.util_class import PathParser
from sdk.temp.temp_supports import IsSolution, DMclass Solution(IsSolution):"""Solution"""def __init__(self, **kwargs):"""初始化函数:param kwargs: 字典类型的参数字典,包含可选的关键字参数"""super(Solution, self).__init__()self.__dict__.update({k: v for k, v in [i for i in locals().values() if isinstance(i, dict)][0].items()})def exit_handler(self):"""程序退出自动执行:return:"""print("程序退出")def muti_thread_function(self, *args):"""处理数据函数:param args::return:"""img_out_file_lis,file_split = argswith open(self.folder.merge_path([self.save_path, f"{file_split.name}.{file_split.tail}.md"]), "w",encoding="utf-8") as f:for _file in img_out_file_lis:_file_split = PathParser(_file)img_folder = "/".join(self.folder.split_path(_file)[-2:])f.write(f"![{_file_split.name}](./{img_folder})\n")@DM.add_project()def parse_imgs_from_docx(self, file, file_split):"""从doc文档中解析,保存图片,并返回图片本地保存路径:param file::return:"""print("提交", file)img_out_file_lis = []doc = Document(file)dict_rel = doc.part.relsfor index, (r_id, rel) in enumerate(dict_rel.items()):if not (  # 如果文件不是在media或者embeddings中的,直接跳过str(rel.target_ref).startswith('media')or str(rel.target_ref).startswith('embeddings')):continue# 如果文件不是我们想要的后缀,也直接跳过_file_split = PathParser(str(rel.target_ref))if _file_split.tail.lower() not in ['png', "jpeg", 'jpg', 'bin']:continuefile_name = _file_split.name.lower()+"."+_file_split.tail_save_path = self.make_out_path(self.save_path,[f"{file_split.name}.{file_split.tail}"])img_save_file = self.folder.merge_path([_save_path,file_name])self.save_imgs(img_save_file,rel.target_part.blob)img_out_file_lis.append(img_save_file)self.muti_thread_function(img_out_file_lis, file_split)print("结束",file)@DM.add_project()def parse_imgs_from_pdf(self,file,file_split):""":param file::param file_split::return:"""img_out_file_lis = []checkXO = r"/Type(?= */XObject)"checkIM = r"/Subtype(?= */Image)"# 打开pdfdoc = fitz.open(file)# 图片计数imgcount = 0# 获取对象数量长度lenXREF = doc.xref_length()for i in range(1, lenXREF):# 定义对象字符串text = doc.xref_object(i)isXObject = re.search(checkXO, text)# 使用正则表达式查看是否是图片isImage = re.search(checkIM, text)# 如果不是对象也不是图片,则continueif not isXObject or not isImage:continueimgcount += 1# 根据索引生成图像pix = fitz.Pixmap(doc, i)# 根据pdf的路径生成图片的名称new_name = f"{file_split.name}_{i}.png"# 如果pix.n<5,可以直接存为PNG_save_path = self.make_out_path(self.save_path,[f"{file_split.name}.{file_split.tail}"])_save_file = self.folder.merge_path([_save_path, new_name])if pix.n < 5:pix.writePNG(_save_file)# 否则先转换CMYKelse:pix0 = fitz.Pixmap(fitz.csRGB, pix)pix0.writePNG(_save_file)pix0 = None# 释放资源pix = Noneimg_out_file_lis.append(_save_file)self.muti_thread_function(img_out_file_lis, file_split)def save_imgs(self,file,date):"""保存图片:param file::param date::return:"""with open(file, "wb") as f:f.write(date)def process(self, **kwargs):"""处理文件:param kwargs: 关键字参数:return: 无返回值"""self.in_path = kwargs["in_path"]self.save_path = kwargs["save_path"]self.folder.create_folder(self.save_path)self.name_set = set()for file, name in self.get_file(self.in_path, status=True):print(file, name)  # 打印文件名和名称file_split = PathParser(file)if file_split.tail == "docx":self.parse_imgs_from_docx(file, file_split)elif file_split.tail == "pdf":self.parse_imgs_from_pdf(file, file_split)DM.close_pool()if __name__ == '__main__':in_path = R"D:\Desktop\1"save_path = R"D:\Desktop\2"e = Solution()e.process(in_path=in_path, save_path=save_path)

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

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

相关文章

做抖店月入百万还是会亏损?珠珠来告诉你,做抖店水到底有多深?

我是电商珠珠 抖店的热度一直只高不低&#xff0c;所以很多想要做的新手不知道抖店水的深浅&#xff0c;就一股脑的去做了。结果又是被扣保证金&#xff0c;又是被判定无货源违规的&#xff0c;最后灰头土脸的关了店。那些说做了十万十几万的&#xff0c;几百万的难道都是假的…

Windows主机巡检vbs脚本

’ Windows主机巡检脚本 ’ 获取主机名称 Set objNetwork CreateObject(“WScript.Network”) strComputer objNetwork.ComputerName ’ 获取磁盘信息 Set objWMIService GetObject(“winmgmts:\” & strComputer & “\root\cimv2”) Set colDisks objWMISer…

在三个el-form-item中的el-radio的值中取一个发送给后端怎么获取

问: 请问,这段代码怎么获取:无策略,策略1,策略2的值? 回答: 问: 三个里面只可以选中一个吗? 回答:

应对求职高峰:金三银四必备问答与大厂模板,成功职场攻略!

三四月是求职的黄金季节&#xff0c;很多设计师会选择在这个时候准备作品集。一个视觉精美、有条不紊的作品集&#xff0c;无疑是走向大厂的敲门砖。但是我问了一圈优秀社区的朋友&#xff0c;发现大家或多或少都遇到过问题。今天我整理了群里的高频问题&#xff0c;附上了解决…

[GXYCTF2019]BabyUpload1 -- 题目分析与详解

目录 一、题目分析 1、判断题目类型&#xff1a; 2、上传不同类型的文件进行测试&#xff1a; 二、题目详解 1、写出.htaccess文件&#xff1a; 2、.htaccess 文件配合 .jpg 上传&#xff1a; 3、利用 中国蚁剑/中国菜刀 获取flag&#xff1a; 一、题目分析 1、判断题目…

信奥一本通:1082:求小数的某一位

分数转换为小数就是分子除分母&#xff0c;但是他要求指定的n项小数&#xff0c;n大于1小于10000&#xff0c;如果是10000的话就太大了&#xff0c;用传统的方式无法找出指定的位数。 方式就是&#xff1a;例如求2分之1&#xff0c;我们先用除法把具体的值求出来&#xff0c;然…

图机器学习(1)--导论

0 CS224W概况 斯坦福大学CS224W课程&#xff1a;http://cs224w.stanford.edu/ 图机器学习的库&#xff1a; 为什么是图&#xff1f;图是描述和分析具有关系/交互的实体的通用语言。 1 图数据举例 复杂域具有丰富的关系结构&#xff0c;可以表示为关系图。 通过显式地建模关…

【论文阅读】Generative Pretraining from Pixels

Generative Pretraining From Pixels 引用&#xff1a; Chen M, Radford A, Child R, et al. Generative pretraining from pixels[C]//International conference on machine learning. PMLR, 2020: 1691-1703. 论文链接&#xff1a; http://proceedings.mlr.press/v119/chen…

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候&#xff0c;脑海里先想出来的是暴力方法&#xff0c;一次排序&#xff0c;将这个数组变为有序的&#xff0c;再通过三次for循环来寻找满足条件的数字&#xff0c;然后将符合条件的数组与之前符合条件的数组进行一一对比…

2024.3.6补题

1.关鸡 对于这一道题&#xff0c;我们先按照题意进行分析&#xff1a;首先鸡自己的初始位置&#xff0c;如果着火点在鸡一开始的左右下各有一个那么就可以达到题目效果&#xff0c;也就是说不需要添加着火点&#xff0c;同时最多需要添加的着火点其实也就是它初始位置身边所有的…

Optional 详解

Optional 详解 1、Optional 介绍2、创建 Optional 对象3、Optional 常用方法1. 判断值是否存在 — isPresent()2. 非空表达式 — ifPresent()3. 设置(获取)默认值 — orElse()、orElseGet()4. 获取值 — get()5. 过滤值 — filter()6. 转换值 — map() 作为一名 Java 程序员&am…

animation给同一个元素加多个动画

需求&#xff1a; 元素从右向左渐变滑入&#xff0c;然后再上下漂浮 代码实现&#xff1a; animation动画可连写 <style lang"less" scoped>//swipe-item里面所有animate动画延迟时间swipe-animation-delay:500ms;//animate.css动画时长animate-css-duration:…

电子电器架构刷写策略 —— 队列刷写

电子电器架构刷写策略 —— 队列刷写 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

关于rocky linux配置RHEL9在线镜像源

Rocky Linux 简介 Rocky Linux 是一个社区支持的企业级 Linux 发行版&#xff0c;旨在为 CentOS Stream 提供一个稳定、可预测的替代方案。它与 CentOS Linux 兼容&#xff0c;并承诺提供 10 年的支持。Rocky Linux 适用于需要一个稳定、可预测的企业级 Linux 发行版&#xff…

算法练习第十二天|二叉树的递归遍历和迭代遍历

二叉树的遍历方式有广度还有深度方式 深度优先遍历&#xff1a;先往深走&#xff0c;遇到叶子节点再往回走。 广度优先遍历&#xff1a;一层一层的去遍历。 本文写的是深度优先遍历&#xff0c;分为前序&#xff0c;中序&#xff0c;后序遍历。这里前中后&#xff0c;其实指的就…

wpf 由于尚未生成某些自定义元素,设计视图无法正确显示。

"WPF 由于尚未生成某些自定义元素&#xff0c;设计视图无法正确显示" 这个问题通常是由于 Visual Studio 设计时的限制或某些资源未正确加载导致的。以下是一些可能的解决方案&#xff1a; 1. 重新生成项目&#xff1a; 尝试重新生成整个项目&#xff0c;以确保所有…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

Freertos自学笔记1----参考正点原子视频

RTOS与裸机系统对比记忆&#xff1a; 裸机系统&#xff1a;前后台系统&#xff1b; RTOS&#xff1a;实时操作系统&#xff0c;讲究实时性&#xff1b; 裸机系统中通常我们将需要工作的函数全部放在主while(1){}中&#xff0c;所有需要工作的函数独立排列&#xff0c;然后依次…

【Linux】基本指令(中)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 man指令 cp指令 mv指令 cat指令 more指令 less指令 head指令 …

如何对酒店开展科学的定岗定编——以酒店健身房、娱乐房为例

近年来&#xff0c;随着旅游行业的快速发展&#xff0c;也带动了酒店业的兴盛。酒店的经营效益不仅受益于旅游业&#xff0c;同时也受制于旅游行业。由于旅游业存在明显的季节性差异&#xff0c;旅游旺季客流量多、淡季客流量少&#xff0c;造成人员忙闲不均的问题。酒店行业也…