免费在线PDF页面编辑器

删除不需要的页面并重新排序PDF的页面顺序。100%客户端 · 您的文件保持私密。

您的文件永不离开您的设备
将PDF拖到此处 或点击浏览

支持PDF文件 · 最大50 MB

本编辑器到底做什么

PDF 页面编辑器在 PDF 文档的结构层面工作(它操作整页的顺序、有无和方向,而不触碰任何单页的渲染内容。你把一份 PDF 拖入编辑器,工具解析它的页面树,并为每一页显示一张卡片,标注页码与尺寸;你勾选要删除的页,拖动或按方向键重新排序,然后下载修改后的 PDF。磁盘上的原文件永远不会被修改)编辑后的版本是一份新的下载。每一项操作都通过 JavaScript 在你的浏览器里运行,由 pdf-lib 库(Andrew Dillon 的纯 JavaScript PDF 读写库,MIT 许可证,GitHub 上为 Hopding/pdf-lib)从一个 CDN 加载提供动力。没有上传、没有服务端处理、没有遥测,你可以在点击“删除选中”和“下载”时打开开发者工具的网络标签页查看,或者在 pdf-lib 加载完成后让页面离线(飞行模式),编辑器仍然能用。最大 50 MB 的文件能从容处理;更大的文件也能用,只是会因浏览器与设备内存不同而花更长时间。

作为格式的 PDF,一段简史

PDF(Portable Document Format)由 Adobe 的联合创始人 John Warnock 创建,源自他 1991 年的内部提案,绰号“Camelot”。第一个公开版本 PDF 1.0 于 1993 年 6 月在纽约的一场发布活动上随 Adobe Acrobat 1.0 一同推出。PDF 当年解决的原始问题是“印刷级保真的可移植性”:拿任何文档,把嵌入字体和精确版式打成一个包,任何操作系统上的任何阅读器都能逐像素重现它。在 Adobe 把规范交给 ISO 之前,PDF 闭源了十五年。PDF 1.7 在 2008 年 7 月成为 ISO 32000-1:2008,这是今天几乎所有仍在流通的 PDF 的核心规范。PDF 2.0 随后以 ISO 32000-2:2017 的身份出炉,2020 年 12 月发布了第二版修订本以澄清歧义。2023 年 4 月,Adobe 发布了一份专利豁免,明确为 PDF 授予了免版税的实施权,扫除了开源读写器的最后一道法律阻力。该格式的结构单元是页面树(/Pages 字典加 /Kids 数组)。像本工具这样的页面编辑器会沿着这棵树走一遍,删除或重排 /Kids 中的条目,然后写出一份新文件,让幸存的页面重新编号。页面内容流本身则原封不动,这就是为什么即便在大文档上操作也很快,以及为什么每一页的视觉内容都被按比特级别地保留。

干这件事的 pdf-lib 库

pdf-lib 是让浏览器端编辑变得可行的纯 JavaScript PDF 库。Andrew Dillon 在 MIT 许可证下发布了它,整个项目以一个单独的 bundle 形式交付,可在任何现代浏览器中运行(基础操作不需要原生依赖,也不需要 WebAssembly。它能端到端地解析、修改和序列化 PDF:读取现有文档、在文档之间复制页面、嵌入 PNG 与 JPEG 图像、用嵌入字体绘制文字、修改表单字段,并把修改后的文档以适合下载的 Uint8Array 形式重新写出。另一种架构)服务器端 PDF 编辑,主导了商业 PDF 工具,因为 PDF 处理在历史上一直很难。Smallpdf、iLovePDF、Sejda、Soda PDF、ILovePDF、PDF24 以及数十家竞争站点都会把你的文件上传到服务器,在后端跑 pdf-lib 或类似工具(或 Ghostscript、qpdf、PDFtk),然后把修改后的文件回传给你。代价是:服务器端能更可靠地应付任意文件大小和复杂操作,但你编辑过的每份文档的每一页,都会在某段时间内活在别人的日志里。借助 pdf-lib 的浏览器端方案,则用 50 MB 的实际上限和略微受限的操作集合,换来了“文件永远不会离开你的设备”。对敏感文档(合同、医疗记录、银行对账单、内部文件)这笔交易是值得的。

