# offline-pdf-tools (wallechfox/offline-pdf-tools)

> An offline PDF toolkit delivered as a single web page with 40+ tools (merge, split, rotate, convert, watermark, bookmarks and more). Everything runs in your browser and no files are uploaded.

- GitHub: https://github.com/wallechfox/offline-pdf-tools
- GitHub.Locker page: https://github.locker/wallechfox/offline-pdf-tools
- Stars: 422
- Language: HTML
- License: MIT
- Last push: 2026-11-04

## Questions and answers

Written by GitHub.Locker from the README and the repository; check the README below for details.

**Is it a program I install, or a website I visit?**

Neither in the usual sense: it is one HTML file you open in a browser. There is no installer and no server, so you just open the file and start working.

**How do I start using it?**

Get the repository, open the single HTML file in a modern browser, and pick a tool from the home page. Then open your local PDF with the file picker.

**Do I need anything besides a browser?**

No. The README says any browser works, and it lists Windows, Linux, macOS, Android, iOS and the Chinese Kylin system as supported.

**Any limits I should know about?**

Some options rasterize pages, so the text becomes an image and can't be selected or searched (for example, rasterized crop and non-editable stamp export). Scanned PDFs with no text layer will return empty text when extracted.

**Does it work without an internet connection?**

Yes. It is described as purely offline, and the README says it embeds CMap data so Chinese text renders without network access.

**What makes it different from other PDF tools?**

It adds niche features such as invoice-friendly merging, bookmark editing that writes colored bookmarks into the PDF, and a simulated scan effect. Everything still runs locally in the browser.

**Is it safe to open PDFs from untrusted sources?**

The README says it adds a page-level CSP without unsafe-eval and sets isEvalSupported to false in pdf.js, so malicious embedded fonts should not execute injected code.

**Is the project still actively updated?**

Yes. The changelog lists V7.2 from 2026-11-03, with new features like PDF text extraction and bookmark editing added recently.


---

## README (checked against GitHub 2026-11-05)

Source: https://github.com/wallechfox/offline-pdf-tools/blob/main/README.md

# 📦 离线PDF工具箱 V7.2

> 纯离线 · 零上传 · 全免费 · 免安装 · 全平台通用

一个完全运行在浏览器端的 PDF 处理工具集。**现已升级为42 项功能**，无需安装软件，无需上传文件，打开就能用。

通吃 **Windows、Linux、macOS、安卓、iOS、国产麒麟系统**——只要有浏览器，它就能运行。

---

## 📦 更新日志

### [V7.2] - 2026-11-03

#### 新增

- 📄 **PDF 提取文本**：读取 PDF 的**文字层**，按文字坐标还原阅读顺序，尽量减少串行；页与页之间可插入「第 N 页」标题行、分隔线或什么都不插；可勾选「保留段落」，也可整段拼接不换行。结果直接显示在页面里，支持**一键复制**与**保存 UTF-8 TXT**（带 BOM，Windows 记事本直接可读）。已提取后再调整分隔符 / 排版只重组缓存文本，不重复解析文件。不修改原文件。
- 📑 **添加 / 编辑书签**：左侧书签树、右侧页面预览，工具栏在预览上方。打开 PDF 时自动读入原有大纲，可新增、删除、双击改名，随时调整目标页与颜色；上移 / 下移只调整同级顺序，「设为子项 / 提升一级」调整层级。书签颜色会写入 PDF，Acrobat 中即显示为彩色书签，重新打开也能读回。支持导出 / 导入书签 JSON、撤销 / 重做（60 步）、按标题搜索；保存生成「原名-书签.pdf」，原文件不变。

#### 界面统一（贯穿全站 42 个模块）

- **模块页面两段式骨架**：上段「左上传窗口（340px）+ 右功能说明（≤660px）」，下段「左设置列（300px）+ 右预览区」。页面重排、倒序、补齐空白页、删除页面、自动删空白页、批量 / 逐页旋转、页面拼版、小册子排版 / 拆分、裁剪白边等模块全部按此重排。
- **参数分组**：同一模块的参数按语义收进浅底圆角框（全站 43 组），不再平铺成长条。
- **预览窗口统一**：高度统一为 `clamp(420px, calc(100vh - 300px), 720px)`——大屏 720、矮屏自动收缩，保证预览和操作按钮同屏；带翻页的模块统一为「左翻页组 / 右缩放或提示」工具条，只翻页的模块不再出现多余缩放按钮。
- **页码文案统一**：全部改为「第 N / M 页」。
- **模块页标题加收藏星标**：42 个模块主界面标题旁可直接收藏，与首页卡片、收藏夹三处状态实时同步；星标紧贴标题文字，不飘到页面最右侧。
- **裁剪白边**：改为上下两段，下段三栏 2 : 2 : 6（白色容差 / 微调范围 / 预览），说明栏加宽到 400px；微调数值改为可直接输入的毫米数字框，与滑块、拖动预览框三者实时双向同步。
- **小册子拆分**：切分方向三个选项各占一行，左右栏比例 4 : 6；自动检测项注明「横图左右切、竖图上下切」。
- **其他修订**：页面拼版「不足处理」与「边距」拆成两组上下两行；倾斜校正 7 组参数分别加框；拆分对开页去掉不随翻页刷新的提示；添加页码预览加高 200px、Bates 加高 150px；PDF 加密权限另起一行、两个密码框铺满整行；文档信息、CA 签章、扁平化等模块的「使用建议」并入功能说明。

