证券公司档案数字化服务技术实操指南:从零搭建全流程系统

一、核心架构与选型

证券公司档案数字化涉及大量非结构化文件(合同、凭证、报告等)的扫描、识别、存储与检索,核心是构建一个稳定、安全、可扩展的流水线系统。我们采用“前端采集+后端处理+安全存储”的微服务架构。

1.1 硬件与基础软件选型

扫描设备:推荐富士通fi-8170或更高系列扫描仪,支持双面高速扫描与空白页自动跳过。安装官方ScanSnap Manager驱动,下载地址:https://www.fujitsu.com/global/support/products/computing/peripheral/scanners/software/。

服务器:最低配置为4核CPU/16GB内存/2TB SSD存储的Linux服务器(CentOS 7.9或Ubuntu 20.04 LTS)。

核心软件栈:

  • 文档处理引擎:Apache Tika 2.7.0(用于文本提取)
  • OCR引擎:Tesseract 5.0.0 + 训练好的中文金融词汇库
  • 存储服务:MinIO(对象存储,用于存放原始扫描件与结构化数据)
  • 数据库:PostgreSQL 14(存放元数据与索引)
  • 检索服务:Elasticsearch 8.5.0

二、环境搭建与配置

2.1 基础环境安装

在服务器上执行以下命令,安装全部依赖:

``` 更新系统并安装基础工具 sudo yum update -y && sudo yum install -y java-11-openjdk git gcc gcc-c++ make autoconf automake libtool 安装Tesseract OCR(需编译安装以支持中文) git clone https://github.com/tesseract-ocr/tesseract.git cd tesseract ./autogen.sh ./configure make sudo make install sudo ldconfig 下载并安装中文语言数据包(包含金融领域优化) wget https://github.com/tesseract-ocr/tessdata_best/raw/main/chi_sim.traineddata sudo mv chi_sim.traineddata /usr/local/share/tessdata/ 安装MinIO对象存储(创建数据存储目录) wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio sudo mv minio /usr/local/bin/ mkdir ~/minio-data ```

2.2 核心服务配置

MinIO配置:创建系统服务文件,实现开机自启。编辑 /etc/systemd/system/minio.service

``` [Unit] Description=MinIO Object Storage After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/minio server /root/minio-data --console-address ":9001" Restart=always [Install] WantedBy=multi-user.target ```

启动服务:sudo systemctl start minio && sudo systemctl enable minio。访问 http://你的服务器IP:9001,使用默认账号密码(minioadmin/minioadmin)登录,立即在管理界面修改密码,并创建一个名为 sec-archive 的存储桶。

PostgreSQL配置:安装后,创建数据库与用户:

``` sudo -u postgres psql CREATE DATABASE sec_digital_archive; CREATE USER archive_admin WITH PASSWORD 'YourStrongPassword123!'; GRANT ALL PRIVILEGES ON DATABASE sec_digital_archive TO archive_admin; \c sec_digital_archive CREATE TABLE document_meta ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), original_filename VARCHAR(500) NOT NULL, minio_object_name VARCHAR(500) NOT NULL, file_size BIGINT, file_type VARCHAR(50), ocr_text TEXT, client_code VARCHAR(20), contract_number VARCHAR(100), scan_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_client_code (client_code), INDEX idx_contract_number (contract_number) ); ```

三、数字化处理流水线开发

3.1 扫描与上传模块

编写一个Python脚本(scan_upload.py),实现从扫描仪接收文件并上传至MinIO。首先安装Python库:pip install pyscanner

``` import os from pyscanner import Scanner from minio import Minio from minio.error import S3Error import uuid 配置MinIO客户端 minio_client = Minio( "your-server-ip:9000", access_key="your-access-key", secret_key="your-secret-key", secure=False 内网环境设为False,生产环境应为True并使用HTTPS ) def scan_and_upload(scanner_ip, bucket_name="sec-archive"): 初始化扫描仪 scanner = Scanner(scanner_ip) 执行扫描,参数设置为彩色、300DPI、PDF格式 scanned_file_path = scanner.scan( resolution=300, color_mode="color", format="pdf", duplex=True ) 生成唯一对象名 object_name = f"raw_documents/{uuid.uuid4()}.pdf" 上传到MinIO try: minio_client.fput_object(bucket_name, object_name, scanned_file_path) print(f"上传成功: {object_name}") return object_name except S3Error as exc: print(f"上传失败: {exc}") return None if __name__ == "__main__": 替换为你的扫描仪IP obj_name = scan_and_upload("192.168.1.100") ```

关键操作:将此脚本部署在连接扫描仪的工控机或PC上,并设置为扫描仪按键触发执行。

3.2 OCR与元数据提取模块

证券公司档案数字化服务技术实操指南:从零搭建全流程系统

创建另一个Python服务(ocr_service.py),监听MinIO的文件上传事件,自动进行OCR处理。使用Watchdog库监听MinIO的webhook(需在MinIO控制台配置)或直接轮询数据库新记录。核心处理函数如下:

``` import pytesseract from PIL import Image import pdf2image import io from minio import Minio import psycopg2 def process_document(object_name): 从MinIO临时下载文件 temp_pdf_path = f"/tmp/{object_name.split('/')[-1]}" minio_client.fget_object("sec-archive", object_name, temp_pdf_path) 将PDF转换为图片列表(每页一图) images = pdf2image.convert_from_path(temp_pdf_path, dpi=200) full_text = "" for i, image in enumerate(images): 使用Tesseract进行OCR,指定中文语言和PSM模式(适用于全页文本) page_text = pytesseract.image_to_string( image, lang='chi_sim', config='--psm 3 --oem 3' ) full_text += f" Page {i+1} \n" + page_text + "\n" 这里可以添加更复杂的金融文档解析规则,例如用正则表达式提取客户代码、合同号 示例:提取类似“客户代码:123456”的字段 import re client_code_match = re.search(r'客户代码[::]\s(\w+)', full_text) client_code = client_code_match.group(1) if client_code_match else None 将OCR文本和元数据存入PostgreSQL conn = psycopg2.connect("dbname=sec_digital_archive user=archive_admin password=YourStrongPassword123! host=localhost") cur = conn.cursor() cur.execute(""" UPDATE document_meta SET ocr_text = %s, client_code = %s WHERE minio_object_name = %s """, (full_text, client_code, object_name)) conn.commit() cur.close() conn.close() 可选:将OCR文本也存入Elasticsearch以便全文检索 es.index(index="sec-documents", body={"content": full_text, "object_name": object_name}) os.remove(temp_pdf_path) print(f"处理完成: {object_name}") ```

部署:使用systemd将此脚本作为守护进程运行,确保其持续处理新文件。

四、安全与权限控制

4.1 存储加密与访问策略

在MinIO控制台,为sec-archive存储桶启用服务器端加密(SSE-S3)。在桶的“Access Policy”中,设置严格的权限:

``` { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": ["arn:aws:iam:::user/archive-app"]}, "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::sec-archive/raw_documents/"], "Condition": {"IpAddress": {"aws:SourceIp": ["10.0.1.0/24"]}} // 限制内网IP段 } ] } ```

数据库连接加密:在PostgreSQL的pg_hba.conf文件中,仅允许应用服务器IP通过MD5或SCRAM-SHA-256方式连接。

4.2 操作日志与审计

在数据库中创建操作日志表,记录所有文件的扫描、访问、下载行为:

``` CREATE TABLE audit_log ( log_id SERIAL PRIMARY KEY, user_id VARCHAR(50), action VARCHAR(50), -- 'SCAN', 'VIEW', 'DOWNLOAD' object_name VARCHAR(500), ip_address INET, action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ```

在每个文件处理和服务接口的关键节点,插入审计日志。

五、检索与查询接口

构建一个简单的Flask应用(app.py),提供根据客户代码、合同号或全文内容检索文档的API。

``` from flask import Flask, request, jsonify import psycopg2 from minio import Minio app = Flask(__name__) 数据库和MinIO连接配置(略) @app.route('/api/search', methods=['GET']) def search_documents(): client_code = request.args.get('client_code') keyword = request.args.get('keyword') conn = get_db_connection() cur = conn.cursor() if client_code: cur.execute("SELECT FROM document_meta WHERE client_code = %s", (client_code,)) elif keyword: 简单实现:在数据库OCR文本中模糊查询(生产环境应用Elasticsearch) cur.execute("SELECT FROM document_meta WHERE ocr_text LIKE %s", (f'%{keyword}%',)) else: return jsonify({"error": "请提供查询参数"}), 400 results = cur.fetchall() cur.close() conn.close() return jsonify([dict(row) for row in results]) @app.route('/api/document/', methods=['GET']) def get_document_url(object_name): 生成一个预签名的URL,供前端临时下载,7分钟后过期 url = minio_client.presigned_get_object( "sec-archive", object_name, expires=420 7分钟 ) return jsonify({"url": url}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False) ```

将此应用部署后,前端(如内部管理系统)即可通过调用 /api/search?client_code=xxx 来检索并获取临时访问链接,实现文档的安全查看。

六、部署与监控

使用Supervisor管理所有Python进程(scan_upload.py, ocr_service.py, app.py)。创建配置文件 /etc/supervisor/conf.d/archive.conf

``` [program:ocr_service] command=python3 /opt/sec-archive/ocr_service.py autostart=true autorestart=true stderr_logfile=/var/log/ocr_service.err.log stdout_logfile=/var/log/ocr_service.out.log [program:archive_api] command=gunicorn -w 4 -b 0.0.0.0:5000 app:app directory=/opt/sec-archive/ autostart=true autorestart=true ```

启动Supervisor:sudo supervisord -c /etc/supervisor/supervisord.conf

监控:在服务器上配置Prometheus Node Exporter监控基础资源,并针对OCR服务的关键指标(如队列积压数、单页处理耗时)添加自定义指标暴露。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统