这个工具的底层原理

一个 PDF 的页面集合由 ISO 32000-2 标准第 7.7.3 节描述的页面树定义。文档的目录字典里有一个 /Pages 条目,指向页面树的根节点。该根节点带有 /Type /Pages,一个表示其下方叶子页面总数的 /Count 条目,以及一个引用其子节点的 /Kids 数组。子节点要么是叶子页面对象(/Type /Page),要么是更深一层的中间 /Pages 节点。这棵树是平衡的,使阅读器可以在 O(log N) 时间内定位第 N 页,而无需遍历每一片叶子,这就是 500 页文档里随机翻页依然飞快的原因。

你选择 PDF 时,浏览器 File API 把原始字节交给 pdf-lib,由 pdf-lib 解析文档结构,并在内存中表示为对象树。工具调用 pdfDoc.getPageCount() 统计叶子数量,并对每一页迭代 pdfDoc.getPage(i).getWidth()getHeight(),从而生成你看到的卡片网格(页码加上以 PostScript 点为单位的尺寸,1 点等于 1/72 英寸)。勾选复选框或按箭头键只更新一个 JavaScript 数组,该数组追踪保留下来的页面引用及其顺序。原始 PDF 字节在浏览器内存中保持不动,直到你点击下载。

下载时,pdf-lib 通过 copyPages 完成繁重工作。工具调用 PDFDocument.create() 建立一个全新的空文档,再调用 newDoc.copyPages(sourceDoc, indices),其中 indices 是源页面位置的数组,顺序就是它们应在输出里出现的顺序。copyPages 追踪每个请求页面所依赖的每一个对象(嵌入字体、图像 XObject、内容流、注释),把它们复制到新文档中,然后重新生成交叉引用表,使所有字节偏移端到端一致。输出是一个结构上干净的 PDF,与原文逐页渲染完全相同。整个过程中没有任何网络请求。在操作期间打开浏览器开发者工具到 Network 网络标签页,你只会看到 pdf-lib 自身从 CDN 的一次性加载(约 380 KB 压缩后,首次访问后由浏览器缓存)。

什么时候你真的需要一个页面编辑器

竞争格局,浏览器 vs 服务器 vs 原生

三类 PDF 编辑器在争夺同一个用户。原生桌面工具(Adobe Acrobat Pro(业内标杆,月费 19.99 美元订阅)、Foxit PDF Editor、Nitro PDF、PDF Studio、Apple Preview(macOS 内置,对页级编辑出乎意料地能干))安装到你的电脑上,对本地文件离线工作。它们能处理最大的文件和最深的编辑操作,但需要下载安装,并且(商业产品)通常需要付费授权。服务器端的网页工具(Smallpdf(瑞士,2013 年成立)、iLovePDF(西班牙,同样 2013 年)、Sejda(美国)、PDF24(德国)、Soda PDF(加拿大)、Adobe 自家的 Acrobat Online)通过文件上传、在提供商的基础设施上处理、再把文件下载回来这套流程来完成 PDF 操作。它们能扩展到大文件和复杂操作,但每一份文件都得经过别人家的服务器。像本工具这样的浏览器端工具使用 pdf-lib、PDF.js(Mozilla 的 PDF 渲染器,由 Andreas Gal 等人 2011 年起开始编写、如今随 Firefox 一同捆绑)或 pdf-lib-extra 在你的设备上完成全部工作。它们的文件大小限制由浏览器内存决定,但永远看不到你的文件内容。对于含有任何敏感信息的文档做一次性的页面修改,浏览器端选项是合适的形态,选择本质上归结为:“在这份具体文件上,把它上传到服务器的便利,是否值得付出这份隐私代价?”对内部文件的常规工作,几乎总是值得。对合同、财务、医疗记录或任何你不会贴到公开网络上的文档,几乎总是不值得。

本编辑器做什么、不做什么

不在范围内:编辑各页的内容(文字、图像、表单字段)、把一份 PDF 拆成多份文件(请使用专门的 免费 PDF 拆分工具 工具)、把多份PDF 合并为一份(请使用 免费在线 PDF 合并)、压缩页面以减小文件体积(请使用 免费在线 PDF 压缩)、用永久黑条遮蔽敏感内容、给 PDF 做数字签名。这些操作请使用专门的工具或桌面 PDF 编辑器。

