集团海量档案整理实战:从乱到序的自动化技术方案

技术方案概述与依赖安装

针对集团档案整理中常见的文件命名混乱、格式不统一、内容难以检索的问题,本方案采用Python结合OCR技术,构建一套自动化识别、分类和重命名的处理流水线。该方案无需复杂的后台服务,本地即可运行,支持对PDF、图片等扫描件进行文字提取并依据内容规则归档。

在开始编写代码前,必须先配置好基础运行环境。本方案依赖Python 3.8及以上版本,以及Tesseract-OCR引擎用于文字识别。

1. 安装Python依赖库

打开命令行终端,直接执行以下命令安装所需的Python库。这些库分别用于OCR调用、PDF处理、图像处理及配置文件解析。

```bash pip install pytesseract Pillow pdf2image PyYAML requests ```

2. 安装Tesseract-OCR引擎

Python库只是接口,核心识别能力依赖Tesseract引擎。请根据操作系统下载对应的安装包。

Windows用户:访问 https://github.com/UB-Mannheim/tesseract/wiki 下载最新的tesseract-ocr-w64-setup.exe。安装时务必勾选“Additional language data”,并下载Chinese (Simplified)语言包,否则无法识别中文。假设默认安装路径为 C:\Program Files\Tesseract-OCR

Linux用户:执行 sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim poppler-utils

注意:处理PDF文件还需要安装Poppler。Windows用户下载地址:https://github.com/oschwartz10612/poppler-windows/releases/,解压后将bin目录路径配置到系统环境变量Path中。

项目目录与配置文件设计

为了保证代码的通用性和可维护性,我们将识别规则与代码逻辑分离。请在本地创建一个名为 archive_tool 的文件夹,并在其中创建以下目录结构:

```text archive_tool/ ├── config.yaml 配置文件:定义分类规则和命名规则 ├── source/ 待处理的原始档案存放目录 ├── output/ 处理完成后的档案归档目录 └── sorter.py 核心执行脚本 ```

1. 编写配置文件 config.yaml

集团海量档案整理实战:从乱到序的自动化技术方案

创建 config.yaml 文件,并复制以下完整内容。此配置定义了如何根据识别到的关键词将文件归类,以及提取哪些信息作为新文件名。

```yaml Tesseract OCR引擎的安装路径,Windows用户必须修改为实际路径 tesseract_cmd: "C:\\Program Files\\Tesseract-OCR\\tesseract.exe" 待处理目录和输出目录 source_dir: "./source" output_dir: "./output" 分类规则:priority数字越小越优先匹配 rules: - name: "合同档案" priority: 1 目标文件夹名称 target_folder: "01_合同类" 匹配关键词:文件内容包含这些词即归为此类 keywords: ["合同协议", "采购合同", "销售协议", "双方签字"] 文件名提取正则:从识别文本中提取特定格式作为文件名 示例:提取 "编号:2023-001" 中的 2023-001 filename_pattern: "编号[::]\\s([A-Z0-9\\-]+)" - name: "人事档案" priority: 2 target_folder: "02_人事类" keywords: ["劳动合同", "入职登记表", "离职证明", "员工档案"] filename_pattern: "姓名[::]\\s([\\u4e00-\\u9fa5]{2,4})" - name: "财务凭证" priority: 3 target_folder: "03_财务类" keywords: ["增值税发票", "报销单", "付款申请", "银行回单"] filename_pattern: "金额[::]\\s([\\d.]+)" 默认分类:如果未匹配到任何规则,则归入此文件夹 default_folder: "99_其他未知" ```

OCR识别核心模块开发

创建 sorter.py 文件。首先编写OCR识别的辅助函数。这部分代码负责将不同格式的文件(图片或PDF)转换为文本。

```python import os import shutil import yaml import pytesseract from PIL import Image import pdf2image import re import logging 配置日志输出,方便在控制台查看处理进度 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) def load_config(config_path="config.yaml"): """加载配置文件并设置Tesseract路径""" with open(config_path, 'r', encoding='utf-8') as f: config = yaml.safe_load(f) 设置Tesseract路径,这是Windows下最易出错的地方 pytesseract.pytesseract.tesseract_cmd = config['tesseract_cmd'] return config def ocr_image(image_path, lang='chi_sim+eng'): """对单张图片进行OCR识别""" try: 使用Pillow打开图片 img = Image.open(image_path) 转换为RGB模式,防止部分RGBA图片报错 if img.mode != 'RGB': img = img.convert('RGB') 调用pytesseract识别,--psm 6 假设图片是统一的文本块 text = pytesseract.image_to_string(img, lang=lang, config='--psm 6') return text except Exception as e: logger.error(f"识别图片 {image_path} 失败: {e}") return "" def ocr_pdf(pdf_path): """将PDF转换为图片并进行OCR识别""" try: 将PDF每一页转换为图片列表,需要系统安装poppler pages = pdf2image.convert_from_path(pdf_path, dpi=200) full_text = "" for page in pages: 对每一页进行识别 text = pytesseract.image_to_string(page, lang='chi_sim+eng', config='--psm 6') full_text += text + "\n" return full_text except Exception as e: logger.error(f"处理PDF {pdf_path} 失败,请检查poppler是否安装: {e}") return "" ```

