PDF补丁丁完整指南:从书签修复到无损提取图片的 4 个实用 PDF 任务
一摞扫描教材,没有文字层、没有书签,Ctrl+F 搜不到内容,页面尺寸还各不相同。PDF 补丁丁(PDFPatcher)是一款免费的 PDF 工具箱,可编辑书签、合并拆分文档、无损提取图片、用 OCR 写入文字层,覆盖大部分日常 PDF 处理场景。
安装与启动
PDFPatcher 是便携软件,解压后直接运行 PDFPatcher.exe,不需要安装,删除目录即卸载。运行环境为 Windows 7 以上系统和 .NET Framework 4.0–4.8(现代系统一般已自带);编译源码则需要 Visual Studio 2022 并安装“.NET 桌面开发”和“C++ 桌面开发”两个工作负载。从源码构建的流程如下:
git clone https://gitcode.com/GitHub_Trending/pd/PDFPatcher
启动后是典型的 WinForms 布局:上方菜单和工具栏是各功能入口,中间是带页数、标题、作者列的源文件列表,下方是按功能打开的选项卡切换区。鼠标在工具栏图标上停留几秒会弹出功能说明,不用翻手册也能找到入口。
启动后的主界面:上方菜单与工具栏,中间文件列表,底部功能选项卡
📑 用信息文件两步法为 PDF 挂上书签
给已有文字但没书签的 PDF 建目录,核心是“导出信息文件 → 编辑 XML → 补丁回 PDF”两步走:
- 选择“处理 PDF 文档”,确认处理模式为“独立补丁”
- 点击“添加文件”把文档加入列表,列表中显示页数、标题、作者
- 在“PDF 信息文件”处指定路径,如
bookmarks.xml - 点击“导出信息文件”——书签、文档属性、页码编号被导出为 XML
- 用文本编辑器打开这个 XML,修改书签文本、页码、属性
- 重新指定信息文件与“输出 PDF 文件”路径,点击“生成 PDF 文件”,输出目录出现带书签的新 PDF
第一步:添加文件、在“PDF 信息文件”处填 bookmarks.xml、点击“导出信息文件”
第二步:重新指定信息文件,在“输出 PDF 文件”处填路径(支持替代符),点击“生成 PDF 文件”
如果文档本身带文字,可改用“自动生成书签”功能:指定“原始 PDF 文件”和“PDF 信息文件”,设置“识别页码范围”和“标题文本尺寸”,点击“导出信息文件”后,日志窗口会逐条输出被识别为标题的文本、级别和页码,再走上面的两步流程写回文档。
合并与拆分页面尺寸不一的文档
- 点击工具栏“合并文件”,向文件列表混入图片(JPEG、PNG、GIF、BMP、TIFF)或源 PDF,支持直接从资源管理器拖入
- 双击某个源 PDF 可修改它的页码范围,默认第一页到最后一页——改这里就能拆分或重排页面
- 在“书签文本”列为每个文件填写文字,可设粗体、斜体、颜色,生成时按它挂书签
- 打开“合并文档选项”,指定统一页面尺寸,勾选“自动旋转”让横向图像自动适配页面
- 指定“输出 PDF 文件”,点击“生成 PDF 文件”,得到一份保留源书签的合并 PDF
“自动旋转”对比:左侧横向图像在纵向页面上下留白,右侧启用后页面自动转横向
🖼️ 无损提取 PDF 中的图片
扫描件原图要导出为图片文件时用这个功能:
- 选择“提取图片”,指定“原始 PDF 文件”和“输出位置”(目录)
- “页码范围”留空代表提取全书,只取部分页面则填范围
- 勾选“尝试合并相同页面的图片”——被制作工具切成碎片的页面会重新拼合,JPEG 源会无损合并为 PNG
- 图片上下颠倒就勾选“垂直翻转图片”,黑白反了就勾选“反转黑白图片的颜色”
- 点击“提取图片”,界面转到“输出信息”,导出过程可随时点“返回”终止
文件名默认为四位数编号(掩码 0000),如 0001.jpg、0002.tif。扩展名由原始压缩格式自动决定:JPEG 出 jpg,CCITTFax 或 JBIG2 出 tif,Deflate 出 png——想统一导出成 png 做不到,格式跟随原件正是“无损”的前提。掩码改成 文档000 则输出 文档001.jpg 这类名字。
🔍 用 OCR 给扫描件写入可搜索文字层
扫描教材要能搜索,先走识别再写入文字层:
- 选择“识别图像文本”,指定“原始 PDF 文件”
- 指定“识别结果文件”,后缀用
.xml可让结果包含文本坐标信息 - “识别页码范围”留空则识别所有页面;“文字识别语言”默认简体中文
- 点击“识别图像文本”,日志窗口输出识别结果
- 指定“输出 PDF 文件”,点击“写入识别结果”——生成带透明文字层的新 PDF,可搜索可复制
⚠️ 容易出错的细节与限制
- OCR 依赖 Office 组件,缺了就完全不能跑:识别引擎来自 Office 2003/2007 的 Document Imaging 组件(MODI)及对应语言模块;只装了简体中文引擎时,识别繁体中文必然失败。
- 提取图片的扩展名不是你能选的:由原始压缩格式自动决定(JPEG→jpg,CCITTFax/JBIG2→tif,Deflate→png),格式跟随原件才能保持无损。
- 批量输出的替代符为空时会静默回退:源文档没有“标题”属性时,
<标题>替代结果为空,程序自动改用原文件名;此时若源路径和输出路径相同,补丁静默不生效,输出路径务必错开。 - 自动书签生成是两趟流程,第一趟很少完美:日志窗口输出的标题文本、级别、页码就是调参依据;用“高级筛选处理”里的“从信息文件添加”从第一趟信息文件批量添加字体筛选器,比手写条件省事。
- 扫描件目录页做书签要先开点号校正:识别引擎常把“......”误识别为句号或 0,勾选“识别目录页的点(......)分隔符”后再用书签编辑器的“更改目标页码”修复对应关系。
- 书签目标页码错了会在阅读器里报错:点书签时若目标文档或页面找不到,阅读器直接弹出“无法打开文档”一类的错误提示,生成前先用书签编辑器核对页码。
- 加密 PDF 必须提供正确的打开密码:软件不提供密码破解,添加文件时弹密码框,答错就无法处理。
书签指向的文档或页面缺失时,阅读器会弹出错误提示——生成 PDF 前应先核对目标页码
实现思路与文档
程序基于 .NET Framework 开发,iText 与 MuPDF 各管一段:iText 是 .NET 组件,负责解析、生成、修改文档和嵌入 TTF 字体子集;MuPDF 是 C 语言编译的库,通过 P/Invoke 调用,负责把页面渲染成位图。结构编辑和页面渲染各由最擅长的库承担,所以同一个工具里既能改节点又能看页面;FreeImage 负责读取解码图片文件,ImageBox 负责显示渲染结果。
PDFPatcher/
├── App/Functions/ # 各功能窗体与控件
├── App/Processor/ # 内容流解析、书签/页面/图片处理器
├── App/Options/ # 各功能选项类
└── doc/ # 使用手册与示例信息文件
- 授权:对最终用户免费,采用 AGPL 加“良心授权”附加条款——使用获益后行一善事;用源码开发新软件并有销售收入时,捐赠不低于千分之一给弱势群体
- 完整功能说明见 使用手册,信息文件格式可看 示例文件,处理器源码在 App/Processor/
- 建议和需求通过仓库提交 Issue 或 PR;报问题时注明版本号、附截图,附件尽量压缩,PDF 可用“提取页面”功能只截代表性页面
那批扫不了也搜不了的教材,走一遍“识别图像文本”写入文字层、再用“自动生成书签”挂上目录树,就变成可检索可跳转的文档了。下一步:打开 doc/使用手册.md,从“导出信息文件”一节开始,把两步补丁流程完整跑一遍。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考








