石家庄档案整理:基于Python与OCR的自动化归档实战
一、开发环境与依赖库配置
在进行石家庄档案整理的数字化实操中,我们需要构建一个基于Python的自动化OCR处理环境。本方案选用PaddleOCR作为核心识别引擎,因为它对中文识别率极高且免费开源。请确保你的操作系统已安装Python 3.8或3.9版本。
打开终端(Windows下为CMD或PowerShell),执行以下命令创建并激活虚拟环境,这是防止依赖冲突的关键步骤:
```bash 创建名为archive_env的虚拟环境 python -m venv archive_env Windows激活环境 archive_env\Scripts\activate Linux/Mac激活环境 source archive_env/bin/activate ```环境激活后,必须安装以下核心依赖库。请严格按照版本号安装,避免因版本不兼容导致报错:
```bash 安装PaddlePaddle CPU版(无需显卡,零门槛运行) pip install paddlepaddle==2.5.1 -i https://mirror.baidu.com/pypi/simple 安装PaddleOCR及图像处理库 pip install "paddleocr>=2.0.1" pillow opencv-python ```注意:如果你的系统提示缺少Shapely库,请额外执行pip install shapely,这是处理文档几何坐标的必备工具。
二、项目目录结构规划
为了实现自动化归档,我们需要在本地建立一个标准化的目录结构。请在D盘或任意工作盘下创建如下文件夹树:
- D:/Shijiazhuang_Archive/ (项目根目录)
- input/ (存放待处理的扫描件图片或PDF,支持jpg, png格式)
- output/ (存放处理后的可检索文本文件)
- sorted/ (存放按年份和类别自动分类后的档案副本)
- archive_tool.py (我们将要编写的核心脚本)
三、核心代码编写:OCR识别模块
在archive_tool.py中,我们首先编写OCR识别函数。该函数负责读取图片中的文字,并返回包含坐标和文本内容的结构化数据。PaddleOCR默认使用PP-OCRv3模型,首次运行时会自动下载模型文件(约10MB),请保持网络通畅。
四、核心代码编写:自动归档逻辑
石家庄档案整理的难点在于从非结构化文本中提取结构化信息(如年份、档案号)。我们需要编写一个解析函数,利用正则表达式从识别出的文本中抓取关键信息。
假设我们的档案命名规则中包含“年度”和“档案编号”,或者文档正文第一行包含这些信息。以下代码演示了如何提取2023这样的年份,以及石档字[2023]xx号这样的编号。
```python def parse_archive_info(text): """ 从识别文本中解析年份和档案编号 :param text: OCR识别出的文本 :return: dict (year, category, file_code) """ info = { "year": "未知年份", "category": "未分类", "file_code": "无编号" } 1. 提取年份 (匹配 1990-2099 年) year_pattern = re.compile(r"(19|20)\d{2}") years = year_pattern.findall(text) if years: 取文本中出现的第一个年份作为归档年份 info["year"] = years[0] + "年" 2. 提取档案编号 (假设格式如:石档字[2023]12号 或 档案号:2023-001) 针对石家庄本地档案特征,匹配包含“石”、“档”、“号”的字段 code_pattern = re.compile(r"(石档字\[.?\]|档案号[::]\S+)") codes = code_pattern.findall(text) if codes: info["file_code"] = codes[0].replace(":", "").replace(":", "") 3. 简单分类逻辑 (根据关键词判断) if "人事" in text or "简历" in text: info["category"] = "人事档案" elif "财务" in text or "凭证" in text: info["category"] = "财务档案" elif "基建" in text or "图纸" in text: info["category"] = "基建档案" return info def organize_files(input_dir, output_dir, sorted_dir): """ 遍历输入目录,执行OCR识别并移动归档 """ if not os.path.exists(sorted_dir): os.makedirs(sorted_dir) files = [f for f in os.listdir(input_dir) if f.lower().endswith(('.jpg', '.png', '.jpeg'))] print(f"开始处理,共发现 {len(files)} 个档案文件...") for filename in files: file_path = os.path.join(input_dir, filename) 1. OCR识别 print(f"正在识别: {filename}") text_content = extract_text_from_image(file_path) 2. 保存识别结果到TXT txt_filename = os.path.splitext(filename)[0] + ".txt" txt_path = os.path.join(output_dir, txt_filename) with open(txt_path, 'w', encoding='utf-8') as f: f.write(text_content) 3. 解析信息并归档 info = parse_archive_info(text_content) 构建目标文件夹路径:sorted/年份/类别/ target_folder = os.path.join(sorted_dir, info["year"], info["category"]) if not os.path.exists(target_folder): os.makedirs(target_folder) 复制文件到目标文件夹 target_file_path = os.path.join(target_folder, f"{info['file_code']}_{filename}") shutil.copy(file_path, target_file_path) print(f"已归档 -> {target_file_path}") ```五、完整执行脚本与运行
将上述代码片段组合,并添加主程序入口。以下是完整的archive_tool.py内容,你可以直接复制覆盖文件内容。

运行脚本非常简单。在终端中确保处于项目根目录,执行:
```bash python archive_tool.py ```六、常见报错与解决方案
在实操过程中,你可能会遇到以下两个常见问题,请按照对应方案解决:
1. Shapely GEOS 错误
报错信息:ImportError: cannot import name 'geometry' from 'shapely'
原因:Shapely库版本与GEOS库不匹配。
解决:执行pip uninstall shapely,然后执行pip install shapely==2.0.1强制降级或升级到稳定版。
2. OpenCV 读取图片为空
现象:控制台打印“图片读取失败”。
原因:文件路径包含中文字符,或者图片本身只有扩展名但无实际内容。
解决:在代码中cv2.imread部分,确保使用numpy处理路径,或者检查文件是否为0字节。本教程代码已通过UTF-8编码处理路径,若仍报错,请将文件名重命名为纯英文测试。