Python提取PDF和DOCX中的文本、图片和表格

如何使用Python提取PDF和DOCX中的文本、图片和表格

在日常工作中,我们经常会需要从PDF或DOCX文件中提取文本、图片或表格数据进行分析或存档。这里,我分享一个Python脚本,它能够自动化地从PDF和DOCX文件中提取所需的内容,并将提取的表格转换为图片保存。

所需库

使用此脚本需要安装以下库:

  • PyMuPDF (fitz):用于处理PDF文件。
  • python-docx:用于处理DOCX文件。
  • Pillow (PIL):用于图像处理。
pip install pymupdf python-docx pillow

实现功能

我们将实现以下功能:

  1. 从PDF文件中提取文本、图片和表格。
  2. 将提取的表格和图片以PNG格式保存。
  3. 从DOCX文件中提取文本、图片和表格,并将表格转换为图片。

代码结构概览

1. PDF文件处理函数
  • extract_tables_from_pdf(pdf_path):从PDF文件中提取表格,将每个表格保存为PNG图片。
  • extract_images_from_pdf(pdf_path):从PDF中提取所有图片。
  • extract_text_from_pdf(pdf_path):从PDF文件中提取所有文本。
2. DOCX文件处理函数
  • process_docx(docx_path):从DOCX文件中提取文本、图片,并将表格转换为图片保存。
  • table_to_image(table):将DOCX表格转换为图片,支持中文内容。
  • extract_images_from_docx(docx_path):从DOCX中提取图片并保存。
3. 主函数
  • process_file(file_path):根据文件类型(PDF或DOCX)调用不同的处理函数。
