制造业档案整理服务从零搭建自动化归档系统

一、环境准备与依赖安装

在制造业场景中,档案通常包含大量的扫描件、图纸、质检单等非结构化数据。为了实现自动化整理,我们需要构建一个基于Python的本地处理环境。本指南不依赖任何付费云服务,全部在本地运行,确保数据安全。

1. 安装Python环境

确保系统已安装Python 3.8或更高版本。如果未安装,请直接从Python官网下载安装包。安装过程中,务必勾选"Add Python to PATH"选项,这直接关系到后续命令能否在终端中直接执行。

2. 安装Tesseract-OCR引擎

这是开源领域最强大的OCR工具,用于从图片中提取文字。

  • Windows用户:访问 https://github.com/UB-Mannheim/tesseract/wiki 下载最新的Windows安装包(推荐tesseract-ocr-w64-setup-5.x.x.exe)。安装时,务必勾选"Additional language data",并下载Chinese (Simplified)English语言包,否则无法识别中文内容。
  • Linux用户:执行命令 sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim

注意:默认安装路径通常为 C:\Program Files\Tesseract-OCR\tesseract.exe,后续代码中需要配置此绝对路径。

3. 安装Python依赖库

打开终端(CMD或PowerShell),执行以下命令安装所需的图像处理和OCR库:

```bash pip install opencv-python pytesseract pandas pillow shutil ```
  • opencv-python:用于图像预处理(去噪、二值化),提高OCR识别率。
  • pytesseract:Python的Tesseract封装接口。
  • pandas:用于生成档案索引Excel表。

二、核心功能模块开发

我们将代码分为三个核心模块:图像预处理(清洗图纸)、OCR文字提取(读取信息)、智能归档(移动文件并建立索引)。请创建一个名为 auto_archive.py 的文件。

1. 图像预处理模块

制造业的扫描件往往带有噪点或倾斜,直接识别准确率低。我们需要编写函数将图片转为黑白二值图,并去除干扰信息。

```python import cv2 import numpy as np def preprocess_image(image_path): 读取图片 img = cv2.imread(image_path) if img is None: return None 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 去噪 - 使用双边滤波保留边缘同时去除噪点 denoised = cv2.fastN bilateralFilter(gray, 9, 75, 75) 二值化 - 自适应阈值处理,针对光照不均的文档效果更好 这里的参数11和2是经验值,适用于大多数A4扫描件 binary = cv2.adaptiveThreshold(denoised, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) return binary ```

2. OCR文字提取模块

配置Tesseract路径并提取文字。这里必须指定中文语言包 chi_sim,并配置白名单字符以减少误识别。

```python import pytesseract 如果是Windows系统,请取消下面这行的注释并修改为你的实际安装路径 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def extract_text_from_image(image_processed): 配置识别参数:psm 6 表示假设图片为统一的文本块 custom_config = r'--oem 3 --psm 6 -l chi_sim+eng' try: text = pytesseract.image_to_string(image_processed, config=custom_config) return text except Exception as e: print(f"OCR识别失败: {e}") return "" ```

3. 档案规则解析与归档模块

这是业务逻辑的核心。我们需要从识别出的文字中提取关键信息(如“订单号”、“日期”),并据此重命名和移动文件。假设制造业档案命名规则通常包含“PO”开头的订单号。

```python import os import re import shutil import pandas as pd from datetime import datetime def parse_and_archive(text, source_file, output_dir, index_data): 提取订单号:假设格式为 PO-2023-xxxx order_match = re.search(r'PO-\d{4}-\d{4}', text) 提取日期:假设格式为 2023/10/25 或 2023.10.25 date_match = re.search(r'\d{4}[/.]\d{2}[/.]\d{2}', text) 默认值设置 order_id = order_match.group(0) if order_match else "UNKNOWN_ORDER" date_str = date_match.group(0) if date_match else datetime.now().strftime("%Y-%m-%d") 规范化日期格式,替换 / 或 . date_str = date_str.replace("/", "-").replace(".", "-") 构建新文件名:订单号_原文件名 file_ext = os.path.splitext(source_file)[1] new_filename = f"{order_id}_{date_str}{file_ext}" 构建目标文件夹路径:output_dir/订单号/年份 year = date_str.split("-")[0] target_folder = os.path.join(output_dir, order_id, year) 创建文件夹 if not os.path.exists(target_folder): os.makedirs(target_folder) target_path = os.path.join(target_folder, new_filename) 移动文件 try: shutil.move(source_file, target_path) print(f"已归档: {source_file} -> {target_path}") 记录索引数据 index_data.append({ "原始文件名": os.path.basename(source_file), "订单号": order_id, "档案日期": date_str, "存储路径": target_path, "处理时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S") }) except Exception as e: print(f"文件移动失败: {source_file}, 错误: {e}") ```

三、完整自动化脚本整合

将上述模块整合,并添加主循环逻辑。请将以下代码完整复制到 auto_archive.py 中。代码包含详细的异常处理,确保遇到损坏图片时程序不会中断。

