如何使用Python从PDF文件提取图片、视频及音频?
从PDF中提取视频、音频和图片的Python方案
PyPDF2仅专注于PDF文本与结构解析,对嵌入式多媒体文件的支持非常有限;Pillow是图像处理库,本身不具备PDF多媒体提取能力,这就是你之前尝试失败的原因。推荐使用PyMuPDF(fitz),它能高效处理PDF中的各类嵌入式对象,包括图片、音频和视频。
步骤1:安装依赖
pip install pymupdf
步骤2:完整提取代码
import fitz import os def extract_media_from_pdf(pdf_path, output_dir="pdf_media"): # 创建分类输出目录 os.makedirs(output_dir, exist_ok=True) img_dir = os.path.join(output_dir, "images") audio_dir = os.path.join(output_dir, "audio") video_dir = os.path.join(output_dir, "video") for dir_path in [img_dir, audio_dir, video_dir]: os.makedirs(dir_path, exist_ok=True) # 打开PDF文件 doc = fitz.open(pdf_path) # 提取页面内嵌图片 img_count = 0 for page_num in range(len(doc)): page = doc[page_num] image_list = page.get_images(full=True) for img in image_list: xref = img[0] base_image = doc.extract_image(xref) img_count += 1 img_filename = f"page_{page_num+1}_img_{img_count}.{base_image['ext']}" with open(os.path.join(img_dir, img_filename), "wb") as f: f.write(base_image["image"]) # 提取嵌入式音频/视频附件 emb_names = doc.embfile_get_names() for name in emb_names: emb_data = doc.embfile_get(name) # 根据后缀分类保存 if name.lower().endswith((".mp3", ".wav", ".flac", ".aac")): save_path = os.path.join(audio_dir, name) elif name.lower().endswith((".mp4", ".avi", ".mov", ".mkv")): save_path = os.path.join(video_dir, name) else: continue with open(save_path, "wb") as f: f.write(emb_data) doc.close() print(f"提取完成,所有媒体文件已保存至 {output_dir}") # 调用示例 if __name__ == "__main__": extract_media_from_pdf("your_target.pdf")
关键说明
- 图片提取:遍历每一页获取页面内嵌的图片资源,按页面编号命名区分。
- 音频/视频提取:读取PDF中的嵌入式附件,通过文件后缀判断类型后分类保存。
- 加密PDF处理:打开时需添加密码参数,如
doc = fitz.open(pdf_path, password="your_pwd")。 - 特殊格式兼容:可根据需求补充更多媒体后缀的判断规则。
内容的提问来源于stack exchange,提问作者George Davis-Diver
相关产品推荐
相关产品推荐

