服务器端 PDF 工具会把你的文件上传到运营方的计算机上,在那里处理,再把结果传回给你。客户端工具则是把程序下载到你的浏览器中,由程序在你自己的设备上处理文件。前一种情况,传出去的是你的文档;后一种情况,传过来的只是代码。

就这一点差别,决定了谁有可能看到你的文件。它也解释了为什么这两类工具用起来感觉不同、出问题的方式不同、适合的任务也不同。这篇说明会一步步讲清楚两者实际发生了什么。

服务器端工具里发生了什么

  1. 你选择一个文件。页面通过互联网把它发送到运营方的服务器,通常是 HTTPS 上传。
  2. 服务器把它存起来,至少在任务进行期间存在磁盘或内存里,而且常常和别人的文件一起排队。
  3. 服务器上的程序,比如 PDF 库、转换器或文字识别引擎,完成处理。
  4. 结果也会被存起来,页面给你一个下载链接。
  5. 之后,两个文件会按照运营方自己的保留规则被删除。

过去这是唯一实际可行的设计。那时浏览器很慢,能读写 PDF 的库只能在服务器上运行。如今的浏览器运行复杂代码已经很快,用 JavaScript 写成的开源 PDF 库可以在一个标签页里完成大多数日常任务。

HTTPS 保护第 1 步不被窃听。第 2 到 5 步则取决于运营方:他们的安全措施、员工的访问权限、备份,以及服务器所在国家的法律义务。大多数运营方都处理得很负责,但你是在信任他们会这么做。

客户端工具里发生了什么

  1. 你打开工具页面。浏览器下载页面和其中的 JavaScript,和访问任何网站一样。
  2. 你选择一个文件。浏览器的 File API 把它从你的磁盘读进标签页的内存。没有发送任何东西。
  3. 在标签页中运行的代码完成处理。繁重的部分通常在 Web Worker(一个后台线程)中运行,这样页面仍能保持流畅。
  4. 结果在内存中生成,通过一个指向你自己浏览器内存的临时链接,以下载的形式交给你。
  5. 关闭标签页时,内存就会被释放。别处没有任何东西需要删除,因为什么都没有发出去。

Kopitiam 的 PDF 工具就是这样工作的。它们用 Mozilla 的开源 PDF 引擎 pdf.js 读取和绘制页面,解析器在 Web Worker 中运行。再用另一个开源库 pdf-lib 生成新的 PDF。两者都在你的标签页里运行。

客户端并不意味着页面不发出任何网络请求。它仍然会加载代码、字体,在免费网站上还有广告。重要的是,你文件的字节从来不会出现在任何请求里。

为什么客户端工具可以离线使用

程序一旦到了你的浏览器里,运行时就不再需要网络。这就是断网测试有效的原因:打开工具,关掉 Wi-Fi,工具照样运行。如果它真的在上传,马上就会失败。

有些细节值得了解。Kopitiam 在工具页面一打开时就启动 PDF 引擎的 worker,而不是等你拖入文件,所以页面加载完成后即使网络断开,工具也能继续使用。一些不太常用的功能在第一次使用时会加载额外的代码,比如用于非拉丁文字的字体引擎。那是代码传到你这里,而不是你的文件传出去。

客户端处理的真正局限

在你的设备上处理是有代价的,一个诚实的工具应该告诉你。

  • 内存。整个文件都放在标签页的内存里,处理过程中往往不止一份副本。一份 200 MB 的扫描件可能需要好几倍的内存。浏览器会限制每个标签页的内存,手机限制得最紧。
  • 速度。干活的是你的笔记本电脑或手机,而不是数据中心。把 400 页渲染成图片,或者重新压缩一份长扫描件里的每张照片,在旧设备上明显要慢一些。
  • 电量和发热。在手机上运行一个耗时的任务,会让处理器满负荷工作一段时间。
  • 困难的任务。有些任务用服务器软件要容易得多,比如对大型扫描档案做文字识别,或者在精确保留版式的前提下转换复杂的 Office 文件。很多原本是客户端的工具,会把这些特定任务交给服务器处理。

实际上,客户端工具的大小限制取决于你的设备,而不是价目表上的一个数字。Kopitiam 的代码里没有设置文件大小上限,所以一个非常大的文件,要么能处理,要么内存不足。先把大文件拆分开,或者用桌面浏览器而不是手机,通常就能顺利完成。

假设你要把一份 40 MB 的扫描件压小发邮件,而手机网络很慢。服务器端工具必须先把 40 MB 全部上传才能开始,然后你还要下载结果,所以大部分等待时间都花在网络上。客户端工具省掉了这两次传输,但压缩要由你的手机自己完成,长扫描件可能要花一些时间。两者都不是总比对方快:要看你的网络和设备。

混合模式,以及需要仔细读的说法

并不是每个工具都纯粹属于其中一种。你会看到几种模式:

  • 大部分在本地,部分在服务器。简单任务在浏览器中运行,而格式转换或文字识别会被上传。要找针对每个工具的说明,而不是全站统一的说法。
  • 加密上传。文件会被上传,但在传输和存储时都是加密的。这总比没有好,但服务器在处理时仍然要把它解密。
  • 本地处理加云端保存。处理在本地进行,但结果会存进你的账号,方便以后打开。这在设计上就是一份服务器副本。
  • 桌面应用。安装的程序也是客户端,但它同样可能把文件或使用数据发回去。它的隐私政策依然重要。

怎样检查你用的是哪一种

打开浏览器的开发者工具(大多数桌面浏览器按 F12),切到“网络”面板,然后用一个测试文件跑一遍工具。服务器端工具在你开始时,会显示一个和你的文件大小差不多的请求发了出去。客户端工具只会显示一些小请求,比如广告或分析信息,没有任何请求会随你的文件变大。关掉 Wi-Fi 再做同样的任务,就是这个测试的简便版。

该选哪一种

对于合同、工资单、医疗信函和身份证件扫描件,客户端是更好的默认选择:别处没有副本可以泄露或保留。对于公开的宣传册或菜单,用哪种都可以。当你需要浏览器做不好的事情时,比如对一份 2,000 页的档案做文字识别,选择一个信誉良好、保留政策清楚的服务器端工具是合理的,但只针对那个文件,而不是养成习惯。