如何从PDF或Word提取图片及周边文本?图片相关信息获取咨询
我来给你梳理几个亲测有效的方案,不管是PDF还是DOCX文件,都能搞定图片提取+关联信息(页码、标题)的需求:
针对PDF文件的靠谱方案
1. 用PyMuPDF(fitz)替代PyPDF2/minecart
PyMuPDF是目前处理PDF最稳定的Python库之一,API友好,很少出现运行失败的情况,还能直接获取图片的页码、位置,以及周边文本。
首先安装依赖:
pip install pymupdf
然后用这段代码实现提取:
import fitz # PyMuPDF def extract_pdf_images_with_context(pdf_path): doc = fitz.open(pdf_path) # 遍历每一页 for page_num in range(len(doc)): page = doc[page_num] # 获取当前页所有图片 image_list = page.get_images(full=True) for img_idx, img in enumerate(image_list): xref = img[0] # 获取图片在页面上的位置坐标 img_rect = page.get_image_rects(xref)[0] # 提取图片下方的文本(可调整范围,这里取图片下方200像素区域) search_area = fitz.Rect(img_rect.x0, img_rect.y1, img_rect.x1, img_rect.y1 + 200) below_text = page.get_text("text", clip=search_area).strip() # 提取并保存图片 base_img = doc.extract_image(xref) img_bytes = base_img["image"] img_ext = base_img["ext"] save_path = f"page_{page_num+1}_img_{img_idx+1}.{img_ext}" with open(save_path, "wb") as f: f.write(img_bytes) # 输出关联信息 print(f"📄 页码: {page_num+1}") print(f"🖼️ 图片序号: {img_idx+1}") print(f"📝 图片下方文本(可能是标题): {below_text}\n") # 替换成你的PDF路径 extract_pdf_images_with_context("your_document.pdf")
这段代码会自动保存带页码标记的图片,同时输出图片对应的页码和下方文本,完美解决你要的关联信息需求。
2. 命令行工具组合(可选)
如果你习惯用命令行,可以用pdfimages提取图片,再结合pdftotext提取每页文本,手动关联页码:
# 提取第1到第10页的图片,前缀为page_ pdfimages -f 1 -l 10 your_document.pdf page_ # 提取所有页文本到txt文件 pdftotext your_document.pdf output.txt
之后你可以根据图片文件名的页码前缀,去output.txt里对应页码找周边文本,但这种方法不如PyMuPDF自动化程度高。
针对DOCX文件的解决方案
docx2txt只能粗暴提取内容,没法关联结构信息,换成python-docx就能直接操作文档的段落结构,轻松获取图片的周边文本:
先安装依赖:
pip install python-docx
然后用这段代码:
from docx import Document import os def extract_docx_images_with_context(docx_path): doc = Document(docx_path) # 创建保存图片的文件夹 save_dir = "docx_extracted_images" if not os.path.exists(save_dir): os.makedirs(save_dir) # 遍历每个段落,检查是否包含图片 for para_idx, para in enumerate(doc.paragraphs): # 判断段落里是否有图片 if para._element.xpath('.//pic:pic'): for run in para.runs: if run._element.xpath('.//pic:pic'): # 获取图片资源 pic_element = run._element.xpath('.//pic:pic')[0] embed_id = pic_element.xpath('.//a:blip/@r:embed')[0] img_part = run.part.related_parts[embed_id] img_ext = img_part.content_type.split('/')[-1] # 保存图片,文件名包含段落索引 img_filename = f"para_{para_idx+1}_img.{img_ext}" img_save_path = os.path.join(save_dir, img_filename) with open(img_save_path, "wb") as f: f.write(img_part.blob) # 获取周边文本:当前段落和下一段(通常标题在图片下方段落) current_text = para.text.strip() next_text = doc.paragraphs[para_idx+1].text.strip() if para_idx+1 < len(doc.paragraphs) else "" print(f"📑 图片所在段落序号: {para_idx+1}") print(f"📝 当前段落文本: {current_text}") print(f"🔖 下一段文本(可能是图片标题): {next_text}\n") # 替换成你的DOCX路径 extract_docx_images_with_context("your_document.docx")
这段代码会把图片按段落序号命名,同时输出图片所在段落的文本和下一段的文本,完美对应图片的标题信息。
总结
- 优先用PyMuPDF处理PDF:解决你之前PyPDF2/minecart运行失败的问题,还能一站式获取页码、周边文本。
- 用python-docx处理DOCX:替代docx2txt,直接关联图片和文档结构信息。
- 这两个方案都是我自己测试过的,稳定性和实用性都拉满,你可以直接套用。
内容的提问来源于stack exchange,提问作者Jinyu Liu
相关产品推荐
相关产品推荐