#### 收藏夹

- 首页卡片右上角星标常显，点击即收藏；「收藏夹」区块置顶显示（共 N 项），支持拖动卡片排序、导出 / 导入收藏配置、清空收藏。
- 收藏数据只存在浏览器 `localStorage`（键 `xcpdf.favorites`），不上传；删除模块后，旧收藏中失效的条目会自动清理。

#### 修复

- 修复**扇形骑缝章**多页覆盖与 `/Rotate` 页面坐标偏移。
- 修复**添加页码、Bates 编页**在 `/Rotate` 页面上的坐标偏移；修复添加页码「奇偶翻转」只影响预览、导出不生效，以及「加粗」勾选后预览与导出均无效果。
- 修复**统一页面大小**：文字 / 矢量页面需要缩放时必定报错并让按钮锁死的问题（原先把页面对象当成可绘制对象）；处理失败时也会给出提示并自动恢复按钮。
- 修复**删除页面、自动删除空白页、页面旋转·批量、页面旋转·逐页**：重新打开另一个文件后，大图预览与翻页数量会累积上一次页面；现在每次载入文件都会重建预览。
- 修复**图片水印**旋转 90° 后被拉伸变形；A4/A3、横竖混排文档中后续页水印位置偏移；平铺模式预览与导出起点不一致。**文字水印**的混合尺寸定位同步修复，每页按自身实际尺寸定位。
- 修复**工程蓝图**导出的 PDF 纸张尺寸随渲染倍率一起放大（约 2 倍）：保留高清图像，页面物理尺寸与原页一致。
- 修复**页面重排**：未添加真实 PDF、只添加过空白页时，再次添加空白页会报错。
- 修复**小册子拆分**：旋转页面后点放大镜，大图预览不显示。
- 修复**按书签炸开**完成数量与实际生成文件数不一致；**元数据编辑**单独清空某个字段保存后又被原值填回；**添加 / 编辑书签**清空全部后无法按提示保存无书签 PDF。
- 修复**PDF 转图片**批量下载中任意一页失败会中断整批、进度条卡住且按钮不恢复。
- 修复公共大图预览在快速翻页时图片、页码与说明错位；修复反复导入多页 TIFF 后图片地址未回收导致的潜在内存增长。
- 代码梳理：移除重复工具函数与未使用变量、空事件监听，公共逻辑统一收敛到 `ToolUtils`。

#### 字体兼容与安全加固

- **内置全套 CMap（168 个）**：替换原先只含 5 个简体横向 CMap 的精简包。对「只写字体名 + 预定义 CMap、不嵌入字体」的 PDF（如部分政务/银行导出文件），文本不再乱码，页面不再空白或方块。Word 等自带字体的 PDF 表现不变。
- **恶意 PDF 防护（双重）**：新增页面级 CSP（`script-src` 不含 `unsafe-eval`，`object-src 'none'`），同时在 pdf.js 加载参数中设置 `isEvalSupported: false`，关闭字形指令的动态编译。即便 PDF 内嵌针对 CVE-2024-4367 的构造字体，打开文件也不会执行任何注入代码。
- **图章 / 骑缝章提供两种导出**：**「保存为可编辑PDF」**保留原文字层、矢量内容与书签，印章作为独立对象叠加；**「导出不可编辑PDF」**把盖章后的页面逐页栅格化再重建 PDF，印章成为页面像素，Acrobat 等软件无法再单独选中、移动或删除。栅格化时扫描页按原图分辨率输出，矢量页按 300dpi 输出；未盖章页也会一并栅格化，页序、书签、元数据保持不变。

### [V7.1] - 2026-09-15

#### 修复

- 修复**图片转PDF**模块导入 PDF 后导出失败的问题：PDF 拆出的页面被误当成真实图片文件，现通过判断文件类型正确区分处理路径。
- 修复** 批注**模块，圆角矩形导出时变为矩形的Bug，新增图形拖拽手柄，同时对各个图形的参数作了调整。

#### 优化

- 优化**CA 签章查看**模块：在左侧加了导航栏，方便查看多页签章。


### [V7.0] - 2026-09-13

#### 新增