常见陷阱及其含义

隐私:文件留在你的设备上

所有云端 PDF 页面编辑器(Smallpdf、iLovePDF、PDF24、Adobe Acrobat Online、Sejda、Soda PDF)都会把你的文件上传到运营商的服务器,在服务器端解析,让你针对服务器渲染的预览图点击删除或拖动缩略图,再把修改后的副本作为下载发回。与普通文件上传相比,这里的隐私含义有一个重要的不同:运营商必然要在你做出任何删除或重排决定之前就读取每一页的内容(来渲染预览和清点识别页面)。即便你改变主意永远不下载结果,运营商也已经看过内容。主要服务商发布的隐私政策都承诺在数小时内删除并使用 TLS 加密传输,而且他们有强烈的商业动机去遵守这些政策,但「数小时内删除」不等于「从未见过」。PDF 经常包含医疗记录、银行对账单、签署的合同、身份证件、公司内部备忘和法律文件草稿;对这些文件,政策上的区别才有意义。

本编辑器不上传任何内容。pdf-lib 在你的浏览器标签页里运行,通过 File API 接收文件字节,再把修改后的字节以 Blob 形式返回到同一个标签页变成下载。你可以亲自验证:在点击「下载修改后的 PDF」之前打开浏览器开发者工具到 Network 网络标签页,执行操作,然后观察没有任何包含你文件内容的请求发出。唯一的网络流量是首次访问时一次性从 CDN 获取 pdf-lib(约 380 KB 压缩后),获取一次之后就坐在浏览器缓存里。页面加载完成后开飞行模式,编辑器仍然能在本地文件上工作。代价是功能范围:云服务往往捆绑额外操作,比如编辑前 OCR、附件自动转换、或编辑后直接签署和发送的流程。本工具只做页面级的删除和重排。对这种聚焦工作流,浏览器侧的工具明显更快(无需等待上传、没有上传大小限制)也明显更私密。

另一种工具更合适的时候

常见问题

我的PDF会上传到服务器吗?

不会。所有处理都在你的浏览器中、通过在你标签页里运行的 pdf-lib JavaScript 库完成。你的文件被读入浏览器内存,在 JavaScript 中被处理,修改后的版本作为下载提供给你。唯一的网络流量,是页面首次打开时一次性从 CDN 加载 pdf-lib 本身。你可以在删除页面或点击“下载”时打开开发者工具的网络标签页查看,不会触发包含你文件内容的请求。

文件大小限制是多少?

在大多数现代浏览器和设备上,最大 50 MB 的 PDF 都能从容处理。大于 50 MB 的文件也能用,但 pdf-lib 在解析页面树时可能让标签页短暂卡住,尤其是在内存较低的设备上。根本的限制是浏览器内存而不是一个硬性上限;对于体量很大的 PDF(数百兆字节),用 Adobe Acrobat 或 Apple Preview 这样的桌面工具可能更合适。

我可以撤销更改吗?

在下载之前你都可以继续修改页面的选择和顺序,直到点击“下载修改后的 PDF”之前没有任何东西被定下来。刷新页面或点击“清空”会重置回原始文档。一旦下载,修改后的文件就是一份新的 PDF;磁盘上的原件永远不会被覆盖,所以你随时可以从未修改的版本重新开始。

对扫描得到的 PDF 也有效吗?

有效。页级操作(删除、重排)无论每一页里是可选中的文字还是扫描得到的图像位图,都同样工作,编辑器把整页当作不透明的内容块来移动。页数、页码和尺寸对图像页也能正确显示。这个编辑器不会做的,是对扫描的文字做 OCR,或修改任何一页的图像内容;这些操作需要一个专门的 OCR 工具或带 OCR 功能的桌面 PDF 编辑器。

这个工具在手机上能用吗?

对小文件可以。移动端浏览器的内存比桌面端少、JavaScript 引擎也更慢,所以体量很大的 PDF 可能会让标签页冻住或崩溃。在触屏设备上拖放手势也不如桌面好用,请改用文件选择器(点击“click to browse”)。在较小的 PDF 上做一次性的页面删除,移动端没问题;遇到大文件时请切换到桌面。

