建筑公司档案整理:基于Python的自动化归档实操

一、开发环境搭建与工具链配置

在开始构建建筑公司档案整理服务之前,必须先配置好基础的运行环境。本方案采用Python作为核心开发语言,利用Tesseract-OCR进行文字识别,Flask作为Web服务框架。以下是具体的环境配置步骤,请严格按照顺序执行。

1. 安装Python环境

确保系统已安装Python 3.8或更高版本。如果未安装,请访问Python官网下载对应操作系统的安装包。安装时,务必勾选"Add Python to PATH"选项,以便在命令行中直接调用Python。安装完成后,在终端输入以下命令验证版本:

```bash python --version ```

2. 安装Tesseract-OCR引擎

Tesseract是OCR识别的核心引擎。对于Windows用户,为了避免环境变量配置错误,建议直接下载安装包。

  • Windows下载地址:https://github.com/UB-Mannheim/tesseract/wiki
  • 安装路径建议:默认安装路径通常为 C:\Program Files\Tesseract-OCR\tesseract.exe,请记住此路径,后续代码配置中需要用到。
  • Linux (Ubuntu/Debian) 安装命令:
```bash sudo apt update sudo apt install tesseract-ocr tesseract-ocr-chi-sim ```

3. 安装Python依赖库

在项目根目录下打开终端,执行以下命令安装所需的第三方库。这些库分别用于OCR封装、图像处理和Web服务搭建。

```bash pip install pytesseract pillow flask ```

二、核心功能:OCR识别与自动归档脚本

本节将编写核心的自动化脚本。该脚本的主要功能是:扫描指定目录下的图片文件(如扫描的合同、图纸),利用OCR提取文件中的关键信息(如“合同编号”),并根据提取的信息自动重命名文件并移动到归档目录。

1. 图像预处理与识别逻辑

建筑档案通常包含大量的工程图纸和扫描件,直接识别可能准确率较低。我们需要先对图像进行灰度化和二值化处理,以提高识别准确率。以下是完整的Python代码实现:

```python import os import shutil import re import datetime from PIL import Image import pytesseract 【关键配置】Windows用户必须修改此处为你的tesseract.exe实际路径 Linux用户若已配置环境变量可注释掉此行 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 定义配置 SOURCE_DIR = './raw_files' 待整理的原始文件目录 ARCHIVE_DIR = './archived_files' 归档后的文件目录 ALLOWED_EXTENSIONS = {'.png', '.jpg', '.jpeg', '.tif', '.bmp'} def preprocess_image(image_path): """ 图像预处理:转灰度、二值化,提高OCR识别率 """ try: img = Image.open(image_path) 转换为灰度图 img = img.convert('L') 二值化处理,阈值设为200,可根据实际扫描件调整 img = img.point(lambda x: 0 if x < 200 else 255, '1') return img except Exception as e: print(f"图像处理失败: {image_path}, 错误: {e}") return None def extract_contract_number(text): """ 正则提取关键信息:假设我们需要提取 '合同编号:HT-2023-001' 格式的数据 """ 匹配常见的合同编号模式,可根据公司实际规范修改正则 pattern = r'合同编号[::]\s([A-Z0-9\-]+)' match = re.search(pattern, text) if match: return match.group(1) 如果没找到合同编号,尝试提取项目编号 pattern_proj = r'项目编号[::]\s([A-Z0-9\-]+)' match_proj = re.search(pattern_proj, text) if match_proj: return match_proj.group(1) return None def process_files(): """ 主处理函数:遍历文件夹,识别,重命名,移动 """ if not os.path.exists(ARCHIVE_DIR): os.makedirs(ARCHIVE_DIR) files = [f for f in os.listdir(SOURCE_DIR) if os.path.splitext(f)[1].lower() in ALLOWED_EXTENSIONS] print(f"开始处理,共发现 {len(files)} 个文件...") for filename in files: file_path = os.path.join(SOURCE_DIR, filename) 1. 预处理 processed_img = preprocess_image(file_path) if not processed_img: continue 2. OCR识别 (使用简体中文库) psm 6 表示假设文本为统一的文本块 try: text = pytesseract.image_to_string(processed_img, lang='chi_sim', config='--psm 6') except Exception as e: print(f"OCR识别出错: {filename}, {e}") continue 3. 提取关键信息 key_info = extract_contract_number(text) 4. 生成新文件名 file_ext = os.path.splitext(filename)[1] timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') if key_info: new_filename = f"{key_info}_{timestamp}{file_ext}" else: 如果识别不到关键信息,归档到“未知”文件夹 new_filename = f"UNKNOWN_{timestamp}{file_ext}" target_dir = os.path.join(ARCHIVE_DIR, '未知分类') if not os.path.exists(target_dir): os.makedirs(target_dir) shutil.move(file_path, os.path.join(target_dir, new_filename)) print(f"未识别到关键信息,已归档为: {new_filename}") continue 5. 移动文件 target_path = os.path.join(ARCHIVE_DIR, new_filename) shutil.move(file_path, target_path) print(f"处理成功: {filename} -> {new_filename}") if __name__ == '__main__': 确保源目录存在 if not os.path.exists(SOURCE_DIR): os.makedirs(SOURCE_DIR) print(f"请将待整理文件放入 {SOURCE_DIR} 目录下") else: process_files() ```

