求助:编写批量PDF文件关键词筛选与移动的代码及资源
Python实现PDF关键词搜索与移动方案
依赖安装
首先安装所需的Python库:
pip install PyPDF2 shutil
如果需要处理扫描版PDF(图片格式),还需安装OCR相关工具:
pip install pdf2image pytesseract
*注:使用pytesseract需要先安装本地的Tesseract OCR引擎,可通过官方渠道下载安装,中文识别需额外配置中文语言包
代码实现
基础版(可编辑PDF)
针对可直接提取文本的PDF文件,使用以下代码:
import os import shutil from PyPDF2 import PdfReader def move_pdfs_with_keyword(source_dir, target_dir, keyword): # 创建目标文件夹(不存在则新建) if not os.path.exists(target_dir): os.makedirs(target_dir) # 遍历源文件夹内所有文件 for filename in os.listdir(source_dir): if filename.lower().endswith('.pdf'): file_full_path = os.path.join(source_dir, filename) try: # 读取PDF并提取文本 with open(file_full_path, 'rb') as pdf_file: reader = PdfReader(pdf_file) contains_keyword = False # 逐页检查文本 for page in reader.pages: page_text = page.extract_text() if page_text and keyword in page_text: contains_keyword = True break # 找到关键词后停止遍历页面 # 移动符合条件的文件 if contains_keyword: target_full_path = os.path.join(target_dir, filename) # 处理重名文件,避免覆盖 if os.path.exists(target_full_path): name, ext = os.path.splitext(filename) count = 1 while os.path.exists(os.path.join(target_dir, f"{name}_{count}{ext}")): count += 1 target_full_path = os.path.join(target_dir, f"{name}_{count}{ext}") shutil.move(file_full_path, target_full_path) print(f"已移动: {filename}") except Exception as e: print(f"处理{filename}出错: {str(e)}") # 配置参数并运行 if __name__ == "__main__": SOURCE_DIR = "替换为你的源文件夹路径" TARGET_DIR = "替换为你的目标文件夹路径" KEYWORD = "替换为你要搜索的关键词" move_pdfs_with_keyword(SOURCE_DIR, TARGET_DIR, KEYWORD)
OCR版(扫描件PDF)
针对图片格式的扫描PDF,通过OCR识别文本后再搜索关键词:
import os import shutil from pdf2image import convert_from_path import pytesseract def move_scanned_pdfs_with_keyword(source_dir, target_dir, keyword): if not os.path.exists(target_dir): os.makedirs(target_dir) for filename in os.listdir(source_dir): if filename.lower().endswith('.pdf'): file_full_path = os.path.join(source_dir, filename) try: # 将PDF转换为图片 pages = convert_from_path(file_full_path) contains_keyword = False for page in pages: # OCR识别图片文本,中文需指定lang参数 page_text = pytesseract.image_to_string(page, lang='chi_sim') if keyword in page_text: contains_keyword = True break if contains_keyword: target_full_path = os.path.join(target_dir, filename) if os.path.exists(target_full_path): name, ext = os.path.splitext(filename) count = 1 while os.path.exists(os.path.join(target_dir, f"{name}_{count}{ext}")): count += 1 target_full_path = os.path.join(target_dir, f"{name}_{count}{ext}") shutil.move(file_full_path, target_full_path) print(f"已移动扫描件: {filename}") except Exception as e: print(f"处理扫描件{filename}出错: {str(e)}") # 配置参数并运行 if __name__ == "__main__": SOURCE_DIR = "替换为你的源文件夹路径" TARGET_DIR = "替换为你的目标文件夹路径" KEYWORD = "替换为你要搜索的关键词" move_scanned_pdfs_with_keyword(SOURCE_DIR, TARGET_DIR, KEYWORD)
注意事项
- 确保源文件夹和目标文件夹路径正确,支持绝对路径或相对路径
- 代码加入了异常捕获,单个文件处理失败不会导致整个程序终止
- 重名文件会自动添加数字后缀,避免覆盖已有文件
- 扫描件OCR识别的准确率受PDF清晰度、字体等因素影响
学习方向
- 学习
os模块的文件遍历、路径处理方法,掌握基础文件系统操作 - 了解
shutil模块的文件移动、复制等核心功能 - 研究
PyPDF2或pdfplumber的API,掌握PDF文本提取的不同方式 - 针对OCR场景,深入学习
pytesseract的参数配置和语言包使用
内容的提问来源于stack exchange,提问作者Zaid Aldawod
相关产品推荐
相关产品推荐

