作为学生想必大家都有过被海量手写实验报告、课程作业支配的痛苦。要花费大量时间一笔一划地抄写到纸质文档中再进行扫描成pdf提交不仅耗时耗力手写的字迹还可能参差不齐影响作业美观度。为了偷懒博主开发了一款基于python的PDF手写模拟器它能够模拟真实手写笔迹将电脑上的文字批量填充到 PDF 指定区域支持中文/英文分开配置、手写扰动效果自定义、配置模版复用等功能生成的效果高度贴近真实手写帮你彻底告别手动抄写的烦恼。首先来个界面以及效果预览流程思路总览这款 PDF 手写模拟器的整体运作流程可以分为「用户操作流程」和「技术实现流程」两层清晰易懂1. 用户操作流程简单易上手打开目标 PDF选择需要填写的实验报告、作业等 PDF 文件框选填写区域在 PDF 预览界面拖动鼠标框选出需要插入文字的区域红色矩形标记配置手写参数分别在中文、英文/数字选项卡中调整字体、大小、颜色、扰动效果等参数输入并预览文字在右侧文本框输入需要填写的内容开启「实时预览」查看手写效果不满意可实时调整参数确认并保存效果满意后确认应用笔迹支持撤销、擦除错误内容也可保存当前配置为模版最后导出填写完成的 PDF。2. 技术实现流程分层协作UI 交互层基于 tkinter 搭建可视化界面提供按钮、选项卡、文本框等交互组件接收用户操作参数配置层管理中文/英文手写参数支持配置保存JSON与加载实现模版复用PDF 操作层基于 PyMuPDF 实现 PDF 的读取、页面渲染、文字插入、擦除、保存等核心操作手写渲染层核心逻辑层实现文字排版、语言区分、手写扰动效果生成最终将模拟手写文字插入 PDF。┌─────────────────────┐│ UI交互层tkinter │ # 可视化交互接收操作└─────────────┬───────┘▼┌─────────────────────┐│ 参数配置层JSON │ # 参数管理模版复用└─────────────┬───────┘▼┌─────────────────────┐│ PDF操作层PyMuPDF │ # PDF核心操作读写/保存等└─────────────┬───────┘▼┌─────────────────────┐│ 手写渲染层核心 │ # 手写效果生成文字插入└─────────────────────┘涉及的具体技术这款工具基于 Python 生态的常用库开发技术栈轻量化且实用性强核心涉及以下技术tkinterPython 内置 GUI 库无需额外安装负责搭建整个应用的可视化界面实现按钮点击、参数调整、文本输入、PDF 预览等交互功能PyMuPDFfitz核心 PDF 处理库提供高效的 PDF 读取、写入、页面渲染、文字插入、红act标注擦除功能等接口是实现 PDF 编辑的核心依赖PillowPIL图像处理库将 PyMuPDF 渲染出的 PDF 页面像素数据转换成 tkinter 画布可显示的图像格式实现 PDF 页面的可视化预览JSON轻量级数据格式用于保存用户配置的手写参数模版字体、大小、扰动值等方便后续直接复用无需重复调整Python 随机数与数学计算实现手写效果的「不规则扰动」模拟真实手写的位置偏移、大小波动、行倾斜等特性TTF 字体支持读取自定义 TrueType 字体文件支持切换不同手写风格字体适配不同用户的手写习惯。最终效果演示代码原理简单讲解手写字体生成 扰动效果我们重点讲解核心功能 —— 手写字体生成与扰动效果的实现忽略 UI 搭建等辅助代码聚焦核心逻辑手写字体生成文字插入 PDF 核心这部分的核心是将文字按规则排版后插入到 PDF 指定区域关键步骤如下1.文字与区域预处理首先获取文本框中的输入文字按换行符\n分割成多行同时将用户框选的预览区域坐标带缩放比例转换为 PDF 实际坐标除以缩放系数self.zoom得到真实的填写范围(x1, y1, x2, y2)。123456# 读取输入文字并分割行textself.text_editor.get(1.0, tk.END).strip(\n)linestext.split(\n)# 转换为 PDF 实际坐标去除预览缩放影响x1, y1min(self.start_x,self.end_x)/self.zoom,min(self.start_y,self.end_y)/self.zoomx2, y2max(self.start_x,self.end_x)/self.zoom,max(self.start_y,self.end_y)/self.zoom2.语言区分与参数匹配通过is_chinese函数判断单个字符是中文还是英文/数字分别匹配对应的配置参数中文/英文独立的字体、大小、字距等确保不同语言的手写效果适配合理。123456789# 判断是否为中文含中文标点defis_chinese(self, char):if\u4e00char \u9fff:returnTrueifcharin。、“”‘《》【】:returnTruereturnFalse# 遍历字符时匹配对应语言参数langzhifself.is_chinese(char)elseenpself.params[lang]# 获取对应语言的配置参数3.PDF 文字插入核心 API使用 PyMuPDF 的page.insert_text方法实现文字插入这是手写字体生成的关键核心参数说明如下fitz.Point(final_x, final_y)文字的实际插入坐标经排版和扰动调整后char要插入的单个字符逐字符插入实现精细排版fontsize字符的实际大小带大小抖动fontfileTTF 手写字体文件路径决定字体风格color文字颜色默认纯黑支持用户自定义morph变换矩阵实现字符旋转效果叠加行倾斜与字符旋转抖动。4.行与字符排版按行遍历文字逐字符计算插入坐标处理空格单独预留间距当字符横坐标超出框选区域右侧时自动换行同时根据「行距参数」调整下一行的纵坐标确保文字排版规整且不超出框选范围。