免费在线PDF页面编辑器
删除不需要的页面并重新排序PDF的页面顺序。100%客户端 · 您的文件保持私密。
支持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 压缩后,首次访问后由浏览器缓存)。
什么时候你真的需要一个页面编辑器
- 删除你不想分享的附录。 一份 60 页的报告包含 15 页机密的财务附录。删除第 46 到 60 页,发送精简后的版本。比从源应用重新导出更快(即使你已没有源文件也能用)。
- 签字流程后裁掉封面页。从 DocuSign 或一份手工扫描中拿回一份会签合同,里面带着一页顺序错乱、湿墨签名的页面。把签名页移到末尾,删掉电子签工具加进来的重复路由单,干净保存。
- 清理扫描仪输出。多页文档扫描仪输出了一份单一的 PDF,里头可能有自动双面进纸带来的空白背页,或是出来时歪了或顺序错了的页。页级编辑允许你丢掉空白页、把进纸错位的页重新排序,而不必重新扫描任何东西。
- 按提交要求重新组装。一份资助申请、法庭卷宗或学术投稿要求页面按特定顺序,标题、摘要,然后是带编号的章节。重排工具让你不必动用桌面 PDF 编辑器,就能把一份源 PDF 中的页面组装成所需顺序。
- 从较长文档里去掉个人页。简历或作品集里夹了一页你不想发给某位招聘人的私人推荐人页面。删掉那一页,下载脱敏后的版本,原件在磁盘上保持原样。
- 把过大的图书 PDF 拆开以便分发。一份 600 页的参考 PDF 太大无法用邮件发送。用编辑器一次删掉一章的页,把每一章作为单独文件下载。比起打开一个重型 PDF 编辑器,这种做法粗糙但有效。
竞争格局,浏览器 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-lib 在你的标签页里运行;任何阶段都没有服务器上传。
不在范围内:编辑各页的内容(文字、图像、表单字段)、把一份 PDF 拆成多份文件(请使用专门的 免费 PDF 拆分工具 工具)、把多份PDF 合并为一份(请使用 免费在线 PDF 合并)、压缩页面以减小文件体积(请使用 免费在线 PDF 压缩)、用永久黑条遮蔽敏感内容、给 PDF 做数字签名。这些操作请使用专门的工具或桌面 PDF 编辑器。
常见陷阱及其含义
- 编辑后超链接指向错误的页面。 源 PDF 含有按页面位置索引引用的内部超链接或目录条目(一个「跳到第 3 页」的链接)。删除或重排之后,这些引用仍指向旧位置,现在落到了错误的内容上。使用命名目的地的 PDF(注册在文档名称树中的「跳到 section-3」型链接)能正确地经受住页面变动,因为目的地随页面移动。解决办法要么是在编辑前用 在线 PDF 展平,免费 工具把链接注释扁平化,要么接受绝对页码链接在事后需要手动修复。如果源文件是由 Word 通过交叉引用字段生成或由 LaTeX 通过 hyperref 生成,链接通常已是命名目的地,可以保留。
- 删除后的输出文件没有想象中那么小。 pdf-lib 的
copyPages会追踪并复制保留下来的页面所依赖的每个对象,但不会激进地去重那些原本由被删除页面引用的共享资源。如果第 2 页和第 5 页共享一个字体子集,而你保留第 5 页删除第 2 页,那么字体引用随第 5 页一起留下来,删除节省了页面的内容流但没省下字体。节省量通常是按比例缩小所期望值的 80% 到 95%。如果需要更紧凑的输出,把结果再走一遍 免费在线 PDF 压缩;压缩器会做完整的重新打包,把剩下的空间回收。 - 书签或目录条目消失了。 pdf-lib 的
copyPages不会复制文档大纲(书签树)。大纲位于文档目录层级,是一个指向大纲项目树的/Outlines条目,而 pdf-lib 在页面复制期间目前不会重写它。输出的 PDF 有按正确顺序排列的修改后页面,但没有任何书签。这是 pdf-lib issue #218 中跟踪的已知限制;对于需要保留书签的文档,解决办法是使用 Adobe Acrobat Pro 的「整理页面」功能,它在页面变动时原生保留大纲。 - 编辑后表单字段失效。 AcroForm 字段对象位于文档层级
/AcroForm /Fields数组中,每个页面上的 widget 注释链接回这些字段对象。当 pdf-lib 在文档间复制页面时,widget 随页面移动,但字段到 widget 的关联并不总能被干净地重建。可见的症状是:可填写的表单字段变成静态矩形,或在输出中消失。对于「最终、不可再编辑」的工作流,解决办法是先用 在线 PDF 展平,免费 把表单扁平化,把字段值固化为静态内容,然后再编辑。对于「编辑后仍可填写」的工作流,Adobe Acrobat Pro 的「整理页面」才是合适的工具。 - PDF 已加密,工具报错。 pdf-lib 支持基本的口令加密读取,但并非总能解析受用户级加密保护或受所有者级复制/修改限制保护的 PDF 的页面树。标准的三步绕过流程:先用 免费在线 PDF 解锁(同样是纯浏览器,使用你已经知道的密码)解锁 PDF,在这里编辑页面,然后可选地用 PDF 密码保护 给输出重新加密。中间的解锁文件是被编辑的对象;最终的受保护输出保留新的页面顺序和新的密码。
- 非常大的 PDF 让标签页崩溃。 pdf-lib 在解析时把整个文件加载到 JavaScript 内存里。现代桌面浏览器可以从容处理数百兆字节的 PDF,但移动浏览器的内存上限通常在 200 MB 到 500 MB 之间,视设备而定。一个 400 MB 的 PDF 在 4 GB RAM 的安卓手机上可能会被操作系统直接终止。对于非常大的文件,合适的工具是桌面应用(Adobe Acrobat、Foxit)或命令行工具(qpdf、pikepdf),它们从磁盘流式读取文件,而不是整个加载到 RAM 中。
隐私:文件留在你的设备上
所有云端 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、附件自动转换、或编辑后直接签署和发送的流程。本工具只做页面级的删除和重排。对这种聚焦工作流,浏览器侧的工具明显更快(无需等待上传、没有上传大小限制)也明显更私密。
另一种工具更合适的时候
- 在内存受限的设备上处理超过 200 MB 的 PDF。 pdf-lib 把整个文件加载到内存;在手机、平板或较旧的笔记本上,标签页可能因内存不足而崩溃。对于非常大的文件,使用 Adobe Acrobat、Foxit 或 qpdf 命令行工具。qpdf 从磁盘流式读取文件,可以处理本质上无大小限制的文档。
- XFA 表单或基于证书的加密。 XFA 是 Adobe 专有的基于 XML 的表单格式,pdf-lib 处理它并不可靠。基于证书的加密(与基于口令的加密相对)同样超出 pdf-lib 的能力范围。Adobe Acrobat 是这两种情况下的标准工具。如果文档是用 Adobe LiveCycle Designer 创建的,默认就把它当作含 XFA 来对待。
- 必须保留书签或大纲树的编辑。 如果文档有复杂的大纲,并且你需要书签跟随页面移动到新位置(或在删除后仍保留),Adobe Acrobat Pro 的「整理页面」原生支持。pdf-lib 目前不支持。对于一次性删除而你并不在意大纲的文档,本工具更快;对于学术论文或技术手册这种大纲至关重要的工作流,使用 Acrobat Pro。
- 作为管道一部分的自动化批量编辑。 若需服务器端或脚本化地编辑大量 PDF,可直接在 Node.js 中使用 pdf-lib(同一个库,无需浏览器标签页)、Python 的 pikepdf(qpdf 的 Pythonic 绑定)或 qpdf 命令行的显式页面范围语法(
qpdf --pages input.pdf 1-4,6-20 -- output.pdf保留第 1 到 4 页和第 6 到 20 页,删除第 5 页)。
常见问题
我的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 通过图形界面提供同样的操作,并且额外保留书签和文档大纲在页面变动后的对应关系,这是纯浏览器路径做不到的。