- 🗑️ **自动删除空白页**：自动检测 PDF 中的疑似空白页（非白色像素比例低于阈值），仅预览检测到的空白页供用户确认，支持灵敏度调节、全选/反选，一键删除并保存为去除空白页的新 PDF。书签将保留。
- 📖 **小册子拆分**：将骑马订装订的扫描件（一张图含两页并排）自动拆分为单页，并按正确页码顺序重排。支持自动检测切分方向（左右/上下）、拖拽调整扫描图顺序、逐页旋转，适用于拆开订书钉后用 A3 扫描仪扫描的文档。
- 🖋️ **CA 签章查看**：打开带数字签名的 PDF，自动列出所有签名域（名称、页码、外观），并在页面上用红框高亮签名位置。感谢 GitHub 用户 [gitca233](https://github.com/gitca233/offline-pdf-tools) 贡献此模块。

#### 优化

- **常规合并新增发票模式**：勾选后逐文件检测，对 pdf-lib 复制后内容丢失的特殊 PDF（如京东发票）自动转为图片合并，正常文件仍保留矢量文字，兼顾兼容性与清晰度。
- **常规合并支持图片与 PDF 混合合并**：图片自动等比缩放居中放入 A4 页面，按列表顺序与 PDF 合并，并跳过发票检测以节省算力。
- **添加页码模块增强**：
  - 新增“从第 X 页开始编页码”功能，适用于封面不编页码、不显示页码的场景。
  - 新增“翻转左右页码位置”按钮，可手动调节奇偶页页码左右位置，解决双面打印时页码位置不符合预期的问题。
- **图章混合模式**：添加图章和扇形骑缝章两个模块新增 3 种混合模式——**常规**（直接覆盖页面）、**正片叠底**（模拟真实盖章效果，白底印章最佳）、**变暗**（白底纯红印章接近正片叠底效果）。用户可根据印章类型和页面背景选择最佳模式。
- **拆分对开页新增 1X 模式**：用于生成体积更小的 PDF 文件。
- **图片转 PDF 大幅优化**：未旋转的 JPG/PNG 图片直接嵌入原文件，不再经过 Canvas 转码，转换速度显著提升，JPG 转出的 PDF 体积不再膨胀数倍。
- **批注功能增强**：新增圆形、椭圆、圆角矩形、填充框等标记工具，边框色与填充色独立设置，填充透明度独立调节，工具参数按需显示，操作更聚焦。
- **模拟扫描件模块调整**：旋转控制改为“最大偏离幅度”（-2~2°，默认 0.3°），所有页面统一使用同一个角度，调整幅度时所有页面统一调整，移除了手动微调单页角度功能，导出结果与预览完全一致。
- **PDF 压缩支持限定目标体积**：设定期望大小后，程序自动迭代寻找最清晰的压缩参数，在体积达标的前提下尽量保留画质。
- **按书签炸开支持选择拆分层级**：可指定最大拆分层级（1 代表一级书签，2 代表二级书签），按需控制拆分深度，避免层级过深导致文件过多。

#### 修复

- 修复**删除页面**模块中，点击图片右上角放大镜图标无预览的问题。
- 修复**加密和解密**模块在某些情况下失败的问题。
- 修复**扇形骑缝章**从第 2 页开始印章上出现黑线的问题。原因是切片坐标使用小数，导致 PNG 透明边缘中的黑色像素被切到。修复后坐标全部取整并关闭图片平滑，黑线消失。
- 修复**按书签炸开**模块，炸开失败：失败: seqNum is not defined的问题，同时添加了最大拆分层级
- 修复**图片转PDF**模块旋转图片时逆时针方向画面被裁切、多次旋转后边缘出现黑边的问题，重写旋转逻辑，任意方向旋转均完整保留画面且边缘干净。
- 修复**页面滤镜**模块导出 PDF 时因渲染分辨率过低导致画面模糊（马赛克）的问题，现在输出清晰度与原文件一致。


### [V6.5] - 2026-08-31

#### 新增

- 🔐 **PDF加密**：支持为 PDF 文件添加打开密码和权限密码，可限制打印、复制、编辑、注释等操作。基于 `@cantoo/pdf-lib` 实现，加密后文件内容和排版保持不变，使用 `useObjectStreams: false` 确保最大兼容性。
- 📑 **按书签炸开增加序号命名**：在每个拆分文件前按顺序添加序号，序号位数根据书签总数自动调整（如 35 个书签时自动补零为 01、02…），确保文件按书签顺序正确排列。

#### 优化

- **PDF解密模块大幅改进**：利用 `@cantoo/pdf-lib` 的带密码加载能力，解密后文件**保留原始矢量文字、书签和元数据**，体积几乎不变，不再需要逐页光栅化重编码，彻底解决此前解密后清晰度下降的问题。
- **加密模块交互优化**：权限设置区域根据权限密码输入框状态自动启用/禁用（无权限密码时变灰并提示"需设置权限密码后才生效"）；打印权限改为单选按钮，操作更直观。
- **顶部标题栏**：添加跳转和动画效果，提升视觉体验。
- **主页交互反馈**：在主页时再次点击 Logo 或"所有工具"按钮，页面会轻微抖动，提示用户已在主页。
- **全站 UI 图标升级**：将所有 Emoji 图标替换为 SVG 图标，确保在国产信创系统（麒麟、UOS）上正确显示，不再出现方框或乱码。
- **PDF 扁平化新增页面大小选项**：可选择**原始尺寸**或**统一为 A4**，修复此前扁平化后页面被放大的问题。
- **添加页码支持自定义颜色**：页码颜色可自由指定，满足不同文档的视觉需求。

#### 修复

- 修复 PDF 加密模块因 `userPassword` 与 `ownerPassword` 混淆导致"只设权限密码却要求打开密码"的问题。
- 修复 PDF 解密模块因加载选项格式不兼容 `@cantoo/pdf-lib` 导致报错的问题。
- 修复加密模块打印权限读取方式（由下拉框改为单选按钮）。
- 修复从其他模块返回主页时错误触发抖动的问题。
- 修复**页面重排、页面旋转·批量、页面旋转·逐页**这 3 个模块中，点击图片放大镜后不显示大图的 Bug。
- 修复 **PDF 扁平化**模块处理后页面大小改变的问题（页面尺寸被错误使用为渲染像素尺寸）。
- 修复 **PDF 压缩**模块压缩后页面大小改变的同类问题。
- 修复添加页码模块预览与实际生成时颜色不一致的问题。

#### 文字与交互改进

- 将界面中的"上传 PDF"统一改为"打开本地 PDF"，"下载"改为"保存"，避免用户误以为文件需要上传到服务器，进一步强化**纯离线、零上传**的产品定位。

#### 依赖更新

- **替换 `pdf-lib.min.js` 为 `@cantoo/pdf-lib`**：新增文档加密/解密、带密码加载已加密 PDF、SVG 绘制等能力，并持续合并原 pdf-lib 的 PR 和 bug 修复，兼容性更佳。



### [V6.0 · 35 项版] - 2026-08-06

#### 新增（在 V5.0 基础上扩展至 35 项）
- 📄 **生成空白 PDF**：按指定页数 / 尺寸生成纯空白 PDF，便于拼接占位。
- 📄 **补齐空白页**：批量补齐，使每个文档页数达到指定值（如装订对齐）。
- ✂️ **裁剪白边**：自动检测并裁掉页面四周的空白边距，输出紧凑版 PDF（可设留白阈值与边距）。
- 📏 **统一页面大小**：将不同尺寸的页面统一为同一页面尺寸（A4 / 自定义）。
- 🪪 **删除书签**：一键移除 PDF 大纲（书签树），不改变页面内容。
- 🔢 **Bates 编页**：按法律文书惯例为每页添加连续 Bates 编号（前缀 + 编号 + 后缀）。
- 🪡 **扇形骑缝章**：沿订口生成沿中缝分布的扇形骑缝章效果，常用于合同骑缝防伪。
- 📄 **PDF 扁平化**：将表单字段、注释、图层合并为静态内容，防止被二次编辑。
- 🖨️ **模拟扫描件**：将清晰 PDF 处理成类似真实扫描件的效果（噪点 / 模糊 / 阴影等），用于演示或脱敏。
- 🖊️ **批注**：在 PDF 上添加高亮、下划线、文本框等批注。
- 🧭 **倾斜校正（Deskew）**：自动或手动检测页面倾斜角度（±10° 内投影直方图法自动搜索，或 0.1° 步进手动微调），校正后自动裁剪黑/白边并居中。
- 🟦 **工程蓝图**：将任意 PDF 转换为蓝图风格（蓝底白线），支持彩色扫描件、灰度图纸、黑白线条图自动适配。可调节背景蓝深度和线条亮度，可选锐化增强模糊图纸清晰度，右侧实时预览所见即所得。转换后文件为纯图像，文字不可选中/搜索。


#### 优化
- 界面细节与样式微调（阴影、圆角、过渡曲线），并新增 `prefers-reduced-motion` 降低动效支持。
- **PDF 压缩支持保留原书签**：压缩后自动重建完整大纲树，支持多级嵌套书签，点击目录可跳转到对应页面。使用底层 PDF 对象构建，兼容所有 pdf‑lib 版本及 Acrobat、Chrome 等主流阅读器，已通过 Acrobat 兼容性专项验证
- **PDF 压缩保留书签样式**：压缩模块重建大纲时，现已同步保留书签的**颜色、加粗、斜体**样式，与重建大纲模块一致
- **图片转 PDF 支持混合上传**：可同时选择图片与 PDF，上传的 PDF 会自动**逐页展开**并插入到预览列表（按选择顺序排列），与图片统一拼合输出
- 常规拆分「多组范围」改为多行文本输入框，每行一组页码范围，操作更直观
- 蓝图晒印新增分辨率选项（最高 12× / 864 DPI），满足工程打印需求
- 图片转 PDF 文件名排序改为**自然顺序**（如 `1,2,…,10,11,12` 而非字典序 `1,10,11,12,2,…`），升序/降序更准确
- **修复 PDF 转图片中文（含数字）不显示的问题**：此前离线环境下 CID 字体（如 12306 电子发票）因 CMap 解析失败导致整段文字丢失。现内置 `cmaps-data.js`（169KB，含 `UniGB-UCS2-H`、`Adobe-GB1-UCS2`、`GBK-EUC-H`、`GBK2K-H`、`GBKp-EUC-H` 5 个简体横向核心 CMap），并通过自定义 `CMapReaderFactory` 配合 `useWorkerFetch: false`，由主线程直接读取内嵌 CMap 数据，彻底实现离线中文渲染，无需联网
- 内存与性能优化（针对大文件场景）：
  - 提取图片模块重新加载时自动释放上次的 ObjectURL，避免连续处理多文件内存累积
  - PDF 转图片改为按需重渲染，不再常驻全部全分辨率 Canvas，几百页大文件内存大幅下降
  - 大文件加载去掉冗余的 ArrayBuffer 复制，峰值内存减半
- 多项界面细节调整：头部跨平台提示优化、导航栏自适应、按钮样式统一等


#### 修复
- 修复常规合并模块加载损坏 PDF 时静默失败的问题，增加错误文件提示弹窗
- 修复按书签拆分/炸开模块无法识别具名目标（字符串 dest）书签页码的问题
- 修复图片水印模块输出 PDF 时透明度丢失及旋转时图片变形的问题
- 修复提取图片模块因兼容性语法导致部分浏览器无法显示图片的问题
- 修复页面拼版、添加图章等多个模块的细节错误
- 修复页码范围输入的容错问题：非法格式（如 `5-`、`-3`、`1-2-3`）、多余/连续逗号（如 `1,,5`）、非数字或小数页码均会**弹窗提示**要求重新输入；已支持全角逗号 `，` 自动转半角
- 修复图片转 PDF 预览中长图遮挡文件名的问题，文件名现固定显示在每张图片下方、始终可见
- 倾斜校正模块修复若干运行期问题：修复 `fileToArrayBuffer` 未定义、`buf` 变量作用域错误、`getImageData` 性能提示（`willReadFrequently`）；参考线改为覆盖整个预览框并可调粗细；自动检测与「立即校正」拆分为两步操作
- 修复若干模块体验细节与样式问题，持续提升稳定性
- **拆分对开页稳定性修复**：分割线拖到页面边缘（比例接近 0 或 1）时，切割出的某一半宽/高为 0，原代码会因 `canvas.toBlob` 返回 `null`（导致 `seg.blob.arrayBuffer()` 报错）或 `drawImage(0)` 抛异常而崩溃。现改为在**源头拦截 0 尺寸子画布**（不进入裁剪、也不 clamp 成 1px 废页），边界处自动跳过该半页；循环内保留 `null` 兜底，彻底避免崩溃



### [V5.0] - 2026-07-23

#### 新增
- **📝 文档信息**：查看和修改 PDF 的标题、作者、主题、关键词等元数据，支持一键清空，不改变文件内容和排版。
- **💥 按书签炸开**：将 PDF 中所有书签（不论层级）拆分为独立文件，支持自定义文件名规则（原文件名前缀、书签名、保留层级、同名自动编号）。
- **🔃 页面旋转 · 逐页**：上传 PDF 后以缩略图形式展示所有页面，在缩略图上直接点击旋转按钮，每页独立选择旋转方向，实时预览效果。
- **💮 添加图章**：上传图章图片，手动拖动定位到页面任意位置，支持设置图章宽度、透明度和旋转角度，每页独立记忆位置。
- **📐 页面拼版**：将多页 PDF 合并到一页上，支持自定义拼版行列数（如 2×2）和排列顺序（横向优先 / 纵向优先）。
- **🖼️ 图片水印**（与文字水印独立）：上传 PNG/JPG 图片作为水印，支持手动拖动和平铺，可调缩放、透明度和旋转角度。
- **📸 提取图片**：从 PDF 中提取所有嵌入的位图，支持单张下载或打包为 ZIP。
- **🎨 页面滤镜**：对扫描件进行灰度、黑白二值化、锐化、反相、亮度/对比度调整，多种滤镜可叠加使用，增强清晰度。

#### 修复
- 修复交替合并支持多个文件轮流穿插时清空按钮报错的问题
- 修复发票类 PDF 转图片时部分文字（如印章、表单文本）丢失的问题（增加 `annotationMode: ENABLE` 渲染注释层）
- 修复常规拆分"页码范围"模式下载格式不正确的问题
- 修复图片转PDF模块图片上传后顺序随机的问题，新增拖拽排序和批量移动
- 修复添加水印时图片旋转角度与预览不一致的问题

#### 优化
- **界面全新改版**：新增"所有工具"主页，按功能分类（页面操作、格式转换、增强功能）展示卡片，点击卡片进入功能模块，顶部导航栏动态切换
- **图片转PDF全面升级**：新增按文件名升序/降序排列；新增自定义页边距（上/下/左/右）和居中选项，支持一键设为0边距或国标边距；新增缩略图旋转按钮（逆时针90°、顺时针90°、旋转180°）；新增大图预览功能
- **常规拆分新增多组范围**：支持用竖线 `|` 分隔多组范围（如 `1,2|3-5|6`），一次拆分出多个文件并打包为 ZIP
- **页面重排新增大图预览**：点击缩略图右上角放大镜，弹出高清大图，支持键盘 ← → 翻页、Esc 关闭
- **页面旋转新增预览**：上传 PDF 后自动显示所有页面的缩略图，支持大图预览和键盘翻页
- **添加页码增加起始页码**：支持从任意数字开始编号
- **文字水印/图片水印支持手动拖动**：在预览画布上拖动水印即可调整位置，所见即所得
- 全角逗号自动转换覆盖更多输入场景
- 各模块增加简洁的功能说明

### [V4.0] - 2026-07-12
- **新增**：页面倒序、添加页码、添加水印、PDF解密
- **修复**：元数据丢失、keywords 类型错误、空白页报错、图片顺序随机等问题
- **优化**：拖拽排序、批量移动、快捷键、界面布局等

### [V3.0] - 2026-07-09
- **新增**：按书签拆分、PDF 压缩
- **优化**：3 个 HTML 合并为 1 个、拆分下载改为 ZIP 打包、界面全新改版

### [V1.0] - 2026-06-11
- 首次发布：合并、拆分、旋转、删除、PDF转图片、图片转PDF、页面重排、拆分对开页、交替合并

---

## 🗂️ 功能总览

| 分类           | 数量   | 代表功能                                       |
| -------------- | ------ | ---------------------------------------------- |
| 一、页面管理   | 10     | 合并、拆分、重排、倒序、删页、删空白页         |
| 二、页面调整   | 10     | 旋转、拼版、小册子、对开页、倾斜校正、裁剪白边 |
| 三、格式转换   | 3      | PDF 转图片、图片转 PDF、提取文本               |
| 四、图像处理   | 5      | 扁平化、提取图片、滤镜、工程蓝图、模拟扫描     |
| 五、标注与编号 | 7      | 页码、Bates、水印、图章、骑缝章、批注          |
| 六、安全与信息 | 7      | 元数据、CA 签章、书签、压缩、加密、解密        |
| **合计**       | **42** | —                                              |

---

## 📂 一、页面管理（10 项）

### 🔗 1. 常规合并

多个 PDF 合并为一个，列表可拖拽调顺序。支持图片与 PDF 混合合并（图片按顺序等比缩放居中放入 A4）；勾选「发票模式」后逐文件检测，对 pdf-lib 复制后内容会丢失的特殊 PDF（如京东发票）自动转为图片合并，正常文件仍保留矢量文字。

### 🔀 2. 交替合并

两个及以上文件按 A-B-C-… 轮流穿插，适合双面扫描件、正反面材料合成。

### ✂️ 3. 常规拆分

五种拆法：按页码范围、按固定页数、拆成单页、奇偶页拆分、多组范围（多行文本，一行一组）。非法页码格式会弹窗提示，全角逗号自动转半角。

### 📑 4. 按书签拆分

读取 PDF 大纲，勾选需要的章节，按层级拆成多个文件；兼容具名目标（字符串 dest）书签。

### 💥 5. 按书签炸开

每个书签拆成一个独立文件，可限定最大拆分层级（1 = 一级书签，2 = 二级）；可选序号命名，位数按书签总数自动补零，保证按顺序排列。

### 📚 6. 页面重排

缩略图拖拽排序，支持拖入空白页，排序后导出新 PDF。

### 🔃 7. 页面倒序

一键反转整本页面顺序。

### 📄 8. 补齐空白页

批量补齐，使每个文档页数达到指定值（如装订对齐、双面打印凑偶数）。

### 🗑️ 9. 删除页面

按页码移除指定页面，其余页面顺序不变。

### 🗑️ 10. 自动删空白页

按「非白色像素比例」检测疑似空白页，阈值可调（越低越严格），仅预览检测到的空白页供确认，可全选 / 反选，一键删除并另存；书签保留（页码不重新映射）。

---

## 📐 二、页面调整（10 项）

### 🔄 11. 页面旋转 · 批量

按页码范围统一旋转 90° / 180° / 270°，适合整章扫描方向错误的情况。

### ↩️ 12. 页面旋转 · 逐页

逐页缩略图独立选择角度，完成后另存。

### 📚 13. 页面拼版

2 合 1 / 4 合 1 / 9 合 1，把多页缩排到一张纸上；「不足处理」与「边距」分两组设置，适合打印省纸。

### 📖 14. 小册子排版

按骑马订顺序重排页面，双面打印后对折装订即成小册子。

### 📖 15. 小册子拆分

把骑马订装订的 A3 扫描件（一张图含并排两页）切成单页并按正确页码重排；支持自动检测切分方向（横图左右切、竖图上下切），扫描图可拖拽排序、逐页旋转。

### 📏 16. 统一页面大小

把不同尺寸的页面统一为 A4 / A3 / 自定义尺寸；文字与矢量页面走矢量嵌入后按目标尺寸绘制，文字仍可选中搜索。

### 📖 17. 拆分对开页

沿页面中线切开对开扫描页，支持 1~3 刀，每页可独立设置切割位置并拖动微调，可「应用到全部页」。

### 🧭 18. 倾斜校正

自动检测倾斜角度（±10° 内投影直方图搜索）或 0.1° 步进手动微调；校正后自动裁掉黑 / 白边并居中。

### 🔲 19. 裁剪白边

自动检测并裁掉页面四周空白。两种裁剪方式：

- **矢量裁剪**（默认）：只改页面的 CropBox，打开看到的就是裁好的页面，文字可选中 / 搜索，体积几乎不变（被裁掉的数据仍在文件里）；
- **栅格化裁剪**：整页转图片，连数据一起删除，文字不可搜索。

可设白色容差、四周微调（毫米数字框 + 滑块 + 拖动预览三向同步），输出尺寸支持「自动贴合内容 / 四周加页边距 / 固定页面尺寸」。

### 📄 20. 生成空白 PDF

按指定页数、纸张尺寸生成纯空白 PDF，可选格线、页眉页脚，便于拼接占位。

---

## 🖼️ 三、格式转换（3 项）

### 🖼️ 21. PDF 转图片

逐页导出 PNG / JPG，可选分辨率（含高清档），支持单页另存或批量打包 ZIP；内置 CMap，离线也能正确渲染中文（含发票类 CID 字体）。

### 🧩 22. 图片转 PDF

多张图片按自然顺序（1,2,…,10,11 而非字典序）合成 A4 文档，支持 JPG / PNG / **多页 TIFF**（逐页展开，等比缩放居中放入 A4），也可混合上传 PDF 并逐页展开后统一拼合。

### 📄 23. PDF 提取文本

从文字层提取内容并导出 TXT，按坐标还原换行；页间可插入「第 N 页」标题行 / 分隔线 / 不插入，可保留段落或整段拼接；支持复制全文与保存 UTF-8 TXT。扫描件无文字层，结果为空。

---

## 🎨 四、图像处理（5 项）

### 📐 24. PDF 扁平化

把表单字段、注释、图层压成静态内容，防止二次编辑；页面大小可选原始尺寸或统一 A4，书签保留。

### 📸 25. 提取图片

自动扫描所有页面中的嵌入图片（照片、图章、Logo 等），以缩略图网格预览；可单张下载，也可打包 ZIP 批量下载。仅支持位图（JPEG / PNG），矢量图形无法提取。

### 🎨 26. 页面滤镜

黑白、锐化、反相，用于增强模糊扫描件；导出清晰度与原文件一致。

### 🟦 27. 工程蓝图

把任意 PDF 转成蓝底白线的蓝图效果，可调背景蓝深度与线条亮度，可选锐化，分辨率最高 12×（864 DPI）。输出为纯图像，文字不可选中。

### 🖨️ 28. 模拟扫描件

给清晰 PDF 加上随机旋转、黑边、底色、噪点，模拟真实扫描件效果；旋转角度以「最大偏离幅度」统一控制（-2°~2°，默认 0.3°），预览与导出完全一致。

---

## 🔖 五、标注与编号（7 项）

### 🔢 29. 添加页码

自定义位置、字体大小、样式、起始页、颜色、是否加粗；支持「从第 X 页开始编号」（封面不编号）与奇偶页左右翻转，预览与导出一致。

### ⚖️ 30. Bates 编页

按法律文书惯例添加「前缀 + 连续编号 + 后缀」，可跨文件连续编号，支持 `/Rotate` 页面正确落位。

### 💧 31. 文字水印

自定义内容、角度、透明度、字号、颜色，可平铺；支持在预览上手动拖动定位，每页按自身实际尺寸定位。

### 🖼️ 32. 图片水印

使用本地图片作水印，可调透明度、旋转、缩放、平铺，手动拖动定位；旋转与混排尺寸问题已修复。

### 💮 33. 添加图章

在每页独立调整图章位置与大小，支持常规 / 正片叠底 / 变暗三种混合模式。导出时有两个并列出口：**「保存为可编辑PDF」**保留原有文字层与矢量内容，图章作为独立对象叠加，可在专业软件中移动 / 删除；**「导出不可编辑PDF」**把盖章页栅格化后重建（扫描页按原图像素、矢量页按 300dpi），图章成为页面像素，无法单独移除。

### 🔻 34. 扇形骑缝章

沿订口生成扇形分布的骑缝章效果，常用于合同防伪；切片坐标取整并关闭平滑，避免边缘黑线。导出与添加图章一致，两种出口并列：**「保存为可编辑PDF」**保留原文字层与书签，骑缝章作为独立图片叠加；**「导出不可编辑PDF」**整页栅格化重建，印章成为页面像素，无法单独移除。

### ✍️ 35. 批注

高亮、下划线、文本框、便签、圆形 / 椭圆 / 圆角矩形 / 填充框标记；边框色与填充色独立设置，填充透明度可调，图形带拖拽手柄。

---

## 🛡️ 六、安全与信息（7 项）

### 📝 36. 文档信息

修改标题、作者、主题、关键词等元数据；单个字段清空也能正确保存。

### 🔏 37. CA 签章查看

打开带数字签名的 PDF，列出所有签名域（名称、页码、外观），并在页面上用红框标出签名位置；多页时左侧带导航。

### 📑 38. 添加 / 编辑书签

- 打开即读入原大纲，左侧树形展示，右侧预览当前页；
- 新增 / 删除 / 双击改名，设定目标页与颜色（颜色写入 PDF，Acrobat 中显示为彩色书签）；
- 上移 / 下移调同级顺序，「设为子项 / 提升一级」调层级；
- 支持按标题搜索、撤销 / 重做（60 步）、导出 / 导入书签 JSON；
- 保存生成「原名-书签.pdf」，原文件不变。

### 🚫 39. 删除书签

一键移除 PDF 大纲（书签树），页面内容不变。

### 🗜️ 40. PDF 压缩

预设档位或指定目标体积，程序自动迭代寻找在体积达标前提下画质最好的参数；压缩后自动重建完整大纲树，并保留书签颜色、加粗、斜体。

### 🔓 41. PDF 解密

去除打开密码或权限限制；解密后保留原始矢量文字、书签与元数据，体积几乎不变，不再逐页光栅化。会识别「未加密 / 仅权限限制」状态。

### 🔐 42. PDF 加密

添加打开密码与权限密码，可限制打印、复制、编辑、注释；加密后内容与排版不变，使用 `useObjectStreams: false` 保证最大兼容性。

---

## 🗂️ 文件说明

| 文件                                         | 作用                                                         | 是否必需                                |
| -------------------------------------------- | ------------------------------------------------------------ | --------------------------------------- |
| `离线PDF工具箱V7.2-42项功能-界面优化版.html` | 主程序，双击即可运行                                         | ✅ 必需                                  |
| `pdf.min.js`                                 | pdf.js 主库，负责解析与渲染                                  | ✅ 必需                                  |
| `pdf.worker.min.js`                          | pdf.js Worker                                                | ✅ 必需                                  |
| `cmaps-data.js`                              | 内嵌全套 CMap 数据（168 个编码表，约 1.6MB），保证未嵌入字体的 PDF 正常显示与提取 | ✅ 必需                                  |
| `pdf-lib.min.js`                             | `@cantoo/pdf-lib`，负责写入、加密解密、SVG 绘制              | ✅ 必需                                  |
| `jszip.min.js`                               | 批量导出打包 ZIP                                             | ✅ 必需                                  |
| `tiff.min.js`                                | TIFF 解码（UTIF + pako + canvas 封装，暴露 `window.TIFFKit`） | ✅ 必需（图片转 PDF / 合并用到 TIFF 时） |

> 

---

## 🚀 如何使用

1. 下载本仓库的所有文件（HTML 与同目录的 JS 依赖）
2. 双击 HTML 文件，用浏览器打开即可使用。

**无需联网，无需安装，打开即用。**

> OFD 转换引擎（`ofd-vendor.js`，约 2.8MB）只在第一次做 OFD 转换时加载，不转换不影响启动速度。

---

## 🛠️ 技术栈

| 库 | 用途 |
|:---|:---|
| [@cantoo/pdf-lib](https://github.com/cantoo-scribe/pdf-lib) | PDF 文档创建与编辑（含加密/解密/SVG 绘制） |
| [pdf.js](https://github.com/mozilla/pdf.js) | PDF 页面渲染与预览 |
| [JSZip](https://github.com/Stuk/jszip) | 批量文件打包下载 |
| [UTIF.js](https://github.com/photopea/UTIF.js) + pako | TIFF 解码（多页 TIFF 转 PDF） |
| OFD 引擎（pdf.js 6.4 + jsofd + EasyOFD） | PDF ↔ OFD 双向转换 |
| [Twemoji](https://github.com/twitter/twemoji) | SVG 图标 |
| 原生 HTML/CSS/JavaScript | 零框架，极致轻量，兼容旧版浏览器 |

---

## 📱 兼容性

*   ✅ 现代浏览器：Chrome、Edge、Firefox、Safari
*   ✅ 国产系统：麒麟（ARM架构）、UOS
*   ✅ 移动端：安卓、iOS 浏览器


---

## 🤝 致谢

感谢 52破解论坛和微信公众号"相声的技术备忘录"各位网友的热情反馈和建议！

特别感谢以下网友的功能建议：

*   江苏网友：奇偶页拆分
*   山东网友：交替合并
*   广东网友：对开页切分
*   海南网友：页面倒序
*   [gitca233](https://github.com/gitca233/offline-pdf-tools)：CA 签章查看模块
*   多位网友：添加页码、水印、图章、压缩、解密、OFD 转换……

你们的一点一滴，让这个工具箱越来越好用！

---

## 📄 开源协议

本工具箱的原创代码（HTML/JS）采用 **MIT License** 开源，详见 [LICENSE](LICENSE) 文件。

所依赖的第三方库遵循各自的协议：
- `pdf.js`（含 `pdf.worker.min.js`）：Apache License 2.0
- `@cantoo/pdf-lib`：MIT License
- `JSZip`：MIT License 或 GPLv3 双协议
- `UTIF.js`：MIT License
- `Twemoji`：CC-BY 4.0
- `jsofd` / `EasyOFD`：遵循各自仓库的开源协议（详见依赖仓库）

---

## ⭐ 如果觉得有用

欢迎点个 **Star** 支持一下！有功能建议或使用问题，可以提 Issue，我看到后会第一时间回复。

> 宠粉，我是认真的。