```python import os import cv2 import pytesseract import re import shutil import pandas as pd from datetime import datetime ================= 配置区域 ================= 设置Tesseract路径(Windows用户必须修改此处) pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 设置源文件夹(待整理的乱码文件存放处)和输出文件夹 SOURCE_DIR = r'C:\Manufacturing_Files\Unsorted' OUTPUT_DIR = r'C:\Manufacturing_Files\Archived' =========================================== def preprocess_image(image_path): try: img = cv2.imread(image_path) if img is None: return None gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) denoised = cv2.fastNlMeansDenoising(gray, None, 10, 10, 7) binary = cv2.adaptiveThreshold(denoised, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) return binary except Exception: return None def extract_text(image_processed): if image_processed is None: return "" custom_config = r'--oem 3 --psm 6 -l chi_sim+eng' try: return pytesseract.image_to_string(image_processed, config=custom_config) except: return "" def process_file(file_path, index_list): 仅处理图片文件 if not file_path.lower().endswith(('.png', '.jpg', '.jpeg', '.tif', '.bmp')): return print(f"正在处理: {os.path.basename(file_path)}") 1. 预处理 processed_img = preprocess_image(file_path) 2. OCR识别 text_content = extract_text(processed_img) 3. 解析信息 order_match = re.search(r'PO-\d{4}-\d{4}', text_content) Date_match = re.search(r'\d{4}[/.]\d{2}[/.]\d{2}', text_content) order_id = order_match.group(0) if order_match else "MISC" date_str = Date_match.group(0) if Date_match else datetime.now().strftime("%Y-%m-%d") date_str = date_str.replace("/", "-").replace(".", "-") 4. 归档逻辑 file_ext = os.path.splitext(file_path)[1] new_name = f"{order_id}_{date_str}{file_ext}" year = date_str.split("-")[0] target_folder = os.path.join(OUTPUT_DIR, order_id, year) if not os.path.exists(target_folder): os.makedirs(target_folder) dest_path = os.path.join(target_folder, new_name) try: shutil.move(file_path, dest_path) index_list.append({ "原始文件名": os.path.basename(file_path), "提取订单号": order_id, "归档路径": dest_path, "处理状态": "成功" }) except Exception as e: print(f"移动失败: {e}") index_list.append({ "原始文件名": os.path.basename(file_path), "提取订单号": order_id, "归档路径": "无", "处理状态": f"失败: {str(e)}" }) def main(): if not os.path.exists(SOURCE_DIR): print(f"源目录不存在: {SOURCE_DIR}") return archive_index = [] files = [f for f in os.listdir(SOURCE_DIR) if os.path.isfile(os.path.join(SOURCE_DIR, f))] print(f"开始处理,共发现 {len(files)} 个文件...") for filename in files: full_path = os.path.join(SOURCE_DIR, filename) process_file(full_path, archive_index) 生成Excel索引表 if archive_index: df = pd.DataFrame(archive_index) excel_path = os.path.join(OUTPUT_DIR, f"archive_index_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx") df.to_excel(excel_path, index=False) print(f"处理完成!索引表已生成: {excel_path}") else: print("未处理任何文件。") if __name__ == "__main__": main() ```

四、实操运行步骤

制造业档案整理服务从零搭建自动化归档系统

代码编写完成后,按照以下步骤即可立即开始整理档案。

1. 准备测试数据

在电脑C盘创建文件夹 C:\Manufacturing_Files\Unsorted。放入几张测试用的图片(JPG或PNG格式),图片内容中需包含类似“PO-2023-8899”的字符以及日期。如果没有现成图片,可以用画图工具手写一张测试截图。

2. 执行脚本

在终端中切换到脚本所在目录,运行:

```bash python auto_archive.py ```

3. 验证结果

脚本运行结束后,检查 C:\Manufacturing_Files\Archived 目录。

  • 文件结构:你应该看到以订单号命名的子文件夹(如 PO-2023-8899),内部按年份分类。
  • 文件命名:文件名已自动更改为“订单号_日期.后缀”。
  • 索引表:Archived目录下会生成一个 archive_index_时间戳.xlsx 文件,打开即可查看所有文件的流转记录。

五、常见问题排查

在实操过程中,可能会遇到以下具体问题,请对照解决方案:

1. 报错:tesseract is not installed or it's not in your path

这通常发生在Windows系统上。原因:代码中配置的路径与实际安装路径不一致,或者未安装Tesseract。

解决:检查 C:\Program Files\Tesseract-OCR\ 下是否存在 tesseract.exe。如果安装在其他盘,请修改代码第16行的路径为绝对路径。

2. 识别出来的全是乱码

原因:Tesseract默认未加载中文训练数据,或者图片分辨率过低。

解决:确保安装时勾选了 chi_sim。如果是图片问题,在代码第34行的 cv2.imread 之前,可以尝试使用外部工具将图片DPI调整为300以上再处理。

3. 正则表达式提取不到订单号

原因:实际文档中的订单号格式与代码中的 PO-\d{4}-\d{4} 不一致。

解决:打开生成的Excel索引表,查看“提取订单号”列。如果全是“MISC”,请打印OCR识别出的原始文本(可在代码第60行添加 print(text_content)),根据实际格式修改代码第62行的正则表达式。例如,如果订单号是“ORD123456”,则将正则改为 r'ORD\d{6}'

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统