import os
import fitz  # PyMuPDF
from docx import Document
from PIL import Image, ImageDraw, ImageFont# 确保保存目录存在
def ensure_dir(directory):"""确保目录存在,如果不存在则创建"""if not os.path.exists(directory):os.makedirs(directory)# 从PDF中提取表格
def extract_tables_from_pdf(pdf_path):"""从PDF中提取表格并保存为图片"""doc = fitz.open(pdf_path)form_img_dir = "form_img"ensure_dir(form_img_dir)table_count = 0for page_num in range(doc.page_count):page = doc.load_page(page_num)tables = page.find_tables()  # 查找表格# 提取并保存表格图片if tables and hasattr(tables, 'tables'):for table_num, table in enumerate(tables.tables):bbox = table.bbox  # 表格边界table_pix = page.get_pixmap(clip=bbox)image_filename = os.path.join(form_img_dir, f"table_page{page_num + 1}_{table_num + 1}.png")table_pix.save(image_filename)table_count += 1print(f"保存表格: {image_filename}")doc.close()return table_count# 从PDF中提取图片
def extract_images_from_pdf(pdf_path):"""从PDF中提取图片"""doc = fitz.open(pdf_path)img_dir = "img"ensure_dir(img_dir)image_count = 0for page_num in range(doc.page_count):page = doc.load_page(page_num)image_list = page.get_images()for img_index, img in enumerate(image_list):xref = img[0]base_image = doc.extract_image(xref)image_bytes = base_image["image"]image_filename = os.path.join(img_dir, f"image_page{page_num + 1}_{img_index + 1}.png")with open(image_filename, "wb") as image_file:image_file.write(image_bytes)image_count += 1print(f"保存图片: {image_filename}")doc.close()return image_count# 从PDF中提取文本
def extract_text_from_pdf(pdf_path):"""从PDF中提取文本"""doc = fitz.open(pdf_path)text_content = []for page_num in range(doc.page_count):page = doc.load_page(page_num)text = page.get_text("text")if text.strip():text_content.append(text)doc.close()return "\n".join(text_content)# 处理DOCX文件
def process_docx(docx_path):"""处理DOCX文件"""doc = Document(docx_path)form_img_dir = "form_img"ensure_dir(form_img_dir)# 提取图片image_count = extract_images_from_docx(docx_path)table_count = 0text_content = []for paragraph in doc.paragraphs:text_content.append(paragraph.text)for table in doc.tables:table_img = table_to_image(table)image_filename = os.path.join(form_img_dir, f"table_{table_count + 1}.png")table_img.save(image_filename)table_count += 1print(f"保存表格: {image_filename}")return "\n".join(text_content), image_count, table_count# DOCX表格转图片
def table_to_image(table):"""将DOCX表格转换为图片,支持中文"""rows = len(table.rows)cols = len(table.columns)cell_width = 150cell_height = 40padding = 10img_width = cols * cell_width + 2 * paddingimg_height = rows * cell_height + 2 * paddingimg = Image.new('RGB', (img_width, img_height), 'white')draw = ImageDraw.Draw(img)try:font = ImageFont.truetype("msyh.ttc", 12)except:font = ImageFont.load_default()for i, row in enumerate(table.rows):for j, cell in enumerate(row.cells):x = j * cell_width + paddingy = i * cell_height + paddingdraw.rectangle([x, y, x + cell_width, y + cell_height], outline='black')text = cell.text.strip()text_bbox = draw.textbbox((0, 0), text, font=font)text_x = x + (cell_width - text_bbox[2] // 2)text_y = y + (cell_height - text_bbox[3] // 2)draw.text((text_x, text_y), text, fill='black', font=font)return img# 主处理函数
def process_file(file_path):"""主处理函数"""if not os.path.exists(file_path):print(f"文件不存在: {file_path}")returnfile_ext = os.path.splitext(file_path)[1].lower()if file_ext == '.pdf':text_content = extract_text_from_pdf(file_path)image_count = extract_images_from_pdf(file_path)table_count = extract_tables_from_pdf(file_path)print("\n=== 处理结果 ===")print("提取的文本内容:")print(text_content)print(f"\n总计提取: {image_count} 张图片, {table_count} 个表格")elif file_ext == '.docx':text_content, image_count, table_count = process_docx(file_path)print("\n=== 处理结果 ===")print("提取的文本内容:")print(text_content)print(f"\n总计提取: {image_count} 张图片, {table_count} 个表格")# 示例用法
file_path = "your_file_path_here.pdf"
process_file(file_path)

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

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

相关文章

OCR识别铁路电子客票

随着中国铁路客运领域进入全面数字化时代,国家税务总局、财政部和国铁集团于2024年10月18日联合发布公告,自2024年11月1日起,推广使用“电子发票(铁路电子客票)”。这一举措不仅为旅客出行提供了极大的便利&#xff0c…

【学习】Fine-tuning知识汇总

Fine-tuning 微调(Fine-tuning)是一种迁移学习的方法,用于在一个预训练模型的基础上,通过在特定任务的数据上进行有监督训练,来适应该任务的要求并提高模型性能。微调利用了预训练模型在大规模通用数据上学习到的语言…

qt QKeySequence详解

1、概述 QKeySequence 是 Qt 框架中的一个类,用于表示和处理键盘快捷键序列。它提供了一种方便的方式来解析、存储和比较键盘快捷键,这些快捷键通常用于触发应用程序中的特定操作或命令。QKeySequence 支持多种格式的快捷键表示,包括单个按键…

【MySQL】约束

4. 约束 4.1 概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。 4.2 约束…

css:盒子模型

目录 盒子模型 边框(border) 内边距(padding) 外边距(margin) 盒子模型,浮动,定位 把一只大象塞进冰箱里需要三步:打开冰箱门,把大象塞进去,…

【最新版】Stable Diffusion4.9(AI绘画)下载及安装教程(附软件安装包)!

NO.1 软件下载 软件名称:Stable Diffusion4.9(SD)软件语言:中文软件大小:9.6G系统要求:Windows10或更高,64位操作系统 NO.2 软件介绍 Stable Diffusion Stable Diffusion是一款前沿AI绘画工…

微服务(二)

目录 1.网关路由 1.1.认识网关 1.2.快速入门 1.2.1.引入依赖 1.2.2.启动类 1.2.3.配置路由 1.3.路由过滤 2.网关登录校验 2.1.鉴权思路分析 2.2.网关过滤器 2.3.自定义过滤器 2.3.1.自定义GatewayFilter 2.3.2.自定义GlobalFilter 2.4.登录校验 2.4.1.JWT工具 …

uniCloud云对象调用第三方接口,根据IP获取用户归属地的免费API接口,亲测可用

需求 在2022年5月初,网络上各大平台上,都开始展示用户IP属地,在某音、某手等小视频平台以及各主流网站应用中,都展示IP归属地,如下图所示: 解决办法 收费文档的肯定有很多,基本你百度搜“归…

基于标签相关性的多标签学习

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

C++中的栈(Stack)和堆(Heap)

在C中,堆(heap)和栈(stack)是两种用于存储数据的内存区域。理解它们的原理和区别,对于优化代码性能和确保代码的安全性至关重要。以下是对C中堆栈的详细解析,包括它们的分配方式、优缺点、应用场…

搭建Python2和Python3虚拟环境

搭建Python3虚拟环境 1. 更新pip2. 搭建Python3虚拟环境第一步:安装python虚拟化工具第二步: 创建虚拟环境 3. 搭建Python2虚拟环境第一步:安装虚拟环境模块第二步:创建虚拟环境 4. workon命令管理虚拟机第一步:安装扩…

文件夹被占用了无法删除怎么办?强制粉碎文件夹你可以这样操作

在日常使用电脑的过程中,我们可能会遇到一些难以删除的文件夹,这不仅影响了我们的工作效率,还可能隐藏着潜在的安全风险。本文简鹿办公将向您介绍为什么某些文件夹无法直接删除,以及如何利用360安全卫士极速版等工具彻底粉碎这些顽…

Python 随笔

转移字符 \a 用于触发系统蜂鸣器(要在shell上才行) print里面用 括起来的内容位置是 """ """括起来啥样,输出啥样 任何值都可以当作i条件: 是直接把两…

某app最新版 vmp算法分析一

本系列预计3篇 某app使用了一种X开头的HTTP 签名。该应用程序对服务器的请求在其标头中有6个x签名。该应用程序通常使用此签名来确保数据的安全性和完整性。代号花露水. 6个x签名都来自古希腊神话中的某个神. 分别是蛇发女妖(G),柯罗诺斯(K,时间之神),拉顿(L),阿尔戈斯(A),赫…

AI制作ppt

1,kimi: 实际上也是AiPPT.cn这个网站(但是有实际次数限制) 2,其余专业AI ppt生成网站: (1)gamma:https://gamma.app/ 大概能制作7~10页左右 free的ppt,其余要…

【插件】多断言 插件pytest-assume

背景 assert 断言一旦失败,后续的断言不能被执行 有个插件,pytest-assume的插件,可以提供多断言的方式 安装 pip3 install pytest-assume用法 pytest.assume(表达式,f’提示message’) pytest.assume(表达式,f‘提示message’) pytest.ass…

SpringCloud学习笔记

SpringCloud 在微服务中,不同的服务板块是分开的,有自己的数据库。但是在业务中可能存在服务板块中互相调用的情况,比如订单服务中需要获取用户信息,这时候不能再自己的板块中直接进行查询,否则违反了微服务的理念&am…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网,我尽可能把自己的知识点呈现出来,如果有误,还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随机读写操作,HBase正是为此而出现。…

MoneyPrinterTurbo – 开源的AI短视频生成工具

MoneyPrinterTurbo是什么 MoneyPrinterTurbo是开源的AI短视频生成工具,能自动化地根据用户提供的视频主题或关键词生成视频文案、素材、字幕和背景音乐,合成高清短视频。工具支持API和Web界面操作,具备自定义文案、多种视频尺寸、批量视频生…

[CKS] K8S NetworkPolicy Set Up

最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于不安全项目修复的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] K8S Ne…