在智慧档案馆的建设过程中,核心难点不在于硬件堆砌,而在于如何确保归档电子文件符合国家档案局发布的系列标准(如DA/T 22-2015《归档电子文件管理规范》、DA/T 70-2018《电子档案检测通用规范》)。本指南将摒弃理论说教,直接基于Python构建一套“电子档案四性检测”工具,实现对电子文件的真实性、完整性、可用性和安全性的自动化合规检测。
我们将重点解决以下技术落地问题:
为了确保代码的可移植性,我们选用Python作为开发语言。在开始编写代码前,必须配置好依赖库。请直接在终端执行以下命令安装核心依赖:
pip install pikepdf lxml Pillow PyPDF2 hashlib
依赖库说明:
根据DA/T 22标准,电子文件必须包含规范的元数据。我们将编写一个脚本,自动生成符合EAD(Encoded Archival Description)标准的XML文件,这是智慧档案馆数据交换的基础。
在项目目录下创建文件 metadata_builder.py,并写入以下完整代码:
```python
from lxml import etree
import datetime
import uuid
def generate_standard_ead_metadata(title, creator, date):
"""
生成符合DA/T 22规范的元数据XML
:param title: 档案题名
:param creator: 责任者
:param date: 归档日期
:return: XML字符串
"""
定义命名空间,确保符合EAD 2002标准
NSMAP = {None: 'urn:isbn:1-931666-22-9'}
ead = etree.Element('ead', nsmap=NSMAP)
构建eadheader
eadheader = etree.SubElement(ead, 'eadheader')
eadid = etree.SubElement(eadheader, 'eadid')
eadid.text = str(uuid.uuid4()) 生成唯一标识符
构建archdesc(档案描述)
archdesc = etree.SubElement(ead, 'archdesc', level='item')
did = etree.SubElement(archdesc, 'did')
强制项:unittitle(题名)
unittitle = etree.SubElement(did, 'unittitle')
unittitle.text = title
强制项:originating(责任者)
origination = etree.SubElement(did, 'origination')
persname = etree.SubElement(origination, 'persname')
persname.text = creator
强制项:unitdate(日期)
unitdate = etree.SubElement(did, 'unitdate', normal=date)
unitdate.text = date
da-specific extension (自定义扩展)
digiprovinfo = etree.SubElement(archdesc, 'digiprovinfo')
digiprovinfo.text = f"生成时间: {datetime.datetime.now().isoformat()}"
美化输出
return etree.tostring(ead, pretty_print=True, encoding='unicode')
测试生成
if __name__ == '__main__':
xml_data = generate_standard_ead_metadata('项目建设验收报告', '张三', '2023-10-01')
with open('archive_metadata.xml', 'w', encoding='utf-8') as f:
f.write(xml_data)
print("标准元数据文件已生成: archive_metadata.xml")
```
运行该脚本:
python metadata_builder.py
操作完成后,目录下会生成一个 archive_metadata.xml。你可以用文本编辑器打开,这便是符合国家标准的元数据封装,可直接用于档案系统的数据导入。
智慧档案馆建设标准明确规定,长期保存的电子公文必须采用PDF/A格式。普通的PDF库只能读取文件,无法验证其内部是否嵌入了PDF/A的特定标签。我们将使用 pikepdf 来实现这一核心功能。
创建文件 format_checker.py,代码如下:
```python
import pikepdf
import sys
import os
def check_pdfa_compliance(file_path):
"""
检测PDF文件是否符合PDF/A-1b或PDF/A-2b标准
"""
if not os.path.exists(file_path):
print(f"错误:文件 {file_path} 不存在")
return False
try:
打开PDF,pikepdf会自动解析内部结构
with pikepdf.open(file_path) as pdf:
检查是否标记为PDF/A
is_pdfa = pdf.is_pdfa
if is_pdfa:
尝试获取具体的PDF/A版本
doc_type = pdf.docinfo.get('/Type', 'Unknown')
print(f"[合规] 文件 {file_path} 符合 PDF/A 标准。")
return True
else:
print(f"[违规] 文件 {file_path} 不是有效的 PDF/A 格式,无法用于长期保存。")
提供修复建议
print("建议:使用Adobe Acrobat Pro或LibreOffice进行PDF/A标准化转换。")
return False
except pikepdf.PasswordError:
print(f"[错误] 文件 {file_path} 已加密,无法进行合规性检测。")
return False
except Exception as e:
print(f"[错误] 解析文件 {file_path} 时发生异常: {str(e)}")
return False
实操调用
if __name__ == '__main__':
请在此处替换为你本地的真实PDF文件路径
target_file = "demo_document.pdf"
check_pdfa_compliance(target_file)
```
实操步骤:
python format_checker.py。根据DA/T 70-2018标准,档案进馆前必须通过“四性检测”。我们将上述模块整合,编写一个主控脚本 archive_validator.py,实现真实性和完整性的哈希校验。
```python
import os
import hashlib
import json

from format_checker import check_pdfa_compliance
def calculate_file_hash(file_path):
"""计算文件的SHA-256哈希值,用于真实性校验"""
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
分块读取大文件,避免内存溢出
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
def validate_archive_integrity(manifest_json, file_folder):
"""
完整性检测:对比清单文件中的哈希值与实际文件哈希值
manifest_json: 包含文件名和预期哈希值的JSON对象
file_folder: 文件所在目录
"""
print("开始完整性检测...")
all_passed = True
for item in manifest_json['files']:
filename = item['filename']
expected_hash = item['hash']
full_path = os.path.join(file_folder, filename)
if not os.path.exists(full_path):
print(f"[失败] 文件缺失: {filename}")
all_passed = False
continue
actual_hash = calculate_file_hash(full_path)
if actual_hash == expected_hash:
print(f"[通过] {filename} 哈希校验一致。")
如果是PDF,顺便进行可用性检测
if filename.lower().endswith('.pdf'):
check_pdfa_compliance(full_path)
else:
print(f"[失败] {filename} 哈希不匹配!可能被篡改。")
print(f"预期: {expected_hash}")
print(f"实际: {actual_hash}")
all_passed = False
return all_passed
模拟检测流程
if __name__ == '__main__':
1. 模拟生成一个档案包清单(实际场景中由移交方提供)
test_manifest = {
"project": "智慧档案馆一期",
"files": [
注意:运行前请先计算本地demo_document.pdf的真实hash填入,或者先运行生成脚本
这里为了演示,假设你已经知道了hash值
]
}
print("请手动计算测试PDF的SHA256值并填入test_manifest以完成真实性测试。")
print("计算命令:")
print("import hashlib, sys; print(hashlib.sha256(open(sys.argv[1], 'rb').read()).hexdigest())")
```
DA/T 78-2019对纸质档案数字化的OCR识别率有明确要求(通常准确率需>95%)。为了落地这一标准,我们需要集成Tesseract OCR引擎。
步骤1:安装OCR引擎
Windows系统下载地址:https://github.com/UB-Mannheim/tesseract/wiki
下载安装包后,一路默认安装。安装完成后,必须将Tesseract的安装目录(例如 C:\Program Files\Tesseract-OCR)添加到系统的环境变量 Path 中。
MacOS用户直接执行:brew install tesseract
Linux用户执行:sudo apt install tesseract-ocr
步骤2:安装Python封装库
pip install pytesseract
步骤3:编写OCR检测脚本
创建文件 ocr_check.py:
```python
import pytesseract
from PIL import Image
import sys
如果在Windows上且未配置环境变量,需手动指定tesseract.exe路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def check_ocr_quality(image_path, expected_text):
"""
检测图片中是否包含预期的文字(基于关键词匹配的简化版准确率检测)
"""
try:
加载图片
img = Image.open(image_path)
执行OCR识别,指定中文+英文语言包
text = pytesseract.image_to_string(img, lang='chi_sim+eng')
print(f"识别结果预览:\n{text[:100]}...")
简单的关键词匹配逻辑
if expected_text in text:
print(f"[通过] OCR识别包含关键词 '{expected_text}',数字化质量达标。")
return True
else:
print(f"[警告] OCR识别未找到关键词 '{expected_text}',请检查图像清晰度。")
return False
except Exception as e:
print(f"[错误] OCR检测失败: {str(e)}")
print("提示:请确保已下载中文语言包 'chi_sim.traineddata' 并放入tessdata目录。")
return False
if __name__ == '__main__':
准备一张包含“档案”二字的图片进行测试
check_ocr_quality('test_image.png', '档案')
```
注意: 为了支持中文识别,你必须下载中文语言包 chi_sim.traineddata,并将其放置在Tesseract安装目录下的 tessdata 文件夹中。
至此,你已经构建了一套符合智慧档案馆建设标准的微型技术栈。该系统覆盖了:
metadata_builder.py 生成EAD XML。format_checker.py 强制校验PDF/A。archive_validator.py 进行SHA-256哈希比对。ocr_check.py 验证OCR识别效果。所有代码均为纯Python原生实现,无任何商业依赖,可直接集成到你的自动化归档流程中。建议将上述脚本封装为Flask或FastAPI接口,即可作为智慧档案馆的前置检测微服务使用。