受密码保护的 PDF 呢?

和 Adobe Acrobat 相比,pdf-lib 对加密 PDF 的内置支持比较有限。如果一个 PDF 用用户级加密做了密码保护,本编辑器可能无法加载,或加载之后无法写入更改。变通办法:用一个知道密码的桌面工具打开该 PDF,把它另存为一份未加密的副本,然后在本工具中编辑这份未加密的版本。如果输出仍需要密码保护,事后再重新加密。

更多常见问题

这个工具能离线使用吗?

首次访问之后,可以。pdf-lib JavaScript 库在第一次加载时被浏览器缓存(约 380 KB 压缩后)。之后访问页面编辑器时不需要网络连接,只要浏览器缓存在期间没被清空。页面树操作本身从来不需要网络;只有库的加载需要。你可以通过这样验证:打开一次页面之后开启飞行模式,再尝试删除或重排一个本地的 PDF。

我可以一次从多个 PDF 中删除或重排页面吗?

不能直接做:界面一次只接受一个源文档。多 PDF 编辑的两步流程是:先用 免费在线 PDF 合并 把你的多个源文件合成一个文档,然后把合并后的 PDF 拿到这里来删除或重排到最终序列。对于更复杂的跨文档流程(把文件 A 的第 3 页拖到文件 B 的第 5 和第 6 页之间),Adobe Acrobat Pro 的「整理页面」原生支持一步完成跨文档拖动。对于在几十或上百个文件上的批量自动化,qpdf 或 pikepdf 命令行工具更合适。

应该在签名、扁平化或压缩之前还是之后编辑页面?

安全的顺序是:先编辑,然后扁平化,再签名,最后压缩。先编辑,因为后续操作依赖最终的页面序列。然后扁平化,因为它把表单字段和注释固化为静态内容,让下游工具能统一处理文档。在扁平化之后签名,因为加密签名固定到文档的最终字节序列,任何后续改动都会让它失效。最后压缩(可选)用于减小传输时的文件大小。已签名后再被编辑的 PDF 会在 Acrobat 和其他识别签名的阅读器里签名验证失败,所以签名必须始终是触及内容的最后一步。

扫描页上的 OCR 文本层会被保留吗?

会。PDF 中的 OCR 文本以叠加在扫描图像之上的不可见文本形式存储(一段标记为不可见的内容流操作符序列),这段内容流是页面对象的一部分。当 pdf-lib 的 copyPages 复制一页时,它复制整个页面对象,包括所有内容流、字体引用以及任何不可见的 OCR 文本层。对于经编辑后留下来的页面,搜索和选择在输出上仍按原样工作,跟在原始文件上一样。文本层是逐字节保留的;pdf-lib 不会重新编码或重新栅格化任何东西。

删除一半的页面会让文件大小也减半吗?

通常少于一半,有时少得多。如果被删的页面有独立内容(自有嵌入图像、自有字体子集),节省就大。如果被删的页面与保留下来的页面共享资源(整本文档使用同一字体、每页都用同一个 logo 图),共享资源会留在文件里。pdf-lib 在保存时不会激进地重新打包文件,因此原 PDF 已经做过的跨页资源去重会被保留,但由删除带来的新去重机会不会被利用。要追求紧凑输出,把结果再过一遍 免费在线 PDF 压缩,它会做完整的重新打包加图像重编码,通常能回收剩余的空间。

是否有桌面或命令行的等价方案用于脚本化?

有,多个。pdf-lib 在 Node.js 里运行无需更改(npm install pdf-lib),编辑代码完全相同:copyPages(source, indices) 然后对每一页调用 addPage()。命令行方面,qpdf 有逐页选择语法:qpdf --pages input.pdf 1-4,6-20 -- input.pdf output.pdf 保留第 1 到 4 页和第 6 到 20 页,删除第 5 页。Python 的 pikepdf 是 qpdf 的绑定,API 更干净(del pdf.pages[2] 删除第 3 页,对重排使用列表切片语义)。Adobe Acrobat Pro 通过图形界面提供同样的操作,并且额外保留书签和文档大纲在页面变动后的对应关系,这是纯浏览器路径做不到的。

相关工具