PDF 操作完全指南
合并、拆分、压缩、旋转、水印、加密、页码、转图片……PDF 的日常操作其实有章可循。本页按「做什么、什么时候用、要注意什么」梳理 14 类操作,并给出 A 系列页面尺寸在各 DPI 下的像素对照,方便你一次选对处理方式。
原理解析
PDF(便携式文档格式)把文字、字体、矢量图、图像封装成「固定版式」文件,在任何设备打开都保持排版一致——这是它与 Word 等流式文档最本质的区别。
PDF 内部由对象(页面/字体/内容流)加交叉引用表组成;文本型 PDF 可选中复制,而扫描型 PDF 本质是图片、需 OCR 才能提取文字。它适合合同、报表、电子书等「所见即所得」的场景。
什么时候该查这张表
这张表在你要对 PDF 做合并、拆分、加密、压缩、加水印等操作时有用。它列出常见操作各自做什么、典型场景与注意事项。选工具前先确认你的 PDF 属于哪一类 —— 扫描件与电子件的处理路径完全不同。
不该查的情况:你在做 PDF 的底层实现(解析器、流对象、字体嵌入)或设计电子文档系统。本表覆盖的是日常对已有 PDF 的处理操作,不含 PDF 规范的实现细节。
判断标准:先分清电子件与扫描件。电子件有真实的文字层,可直接复制、搜索、编辑;扫描件本质是图片,文字层是 OCR 猜出来的,搜索会漏字、编辑会破坏。要做内容编辑必须先 OCR,而 OCR 的质量决定了后续所有操作的上限。
特别注意:PDF 的加密分为打开密码(owner password,要密码才能打开)与权限密码(user password,限制打印复制但不需要密码就能打开)。「文档打不开」和「文档能开但不能复制」是两个完全不同的问题,排查时先分清是哪一种。
边界与常见陷阱
扫描件直接做文字操作会得到难以察觉的错误结果
扫描件的「文字层」是 OCR 识别出来的,准确率通常 85%–98%,且错误集中在低频字符、标点与数字上。后果:搜索「lO1」找不到本该命中的「101」;把 OCR 结果复制出来做数据处理会得到错乱的编号。实务建议:先 OCR 并人工抽查关键字段(金额、编号、日期),确认准确率后再做批量操作;如果只是归档检索,用图像级搜索工具而不是依赖文字层。
压缩 PDF 时图片是主要体积来源,文字几乎不占空间
一个 20MB 的扫描 PDF 里可能 19MB 都是图片,文字层只占几十 KB。用「压缩文档」把字体与结构压一遍,体积几乎不变。有效做法是重新压缩内嵌图片:用工具把 300dpi 降到 150dpi、或用有损 JPEG 替代 PNG,体积能降 60%–80% 而肉眼几乎看不出差别。注意选「图像压缩」而不是「文档压缩」,很多工具的默认选项只做后者。
合并与拆分会破坏书签与内部链接
用简单工具合并多个 PDF 时,原文档的书签目录、章节跳转、表单域值、以及指向文内其他位置的链接都会丢失或错乱 —— 合并后书签可能指向错误的页码。稳妥做法:用支持结构化操作的工具(保留 outline),合并后务必逐个检查书签与链接;如果文档有交叉引用(互链),建议放弃合并,改为在网页或文档管理系统里提供多个独立 PDF 加索引。
与相邻内容的分工
要直接对 PDF 做上述操作,用站内 PDF 相关工具;本页是方法选择与风险提示。
要理解 PDF/A、无障碍 PDF(Tagged PDF)等规范要求,属文档标准范畴,本表不覆盖。
要处理扫描件 OCR,涉及语言模型与后处理策略,属独立技术课题。
若目的是排查某个 PDF 操作失败,先确认它是电子件还是扫描件,以及加密类型是打开密码还是权限密码。
实战片段
要点:① 先分清电子件与扫描件 —— 扫描件的文字层是 OCR 猜的,准确率 85%–98%,搜索会漏字、复制出来的编号会错乱,任何内容编辑都必须先 OCR 并人工抽查金额与编号;② 压缩 PDF 要压图片(300dpi→150dpi、PNG→有损 JPEG,可降 60–80%)而不是压文档结构,图片占了扫描件 95% 的体积;③ 加密分「打开密码」与「权限密码」两种,「打不开」和「能开不能复制」是不同问题;④ 合并与拆分会破坏书签与内部链接,合并后必须逐个校验书签页码,越界说明映射错了。
// ① 判断 PDF 类型:是扫描件还是电子件
// 扫描件几乎没有可提取的文字对象
async function pdfKind(file) {
const buf = new Uint8Array(await file.arrayBuffer())
const text = new TextDecoder('latin1').decode(buf)
const hasFont = //Font/.test(text)
const hasImage = //Subtypes*/Image/.test(text)
const pageCount = (text.match(//Types*/Page[^s]/g) || []).length
// 有 Image 但无 Font ⇒ 大概率是扫描件(图片 + 极少的 OCR 文字层)
return { pageCount, hasFont, hasImage, likelyScanned: hasImage && !hasFont }
}
// ② 压缩:压图片而不是压文档结构
// ✅ 有效:300dpi → 150dpi,PNG → 有损 JPEG(体积降 60–80%)
// ❌ 无效:只做 "compress document"(字体与结构本来就只占几十 KB)
const COMPRESS_OPTIONS = {
imageDpi: 150, // 300 → 150,文字型 PDF 可再降到 100
jpegQuality: 0.75, // 0.6–0.8 之间肉眼几乎无差
removeMetadata: true, // 元数据通常只占几 KB
// ❌ 不要启用 "optimize for web" 之类会降文字清晰度的选项
}
// ③ 加密分两种,问题不同
// 打开密码:不给就打不开
function encryptWithOpenPassword(doc, pwd) {
return { userPassword: pwd, ownerPassword: pwd, allowPrint: true, allowCopy: false }
}
// 权限密码:不给也能打开,但限制操作
function encryptWithPermissions(doc) {
return { userPassword: '', ownerPassword: '', allowPrint: false, allowCopy: false }
}
// 排查「打不开」还是「不能复制」,先分清是哪一种
// ④ 合并:结构化操作 + 合并后校验书签
async function mergeSafely(files) {
const merged = await mergePreservingOutline(files)
// 🔴 书签可能指向错误的页码 ⇒ 合并后必须逐个检查
const outline = await readOutline(merged)
const pageCount = await countPages(merged)
const broken = outline.filter(item => item.page > pageCount)
if (broken.length) {
console.warn('书签越界:', broken) // 越界说明页码映射错了
}
return { doc: merged, brokenBookmarks: broken.length }
}
// ⑤ 扫描件:OCR 后抽查关键字段再批量处理
const CRITICAL_FIELDS = ['amount', 'invoice_no', 'date'] // 金额/编号/日期
function shouldSpotCheck(text) {
return CRITICAL_FIELDS.some(f => text.includes(f))
}
// OCR 准确率通常 85–98%,错误集中在低频字符、标点与数字上实践注解
- PDF 的「压缩」与「减小体积」不是同一件事有损压缩图片能显著减小体积但会降低清晰度;清理冗余对象与去重字体则是无损的,收益取决于文件结构。面向打印的场景不能随意压图,应先判断用途再选手段。
- 合并前必须统一页面尺寸与方向A4 与 Letter 混排时,合并后会出现内容被裁切或留白不均。多数库默认以第一页为基准,其它页按原尺寸贴入,因此需要在合并前统一到同一尺寸或显式缩放。
- 加密与权限是两个独立设置PDF 的「打开口令」控制能否打开,「权限口令」控制能否复制/打印/编辑。只设权限口令的文件可以被大量阅读器忽略限制,真正的机密文件必须设打开口令。
数据来源
- ISO 32000-2 (PDF 2.0)
- PDF Association technical notes
上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。
14 类常见 PDF 操作对照
| 操作 | 做什么 | 典型场景 | 注意 |
|---|---|---|---|
| 合并 | 把多个 PDF 按顺序拼接成一个 | 合同附件、报告合集、发票归档 | 顺序即最终页码顺序,建议先统一页面尺寸 |
| 拆分 | 按页码范围或每页拆成多个文件 | 分发单页回执、拆开扫描件 | 按范围拆分时页码从 1 开始计数 |
| 压缩 | 重采样图片、清理冗余对象以减小体积 | 邮件附件超限、网页下载提速 | 已是矢量文本为主的 PDF 压缩空间很小 |
| 旋转 | 整页旋转 90/180/270 度 | 修正手机扫描的横躺页面 | 只改页面显示矩阵,不重排文字方向 |
| 水印 | 叠加半透明文字或图片 | 标注草稿、内部件、版权声明 | 水印可移除,不能替代权限控制 |
| 加密 | 设置打开口令与权限口令 | 含个人信息的对账单、工资单 | AES-256 才可靠,RC4 已被认为不安全 |
| 解密 | 在已知口令时移除打开限制 | 批量归档前解除自己的口令 | 仅能处理你有合法权限的文件 |
| 页码 | 批量添加页脚页码或「第 N 页 / 共 M 页」 | 标书、论文、打印稿 | 注意与封面、目录的起始页偏移 |
| 删除页 | 移除指定页并重新编号 | 剔除空白扫描页、错误页 | 删除前先确认页码,操作不可撤销 |
| 重排页 | 拖拽调整页面顺序 | 插入漏扫页、调整章节顺序 | 与合并、删除配合可完成整套整理 |
| 提取 | 抽取文本、图片或指定页 | 从合同里复制条款、导出配图 | 扫描件需先 OCR 才有文本层 |
| 转图片 | 按 DPI 把每页渲染为 PNG/JPEG | 插入 PPT、网页预览、做缩略图 | 72 DPI 够屏幕看,印刷建议 300 DPI |
| 裁剪 | 裁掉页边空白或指定区域 | 去掉扫描黑边、统一版心 | PDF 裁剪通常只隐藏内容,不立即丢弃 |
| 签名 | 添加手写或图片签名,含数字签名校验 | 合同回签、验收单 | 图片签名不等于数字签名,后者才可验真 |
常用页面尺寸与像素对照
PDF 内部使用 72 DPI 的 PDF 点作为单位,所以 A4 在未缩放时是 595 × 842 点。下表列出导出位图时常用的三种分辨率。
| 幅面 | 毫米 | 英寸 | 72 DPI | 96 DPI | 300 DPI |
|---|---|---|---|---|---|
| A4 | 210 × 297 | 8.27 × 11.69 | 595 × 842 | 794 × 1123 | 2480 × 3508 |
| A5 | 148 × 210 | 5.83 × 8.27 | 420 × 595 | 559 × 794 | 1748 × 2480 |
| A3 | 297 × 420 | 11.69 × 16.54 | 842 × 1191 | 1123 × 1587 | 3508 × 4961 |
| B5 | 176 × 250 | 6.93 × 9.84 | 499 × 709 | 665 × 945 | 2079 × 2953 |
| Letter | 216 × 279 | 8.5 × 11 | 612 × 792 | 816 × 1056 | 2550 × 3300 |
| Legal | 216 × 356 | 8.5 × 14 | 612 × 1008 | 816 × 1344 | 2550 × 4200 |
常见问题
PDF 压缩为什么有时几乎没变小?
PDF 的体积主要由内嵌图片、字体和扫描位图构成。如果文件本来就是矢量文本加少量图片,压缩空间自然很小;真正的大头通常是整页扫描图。这种情况要压下来,要么降低扫描 DPI 重新导出,要么选择针对图像的压缩,代价是清晰度下降。
PDF 转图片应该选多少 DPI?
屏幕阅读、PPT 插入或网页预览用 96–150 DPI 就足够;需要看清小字或二次排版用 200 DPI;送印刷才需要 300 DPI。DPI 翻倍,像素宽高也翻倍,文件体积大约增长到四倍,所以不要一味选最高值。
PDF 加密能防止别人复制内容吗?
只能防君子。打开口令(用户口令)确实能阻止不知道密码的人查看,但权限口令(所有者口令)只设置了一个标志位,多数阅读器会遵守,也有工具可以直接忽略。真正机密的内容不要依赖 PDF 权限位来控制。
什么是 PDF/A,和普通 PDF 有什么区别?
PDF/A 是面向长期归档的子标准。它要求字体全部嵌入、禁止加密和 JavaScript、去掉对外部资源的依赖,从而保证十几年后仍能正确渲染。普通 PDF 追求编辑和交互灵活,PDF/A 追求稳定可重现,档案、票据、合同存档场景通常要求 PDF/A。