PDF Contract Redactor
Redact sensitive values from scanned PDF contracts while preserving field names.
What It Does
- 1. OCR Recognition: Uses Alibaba Cloud OCR to extract text and positions from scanned PDFs
- Field-Value Matching: Finds field names (e.g., "合同金额") and their corresponding values (e.g., "45640元")
- Selective Redaction: Covers only the values with black boxes, keeping field names readable
Workflow
Step 1: PDF to Images
Convert PDF pages to high-resolution PNG images (200 DPI) for OCR.
Step 2: OCR with Alibaba Cloud
Call Alibaba Cloud OCR API to get:
- - All text blocks
- Bounding box coordinates for each text block
- Confidence scores
Step 3: Match Fields to Values
For each field in the field list:
- 1. Find the field name text block
- Look for the corresponding value in:
-
Right side: Same row, to the right of field name
-
Below: Next row, aligned with field name
- 3. Record field-value pair with both bounding boxes
Step 4: Generate Redacted PDF
For each matched value:
- 1. Convert image coordinates to PDF coordinates
- Draw black rectangle over the value area
- Keep field name area unchanged
Field List
The following fields are searched and their values are redacted:
- - 法务部归档编号, 归档时间, 申请人工号, 申请人姓名, 申请人部门
- 申请人部门负责人, 所涉项目名称(如有), 所涉项目编号(如有)
- 对方编号(如有), 合同编号, 合同名称, 合同甲方名称, 合同乙方名称
- 合同相对方, 相对方所属行业, 相对方是否为世界500强
- 相对方是央企/国企, 相对方是否为涉密单位, 业务类别, 合同类别
- 合同类型, 合同状态, 扫描件状态, 对方是否签章, 我方是否签章
- 销售、采购标的(非一起译填), 语种, 单价, 合同金额(元), 币种
- 支付/收款方式, 付款/收款条件, 合同结算周期, 是否使用公司模板
- 用章主体, 印章类型, 签订时间, 合同开始时间, 合同到期时间
- 收支类型, 我方联系人姓名, 我方联系人电话, 对方联系人姓名
- 对方联系人电话, 对方邮寄地址, 归档状态, 开票名称, 开票账号
- 开票银行, 收款名称, 收款账号, 收款银行, 验收时间, 验收标准
- 合同是否自动续期, 合同续期时间, 合同特殊约定
- 协议内是否有结算单, 结算单(如有)内容是否填写
Usage
Prerequisites
- 1. Alibaba Cloud account with OCR service enabled
- AccessKey ID and AccessKey Secret
Running the Tool
CODEBLOCK0
Example:
CODEBLOCK1
Output
- -
<name>_redacted.pdf: Redacted PDF with values covered - INLINECODE1 : JSON file listing all matched field-value pairs
Implementation Notes
OCR API
Uses Alibaba Cloud "通用文字识别-高精度版" (RecognizeAdvanced API):
- - Endpoint: INLINECODE2
- Returns text content and quadrilateral coordinates
- Supports automatic rotation detection
Field-Value Matching Logic
CODEBLOCK2
Coordinate Transformation
OCR returns coordinates in image space (200 DPI).
Convert to PDF space (72 DPI) using scale factor: INLINECODE3
Dependencies
CODEBLOCK3
Error Handling
- - If OCR API fails, retry with exponential backoff
- If field not found, skip silently (don't fail entire document)
- If value not found for a field, log warning and continue
PDF合同脱敏工具
从扫描版PDF合同中脱敏敏感数值,同时保留字段名称。
功能说明
- 1. OCR识别:使用阿里云OCR从扫描版PDF中提取文本及位置信息
- 字段-数值匹配:查找字段名称(如合同金额)及其对应的数值(如45640元)
- 选择性脱敏:仅用黑色方框遮盖数值区域,保持字段名称可读
工作流程
步骤1:PDF转图片
将PDF页面转换为高分辨率PNG图片(200 DPI)供OCR识别。
步骤2:阿里云OCR识别
调用阿里云OCR API获取:
步骤3:字段与数值匹配
针对字段列表中的每个字段:
- 1. 查找字段名称文本块
- 在以下位置查找对应数值:
-
右侧:同行,字段名称右侧
-
下方:下一行,与字段名称对齐
- 3. 记录包含两个边界框的字段-数值对
步骤4:生成脱敏PDF
针对每个匹配的数值:
- 1. 将图片坐标转换为PDF坐标
- 在数值区域绘制黑色矩形
- 保持字段名称区域不变
字段列表
以下字段将被搜索,其数值将被脱敏:
- - 法务部归档编号, 归档时间, 申请人工号, 申请人姓名, 申请人部门
- 申请人部门负责人, 所涉项目名称(如有), 所涉项目编号(如有)
- 对方编号(如有), 合同编号, 合同名称, 合同甲方名称, 合同乙方名称
- 合同相对方, 相对方所属行业, 相对方是否为世界500强
- 相对方是央企/国企, 相对方是否为涉密单位, 业务类别, 合同类别
- 合同类型, 合同状态, 扫描件状态, 对方是否签章, 我方是否签章
- 销售、采购标的(非一起译填), 语种, 单价, 合同金额(元), 币种
- 支付/收款方式, 付款/收款条件, 合同结算周期, 是否使用公司模板
- 用章主体, 印章类型, 签订时间, 合同开始时间, 合同到期时间
- 收支类型, 我方联系人姓名, 我方联系人电话, 对方联系人姓名
- 对方联系人电话, 对方邮寄地址, 归档状态, 开票名称, 开票账号
- 开票银行, 收款名称, 收款账号, 收款银行, 验收时间, 验收标准
- 合同是否自动续期, 合同续期时间, 合同特殊约定
- 协议内是否有结算单, 结算单(如有)内容是否填写
使用方法
前置条件
- 1. 已开通阿里云OCR服务的账号
- AccessKey ID和AccessKey Secret
运行工具
bash
python scripts/redactcontract.py <输入文件.pdf> keyid> key_secret> [输出文件.pdf]
示例:
bash
python scripts/redactcontract.py contract.pdf LTAIxxx xxx contractredacted.pdf
输出文件
- - <名称>redacted.pdf:数值已被遮盖的脱敏PDF
- <名称>fields.json:列出所有匹配的字段-数值对的JSON文件
实现说明
OCR API
使用阿里云通用文字识别-高精度版(RecognizeAdvanced API):
- - 端点:https://ocr.aliyuncs.com
- 返回文本内容和四边形坐标
- 支持自动旋转检测
字段-数值匹配逻辑
python
对于位于(fx0, fy0, fx1, fy1)的字段
查找满足以下条件的数值:
1. 右侧:vx0 > fx1 且 |vy0 - fy0| < 字段高度 * 2
2. 下方:vy0 > fy1 且 vx0 >= fx0 - 字段宽度 * 0.3
选择最接近的匹配项
坐标转换
OCR返回图片空间坐标(200 DPI)。
使用缩放因子转换为PDF空间坐标(72 DPI):scale = 72 / 200 = 0.36
依赖项
bash
pip install pymupdf pillow requests
错误处理
- - 如果OCR API调用失败,使用指数退避策略重试
- 如果未找到字段,静默跳过(不中断整个文档处理)
- 如果未找到某字段对应的数值,记录警告并继续处理