如何使用pdfminer.six从PDF文件中提取内嵌图片
用pdfminer.six提取PDF中图片的实现方法
你当前使用的TextConverter仅用于提取文本内容,无法捕获PDF中的图片元素。要提取图片需要改用PDFPageAggregator获取完整的页面布局结构,筛选识别其中的LTImage类型的图片对象,导出其二进制流即可。
实现步骤
- 导入所需依赖,将原来的
TextConverter替换为PDFPageAggregator,同时引入LTImage类型判断 - 遍历每一页的布局元素,筛选出图片元素后将其二进制数据写入本地文件
- 按页码和序号对提取的图片进行命名,避免重名覆盖
完整实现代码
import os from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams, LTImage from pdfminer.pdfpage import PDFPage def extract_images_from_pdf(pdf_path, output_dir='extracted_images'): # 自动创建图片输出目录 if not os.path.exists(output_dir): os.makedirs(output_dir) rsrcmgr = PDFResourceManager() laparams = LAParams() # 聚合器用于获取页面完整布局对象 device = PDFPageAggregator(rsrcmgr, laparams=laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) fp = open(pdf_path, 'rb') img_total = 0 # 遍历PDF每一页 for page_idx, page in enumerate(PDFPage.get_pages(fp, check_extractable=True)): interpreter.process_page(page) layout = device.get_result() # 遍历页面所有元素,筛选图片 for elem in layout: if isinstance(elem, LTImage): img_total += 1 # 自动获取图片格式,默认取jpeg img_format = elem.attrs.get("Subtype", "jpeg").lower() save_path = os.path.join(output_dir, f"第{page_idx+1}页_图片{img_total}.{img_format}") # 写入图片二进制数据 with open(save_path, 'wb') as img_f: img_f.write(elem.stream.get_data()) fp.close() device.close() print(f"提取结束,共提取到{img_total}张图片,已保存至{output_dir}目录") # 调用示例,和你原有路径保持一致 os.chdir('C:\\Users\\zone_\\Desktop') extract_images_from_pdf('example.pdf')
注意事项
- 部分PDF中的图片可能是由多个矢量图形元素拼接而成,不会被识别为
LTImage对象,这种情况无法用该方法提取 - 如果导出的图片无法正常打开,可以手动修改文件后缀为
jpg、png、tiff等常见图片格式测试
内容的提问来源于stack exchange,提问作者user15235239
相关产品推荐
相关产品推荐

