找回密码
 立即注册
首页 业界区 业界 实用程序:解放双手!Python 打造 PDF 手写模拟器,轻松 ...

实用程序:解放双手!Python 打造 PDF 手写模拟器,轻松搞定手写作业

稼布欤 昨天 16:30
前言

作为学生,想必大家都有过被海量手写实验报告、课程作业支配的痛苦。要花费大量时间一笔一划地抄写到纸质文档中再进行扫描成pdf提交,不仅耗时耗力,手写的字迹还可能参差不齐,影响作业美观度。
为了偷懒,博主开发了一款基于python的PDF手写模拟器,它能够模拟真实手写笔迹,将电脑上的文字批量填充到 PDF 指定区域,支持中文/英文分开配置、手写扰动效果自定义、配置模版复用等功能,生成的效果高度贴近真实手写,帮你彻底告别手动抄写的烦恼。首先来个界面以及效果预览:
代码已经开源在Github:https://github.com/ChenAI-TGF/PDF_HandWrite
欢迎大家下载,如果觉得有用的话可以给我点个Star,万分感谢!!
如果登不上Github的话也欢迎直接私信博主要代码

1.png

流程思路总览

这款 PDF 手写模拟器的整体运作流程可以分为「用户操作流程」和「技术实现流程」两层,清晰易懂:
1.  用户操作流程(简单易上手)


  • 打开目标 PDF:选择需要填写的实验报告、作业等 PDF 文件;
    2.png

    3.png

  • 框选填写区域:在 PDF 预览界面拖动鼠标,框选出需要插入文字的区域(红色矩形标记);
    4.png

  • 配置手写参数:分别在中文、英文/数字选项卡中调整字体、大小、颜色、扰动效果等参数;
    5.png

  • 输入并预览文字:在右侧文本框输入需要填写的内容,开启「实时预览」查看手写效果;
    6.png

    7.png

  • 不满意可实时调整参数
    8.png

  • 确认并保存:效果满意后确认应用笔迹,支持撤销、擦除错误内容,也可保存当前配置为模版,最后导出填写完成的 PDF。
9.png

2.  技术实现流程(分层协作)


  • UI 交互层:基于 tkinter 搭建可视化界面,提供按钮、选项卡、文本框等交互组件,接收用户操作;
  • 参数配置层:管理中文/英文手写参数,支持配置保存(JSON)与加载,实现模版复用;
  • PDF 操作层:基于 PyMuPDF 实现 PDF 的读取、页面渲染、文字插入、擦除、保存等核心操作;
  • 手写渲染层:核心逻辑层,实现文字排版、语言区分、手写扰动效果生成,最终将模拟手写文字插入 PDF。
  1. ┌─────────────────────┐
  2. │  UI交互层(tkinter) │  # 可视化交互,接收操作
  3. └─────────────┬───────┘
  4.               ▼
  5. ┌─────────────────────┐
  6. │  参数配置层(JSON)  │  # 参数管理,模版复用
  7. └─────────────┬───────┘
  8.               ▼
  9. ┌─────────────────────┐
  10. │ PDF操作层(PyMuPDF) │  # PDF核心操作(读写/保存等)
  11. └─────────────┬───────┘
  12.               ▼
  13. ┌─────────────────────┐
  14. │  手写渲染层(核心)  │  # 手写效果生成,文字插入
  15. └─────────────────────┘
复制代码
涉及的具体技术

这款工具基于 Python 生态的常用库开发,技术栈轻量化且实用性强,核心涉及以下技术:

  • tkinter:Python 内置 GUI 库,无需额外安装,负责搭建整个应用的可视化界面,实现按钮点击、参数调整、文本输入、PDF 预览等交互功能;
  • PyMuPDF(fitz):核心 PDF 处理库,提供高效的 PDF 读取、写入、页面渲染、文字插入、红act标注(擦除功能)等接口,是实现 PDF 编辑的核心依赖;
  • Pillow(PIL):图像处理库,将 PyMuPDF 渲染出的 PDF 页面像素数据,转换成 tkinter 画布可显示的图像格式,实现 PDF 页面的可视化预览;
  • JSON:轻量级数据格式,用于保存用户配置的手写参数模版(字体、大小、扰动值等),方便后续直接复用,无需重复调整;
  • Python 随机数与数学计算:实现手写效果的「不规则扰动」,模拟真实手写的位置偏移、大小波动、行倾斜等特性;
  • TTF 字体支持:读取自定义 TrueType 字体文件,支持切换不同手写风格字体,适配不同用户的手写习惯。
最终效果演示

10.png

代码原理简单讲解(手写字体生成 + 扰动效果)

我们重点讲解核心功能 —— 手写字体生成与扰动效果的实现,忽略 UI 搭建等辅助代码,聚焦核心逻辑:
一、 手写字体生成(文字插入 PDF 核心)

这部分的核心是将文字按规则排版后,插入到 PDF 指定区域,关键步骤如下:
<ol>文字与区域预处理
首先获取文本框中的输入文字,按换行符 \n 分割成多行,同时将用户框选的预览区域坐标(带缩放比例)转换为 PDF 实际坐标(除以缩放系数 self.zoom),得到真实的填写范围 (x1, y1, x2, y2)。
  1. # 读取输入文字并分割行
  2. text = self.text_editor.get("1.0", tk.END).strip("\n")
  3. lines = text.split('\n')
  4. # 转换为 PDF 实际坐标(去除预览缩放影响)
  5. x1, y1 = min(self.start_x, self.end_x)/self.zoom, min(self.start_y, self.end_y)/self.zoom
  6. x2, y2 = max(self.start_x, self.end_x)/self.zoom, max(self.start_y, self.end_y)/self.zoom
复制代码
语言区分与参数匹配
通过 is_chinese 函数判断单个字符是中文还是英文/数字,分别匹配对应的配置参数(中文/英文独立的字体、大小、字距等),确保不同语言的手写效果适配合理。
[code]# 判断是否为中文(含中文标点)def is_chinese(self, char):    if '\u4e00'

相关推荐

您需要登录后才可以回帖 登录 | 立即注册