当前位置: 首页 > news >正文

【免费AI文档助手开发实战系列】基于正则表达式的PDF脱敏python服务构建(一)

需求

人们在日常分发PDF过程中,需要把银行卡号、姓名、电话等敏感信息进行脱敏,方便分发。

架构设计

技术架构

技术架构分为三层:

界面层:用户可见的,采用vue2进行搭建。

后端服务:使用python3进行搭建,利用python的优势在于可以少代码,利用现成丰富的组件库,去处理PDF,PyMuPDF组件等,另外本身python也支持web应用的开发。

持久层:选择sqlite是因为它轻量,方便进行工具类的应用开发,业务处理比较少,方便快速的出效果。

业务架构

业务架构主要从业务流程、功能角度进行分析,用户侧提供功能,上传PDF,可选择脱敏对象(比如身份证号、邮箱、电话等),脱敏后的结果文件下载。

后台提供脱敏接口处理服务。

核心python代码

后台接口入口代码:

读取文件,然后传递给desensitize_pdf_stream方法进行处理

@app.post("/desensitize-pdf/")
async def handle_desensitization(file: UploadFile = File(...), rules: List[str] = Form(...), user_email: str = Form(...)):if file.content_type != "application/pdf": raise HTTPException(status_code=400, detail="Invalid file type.")if not rules: raise HTTPException(status_code=400, detail="No redaction rules selected.")pdf_contents = await file.read()processed_pdf_stream = desensitize_pdf_stream(pdf_contents, rules)log_tool_usage("desensitize", user_email)return StreamingResponse(processed_pdf_stream, media_type="application/pdf", headers={"Content-Disposition": f"attachment; filename=desensitized_{file.filename}"})

核心功能

desensitize_pdf_stream 函数接收PDF数据的字节流和一组脱敏规则 (active_rules)。它打开PDF文件,遍历每一页,并调用 redact_precise_page 函数进行处理。所有页面处理完毕后,它将修改后的PDF保存到一个字节缓冲区并返回。

脱敏工作原理

redact_precise_page 函数负责对单页进行具体的脱敏操作:

  1. 提取文本和位置: 它首先从页面中提取所有文本字符及其边界框(位置信息)。

  2. 识别敏感数据: 它使用预定义的 SENSITIVE_PATTERNS_MAP,在页面文本中查找特定模式(如电话号码、电子邮件和身份证号)。

  3. 遮盖与替换: 对于每一个找到的匹配项:

    • 它确定敏感文本在页面上的精确矩形区域。

    • 它在这个区域上绘制一个白色矩形来遮盖原始文本。

    • 它对匹配到的文本应用一个替换函数 (repl_func) 进行处理(例如,12345678901 变为 123****78901)。

    • 最后,它将这个已脱敏的新文本以相同的字体和大小,重新插入到被遮盖的位置。

SENSITIVE_PATTERNS_MAP = {"phone": (re.compile(r'(?<!\d)1\d{10}(?!\d)'), lambda m: m.group(0)[:3] + '****' + m.group(0)[-4:]),"email": (re.compile(r'\b([a-zA-Z0-9])[a-zA-Z0-9._%+-]*([a-zA-Z0-9])@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b'), lambda m: m.group(1) + '**' + m.group(2) + m.group(0)[m.group(0).find('@'):]),"id_card": (re.compile(r'\b\d{6}(\d{8})\d{4}\b'), lambda m: m.group(0).replace(m.group(1), '********')),
}def redact_precise_page(page: fitz.Page, active_rules: List[str]):chars = get_char_positions(page)if not chars: returnfull_text = ''.join([ch["c"] for ch in chars])patterns_to_apply = {key: SENSITIVE_PATTERNS_MAP[key] for key in active_rules if key in SENSITIVE_PATTERNS_MAP}for pattern, repl_func in patterns_to_apply.values():for match in pattern.finditer(full_text):start, end = match.start(), match.end()matched_chars = chars[start:end]if not matched_chars: continuex0, y0, x1, y1 = min(c["bbox"][0] for c in matched_chars), min(c["bbox"][1] for c in matched_chars), max(c["bbox"][2] for c in matched_chars), max(c["bbox"][3] for c in matched_chars)rect = fitz.Rect(x0, y0, x1, y1)page.draw_rect(rect, color=(1, 1, 1), fill=(1, 1, 1), overlay=True)masked_text = repl_func(match)fontname = map_pdf_font_to_builtin(matched_chars[0]["font"])fontsize = matched_chars[0]["size"]insert_point = fitz.Point(rect.x0, rect.y1 - 1)page.insert_text(insert_point, masked_text, fontname=fontname, fontsize=fontsize, color=(0, 0, 0))def desensitize_pdf_stream(pdf_bytes: bytes, active_rules: List[str]) -> io.BytesIO:doc = fitz.open(stream=pdf_bytes, filetype="pdf")for page in doc:redact_precise_page(page, active_rules)output_buffer = io.BytesIO()doc.save(output_buffer)doc.close()output_buffer.seek(0)return output_buffer

后端服务我采用fastapi进行发布。

前端代码利用AI构建,非常nice,比自己写,快准狠。

最后出来的效果:试用地址,网站上线了注册等其他功能,后续再说,当前功能免费使用,有任何好的文档工具创意,可以评论区留言,我来评估实现,并把设计、代码共享,并进行过工具上线。

http://www.xdnf.cn/news/1334575.html

相关文章:

  • 自动驾驶导航信号使用方式调研
  • “无纸化办公”加速推进,房产证智能识别技术或成行业标配
  • STM32H743芯片STM32H750解密解析
  • 云原生俱乐部-RH294知识点归纳(1)
  • 直流无刷电机旋转原理
  • Model Context Protocol (MCP) - 尝试创建和使用一下MCP Client
  • [Mysql数据库] 用户管理选择题
  • ssl代理
  • 面试记录5 .net
  • MySQL 8.x的性能优化文档整理
  • 深入理解与应用向量嵌入(Vector Embeddings):原理、实现与多场景实践
  • linux 内核 - 内存管理单元(MMU)与地址翻译(一)
  • 【GPT入门】第49课 LlamaFacotory 训练千问
  • macos 多个版本的jdk
  • 从ioutil到os:Golang在线客服聊天系统文件读取的迁移实践
  • Linux 文件系统权限管理(补充)
  • 技术半衰期悖论:AI时代“不可替代领域“的深耕地图
  • 【Day 30】Linux-SQL语句
  • 23种设计模式——模板方法模式(Template Method Pattern)详解
  • JavaScript 性能优化实战:从原理到落地的完整指南
  • 深入解析RAGFlow六阶段架构
  • element table 表格多选框选中高亮
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码2
  • 【网络运维】Linux 文本处理利器:sed 命令
  • Obsidian 1.9.10升级
  • Lecture 6 Kernels, Triton 课程笔记
  • python-使用鼠标对图片进行涂抹自定义绘图
  • React框架超详细入门到实战项目演练【前端】【React】
  • 玳瑁的嵌入式日记D21-08020(数据结构)
  • 河南萌新联赛2025第六场 - 郑州大学