档案自动分类与重命名逻辑

接下来编写核心的业务逻辑函数。该函数读取配置文件中的规则,对OCR提取的文本进行匹配,决定文件的最终去向和新名称。

```python def classify_and_rename(text, filename, config): """ 根据识别文本和配置规则,确定目标文件夹和新文件名 """ 按照优先级排序规则 sorted_rules = sorted(config['rules'], key=lambda x: x['priority']) matched_rule = None extracted_name = None 遍历规则进行匹配 for rule in sorted_rules: 检查关键词是否存在于文本中 hit_count = 0 for keyword in rule['keywords']: if keyword in text: hit_count += 1 只要命中一个关键词即认为匹配该分类(可根据需求改为全部命中) if hit_count > 0: matched_rule = rule logger.info(f"文件 {filename} 匹配规则: {rule['name']}") break if not matched_rule: logger.warning(f"文件 {filename} 未匹配到具体规则,归入默认文件夹") target_folder = config['default_folder'] new_filename = filename 保持原名 else: target_folder = matched_rule['target_folder'] 尝试提取新文件名 pattern = matched_rule.get('filename_pattern') if pattern: match = re.search(pattern, text) if match: 获取正则第一个分组的内容 suffix = match.group(1).strip() 去除文件名中的非法字符 suffix = re.sub(r'[\\/?:"<>|]', "", suffix) 获取原文件扩展名 ext = os.path.splitext(filename)[1] new_filename = f"{matched_rule['name']}_{suffix}{ext}" else: logger.warning(f"匹配到规则但未提取到文件名模式,使用原名") new_filename = filename else: new_filename = filename return target_folder, new_filename def process_file(file_path, config): """处理单个文件的主流程""" filename = os.path.basename(file_path) logger.info(f"正在处理: {filename}") 1. 提取文本 text = "" ext = os.path.splitext(filename)[1].lower() if ext in ['.jpg', '.jpeg', '.png', '.bmp']: text = ocr_image(file_path) elif ext == '.pdf': text = ocr_pdf(file_path) else: logger.info(f"不支持的文件格式 {ext},跳过") return if not text.strip(): logger.warning(f"未识别到文字内容,跳过处理: {filename}") return 2. 分类与重命名 target_folder, new_filename = classify_and_rename(text, filename, config) 3. 移动文件 target_dir = os.path.join(config['output_dir'], target_folder) if not os.path.exists(target_dir): os.makedirs(target_dir) dest_path = os.path.join(target_dir, new_filename) 处理重名问题 if os.path.exists(dest_path): base, ext = os.path.splitext(new_filename) counter = 1 while os.path.exists(os.path.join(target_dir, f"{base}_{counter}{ext}")): counter += 1 new_filename = f"{base}_{counter}{ext}" dest_path = os.path.join(target_dir, new_filename) shutil.move(file_path, dest_path) logger.info(f"文件已移动至: {dest_path}") ```

完整代码整合与执行

编写主函数入口,遍历source文件夹下的所有文件并调用上述逻辑。将以下代码追加到 sorter.py 文件末尾。

```python def main(): 1. 加载配置 try: config = load_config() except FileNotFoundError: print("错误:未找到config.yaml文件,请确保文件存在于当前目录下。") return except Exception as e: print(f"配置文件加载失败: {e}") return source_dir = config['source_dir'] output_dir = config['output_dir'] 2. 检查目录 if not os.path.exists(source_dir): os.makedirs(source_dir) print(f"已创建待处理目录: {source_dir},请将文件放入其中后重新运行。") return if not os.path.exists(output_dir): os.makedirs(output_dir) 3. 遍历文件 files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))] if not files: print("source目录为空,无文件需要处理。") return print(f"开始处理,共发现 {len(files)} 个文件...") for filename in files: file_path = os.path.join(source_dir, filename) process_file(file_path, config) print("所有文件处理完毕!") if __name__ == "__main__": main() ```

运行操作指南

1. 准备数据:将所有待整理的杂乱档案文件(PDF或图片)复制到 source 文件夹中。

2. 调整配置:打开 config.yaml,检查 tesseract_cmd 路径是否与实际安装路径一致。如果需要识别特定类型的档案,修改 rules 下的关键词和正则表达式。

3. 执行脚本:在终端中进入项目目录,运行:

```bash python sorter.py ```

脚本运行后,控制台会显示每个文件的识别过程、匹配的规则以及最终的移动路径。处理完成后,打开 output 文件夹,即可看到已经按照规则自动分类并重命名好的档案。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统