2. 代码实操细节说明

  • 路径配置:代码中的 pytesseract.pytesseract.tesseract_cmd 是Windows用户最容易卡壳的地方,请务必指向正确的 .exe 文件。
  • 正则匹配:代码中使用了 r'合同编号[::]\s([A-Z0-9\-]+)'。如果你的档案中关键字是“协议号”或“工程代码”,请直接修改 extract_contract_number 函数中的正则表达式。
  • 未知文件处理:系统会自动将无法识别关键信息的文件移动到“未知分类”子目录,避免源文件混乱。

三、系统封装:基于Flask的Web服务接口

为了方便非技术人员(如资料员)使用,我们需要将上述脚本封装为一个Web服务。用户只需在浏览器中上传图片,后台自动处理后提供下载链接。我们将使用Flask框架快速实现这一功能。

1. Web服务代码实现

在同级目录下创建 app.py,并写入以下代码。该代码集成了文件上传、OCR处理、结果展示功能。

```python from flask import Flask, request, render_template_string, send_from_directory, jsonify import os import werkzeug.utils 引入上一节编写的处理函数(假设在同一文件中,或者将上一节代码保存为 utils.py 并引入) 这里为了演示完整性,将核心逻辑合并展示,实际项目中建议模块化拆分 app = Flask(__name__) app.config['UPLOAD_FOLDER'] = './uploads' app.config['MAX_CONTENT_LENGTH'] = 16 1024 1024 限制上传大小为16MB HTML模板:极简的上传与结果界面 HTML_TEMPLATE = """ 建筑档案智能归档系统 建筑档案智能归档系统


{% if results %}

处理结果

{% for res in results %}

建筑公司档案整理:基于Python的自动化归档实操

原文件名: {{ res.original }}

识别信息: {{ res.key_info or '未识别到关键信息' }}

归档后名称: {{ res.new_name }}

状态: {{ '成功' if res.key_info else '待人工复核' }}

{% endfor %}
{% endif %} """ 复用上一节的OCR逻辑(为了篇幅紧凑,这里假设已定义 preprocess_image 和 extract_contract_number) 实际运行时请确保这些函数在 app.py 中可用 @app.route('/', methods=['GET', 'POST']) def index(): results = [] if request.method == 'POST': if 'file' not in request.files: return redirect(request.url) file = request.files['file'] if file.filename == '': return redirect(request.url) if file: 安全处理文件名 filename = werkzeug.utils.secure_filename(file.filename) upload_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) 确保上传目录存在 if not os.path.exists(app.config['UPLOAD_FOLDER']): os.makedirs(app.config['UPLOAD_FOLDER']) file.save(upload_path) 执行处理逻辑 processed_img = preprocess_image(upload_path) key_info = None if processed_img: text = pytesseract.image_to_string(processed_img, lang='chi_sim', config='--psm 6') key_info = extract_contract_number(text) 构造新文件名并移动(简化版逻辑,直接在uploads目录下重命名) base, ext = os.path.splitext(filename) new_name = f"{key_info}_{filename}" if key_info else f"UNKNOWN_{filename}" new_path = os.path.join(app.config['UPLOAD_FOLDER'], new_name) os.rename(upload_path, new_path) results.append({ 'original': filename, 'key_info': key_info, 'new_name': new_name }) return render_template_string(HTML_TEMPLATE, results=results) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) ```

四、部署运行与实操验证

代码编写完成后,最后一步是启动服务并进行实际测试。请按照以下步骤操作,确保整个流程在本地能够跑通。

1. 启动Web服务

在终端中进入项目目录,执行以下命令启动Flask服务:

```bash python app.py ```

终端显示 Running on http://0.0.0.0:5000 即表示启动成功。

2. 准备测试数据

找一张建筑公司的合同扫描件或者资质证书图片。为了测试效果,你可以用画图工具在图片上手动打上一行字:“合同编号:HT-2023-999”。这模拟了我们需要提取的关键信息。

3. 浏览器访问与上传

打开浏览器,访问 http://127.0.0.1:5000

  1. 点击“选择文件”,上传刚才准备好的测试图片。
  2. 点击“上传并智能归档”按钮。
  3. 观察结果:页面下方应立即显示处理结果卡片。如果识别成功,你将看到“识别信息:HT-2023-999”,状态显示为“成功”。

4. 验证归档文件

打开项目文件夹下的 uploads 目录(如果是在Web模式下运行),检查文件是否已经被重命名为 HT-2023-999_原文件名.jpg。至此,一个具备OCR识别能力的自动化档案整理服务已完全落地。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统