前置环境准备
1. 依赖组件安装
本次实操选用开源轻量电子签章核心组件,项目地址:https://github.com/digital-signature/core,直接执行以下命令完成安装,不得修改版本号:
- Node.js环境(档案系统基于Node.js开发):npm install @digital-signature/core@1.2.0 --save
- Python环境(后端数据同步辅助工具):pip install digital-sign-core==0.9.5
注意:必须安装指定版本,高版本存在API不兼容问题,将导致签章功能失效。
电子签章核心配置
1. 系统核心参数配置
在档案系统的核心配置文件 config/archive.sign.config.js 中,添加以下完整配置,不得省略任何字段,路径需绝对对应:
```javascript
module.exports = {
signApiUrl: "https://api.digital-signature-ops.com/v2",
signAppId: "ARCHIVE_OFFICIAL_2024_007",
signAppSecret: "SECURE_2024_ARCHIVE_SIGN_7890",
caCertPath: "./cert/root_ca_archive.pem",
signValidDays: 365,
maxSignSize: 2048 // 签章图片最大体积(KB)
}
```
必填项说明:signAppSecret 需从签章运营后台生成,不得使用测试密钥;caCertPath 需提前下载CA根证书,下载地址:https://sign.ops.com/certs/root_ca_archive.pem,保存至指定路径后不得修改文件名。
2. 档案文件预处理规则
电子签章仅支持PDF格式档案,非PDF格式需先转换,执行以下对应环境的转换命令,确保文件无中文路径:
Linux/macOS环境:
```bash
libreoffice --convert-to pdf --outdir ./processed_archive ./original_archive/123号档案.docx
```
Windows环境(PowerShell):
```powershell
& "C:\Program Files\LibreOffice\program\soffice.exe" --convert-to pdf --outdir ./processed_archive ./original_archive/123号档案.docx
```
验证步骤:转换后用PDF阅读器打开,确认文字、图表无乱码,页码完整。
签章功能对接实操
1. 前端签章按钮添加与逻辑

在档案详情页的HTML模板(templates/archive/detail.page.html)中,添加按钮代码:
```html
```
在对应JS文件(static/js/archive.detail.js)中添加以下代码,实现按钮激活、签章提交逻辑:
```javascript
import { SignManager } from '@digital-signature/core';
import signConfig from '../../config/archive.sign.config.js';
const signManager = new SignManager(signConfig);
let currentArchiveId = null;
// 监听档案加载完成事件,激活按钮
document.addEventListener('archiveLoaded', async (e) => {
currentArchiveId = e.detail.archiveId;
const hasSigned = await signManager.checkSignExist(currentArchiveId);
document.getElementById('archiveSignBtn').disabled = hasSigned;
});
// 按钮点击签章逻辑
document.getElementById('archiveSignBtn').addEventListener('click', async () => {
try {
const signResult = await signManager.sign({
archiveId: currentArchiveId,
signerName: "张晓明",
signerRole: "档案管理员",
signPosition: { x: 250, y: 400, width: 160, height: 55 } // 左上角坐标,单位:像素
});
if (signResult.success) {
alert('电子签章添加成功');
location.reload();
} else {
alert(`签章失败:${signResult.errMsg}`);
}
} catch (err) {
alert(`系统错误:${err.message}`);
}
});
```
位置说明:signPosition 字段需避免覆盖档案正文,坐标可根据PDF页面大小微调,宽高固定为160×55像素,符合签章规范。
2. 后端签章校验接口开发
在档案系统后端(Node.js Express框架)添加签章保存与校验接口,文件路径:server/routes/sign.route.js,代码如下:
```javascript
const express = require('express');
const router = express.Router();
const SignManager = require('@digital-signature/core').SignManager;
const signConfig = require('../../config/archive.sign.config.js');
const signManager = new SignManager(signConfig);
const db = require('../utils/db.util');
// 签章保存接口
router.post('/save-sign', async (req, res) => {
try {
const { archiveId, signData } = req.body;
// 校验签章合法性
const isLegit = await signManager.verifySign(signData);
if (!isLegit) return res.status(400).json({ success: false, msg: '签章不合法' });
// 保存至数据库(表结构提前创建:archive_sign(archive_id, sign_data, signer_id, create_time))
await db.query(`INSERT INTO archive_sign VALUES (?, ?, ?, NOW())`, [
archiveId, signData, signData.signerId
]);
res.json({ success: true });
} catch (err) {
res.status(500).json({ success: false, msg: err.message });
}
});
module.exports = router;
```
数据库要求:表 archive_sign 需提前创建,字段类型与名称完全匹配,不得自行修改。
签章效果测试与问题修复
1. 全流程测试步骤
- 步骤1:上传1份测试PDF档案(无加密)至系统,确保档案加载正常
- 步骤2:确认“添加电子签章”按钮可点击,点击后弹出签章提交确认
- 步骤3:签章成功后,下载档案查看,确认签章清晰无偏移,可通过PDF阅读器的“签名”模块验证
- 步骤4:删除签章后重新添加,确认功能可正常回退
2. 常见问题修复
- 问题1:按钮点击无响应→检查
signAppId、signAppSecret 是否与后台一致,CA证书路径是否正确
- 问题2:签章失败→确认CA证书未过期,签章图片大小未超过2048KB
- 问题3:PDF转换乱码→重新安装LibreOffice,转换时确保文件路径无中文字符
- 问题4:签章后无法验证→检查后端接口是否正确引入
verifySign 方法,数据库表是否存在
正式部署注意事项
1. 正式环境需替换测试用的 signAppSecret 和CA证书,不得使用测试密钥上线
2. 签章位置建议使用相对坐标配置,避免因PDF页面尺寸变化导致错位
3. 需添加签章审批逻辑,仅授权档案管理员可添加签章
4. 所有签章操作需记录日志,日志字段包含操作人、时间、档案ID,便于后续追溯