ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

macOS 虚拟打印机三步搞定:RWTS-PDFwriter 把任何文档一键打印成 PDF

macOS 虚拟打印机三步搞定:RWTS-PDFwriter 把任何文档一键打印成 PDF

macOS 虚拟打印机三步搞定:RWTS-PDFwriter 把任何文档一键打印成 PDF

【免费下载链接】RWTS-PDFwriterAn OSX print to pdf-file printer driver项目地址: https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter

你一定遇到过这种时刻:网页上看到一篇干货想存档、合同要转成 PDF 发给客户、手头二三十份报告要统一转成电子版。macOS 自带的"打印为 PDF"虽然能用,但每次都要手动选位置、敲文件名,批量场景下更是点到手酸。RWTS-PDFwriter 就是为消灭这类重复劳动而生的免费开源项目:它往系统里装一台"看不见的打印机",之后任何应用里按下打印、选中它,PDF 就会自动落到你指定的文件夹,连文件名都不用管。它支持 macOS 11.0 及以上系统,Intel 与 Apple Silicon 芯片通吃,源码完全开放(GPL v2 协议),可以看作是 Windows 上 CutePDF 在 Mac 世界的对应物。

先弄明白:这台"虚拟打印机"是怎么工作的

普通打印机把电子文档变成纸上的墨迹,而 PDFwriter 把"打印"这一步的输出从纸张换成了 PDF 文件。它本身不是一个应用,而是 macOS 打印服务 CUPS(即系统里负责所有打印流程的组件)下的一个"后端"程序。

当你选中 PDFwriter 并点击打印,流程是这样的:

  1. CUPS 把打印数据交给后端的 Swift 程序(源码在pdfwriter/main.swift);
  2. 后端先检查数据是不是真正的 PDF——只看文件头四个字节是不是%PDF
  3. 是,就写入目标目录;不是,就报错并取消这个打印任务。

这个"只认 PDF"的设计保证了落盘的每一个文件都是有效 PDF。而由于几乎所有 macOS 应用都支持打印,你等于获得了一条通用的"文档转 PDF"通道:Safari、Word、Numbers、预览、邮件……任何能调出打印对话框的地方都能用。安装包是通用二进制,无需担心芯片架构问题。项目源自 Lisanet PDFWriter,再往前可追溯到经典的 CUPS-PDF,属于久经考验的技术路线。

三步上手:安装、选址、打出第一份 PDF

第一步:安装

有两种方式,二选一:

  • 直接安装项目提供的 pkg 安装包(推荐,安装器会自动完成驱动注册);
  • 或者克隆源码自行编译(编译方法见文末"卸载与源码编译"一节)。

第二步:指定 PDF 输出位置

安装完成后,安装器会自动打开PDFWriter Utility配置工具。界面很简洁,就两个按钮:

点击Create PDF Destination Folder,在弹出的面板里选一个你顺手的文件夹(比如"文稿/PDF_Output")。这里有两个小坑要提前知道:

  • 如果系统提示"需要先打印一份文档",说明你的个人目录还没生成——随便用 PDFwriter 打印一份测试文档,再回来操作即可;
  • 选好文件夹后,务必退出(Quit)Utility,安装流程才算真正收尾。

第三步:打印

之后的使用就简单到极致:在任何应用里按⌘ + P,打印机选PDFwriter,点击打印。文档就会以 PDF 形式自动出现在你指定的文件夹里,全程不需要再碰一次文件对话框。

同一台 Mac 的其他人怎么用?

如果这台电脑还有别的用户,他们不需要重新安装——在"系统设置 → 打印机与扫描仪"里选中 PDFwriter,通过Options & Supplies → Utility标签页的Open Printer Utility按钮,就能打开同一个配置工具,创建属于自己的输出目录。

打印出来的文件都存在哪儿:一人一个专属抽屉

这里有个值得了解的细节:你选的那个"目标文件夹",其实是一个符号链接——真正的文件物理上存放在/var/spool/pdfwriter/<用户名>/目录下。

为什么要绕这么一圈?因为这种设计把"存储位置"和"用户入口"分开了:

  • 系统路径稳定:后端永远往固定的 spool 目录写文件,权限清晰可控;
  • 你喜欢的路径只是入口:Finder 里看到的文件夹指向同一个位置,两边都能访问。

更重要的是多用户隔离。每个用户拥有独立目录,彼此看不到对方的文件:

打印来源输出目录目录权限文件权限
本机账户用户/var/spool/pdfwriter/<用户名>/700(仅本人可进)600(仅本人可读写)
匿名打印任务/var/spool/pdfwriter/anonymous users/777666

文件属主与你的系统账户严格绑定,同时归属打印组(_lp)。后端还会给目录配上 PDF 文件夹图标,方便你在 Finder 里一眼认出。顺带一提,所有文件都在本机硬盘上,不经过任何云端,对注重隐私的场景很友好。

文件名的小聪明:自动命名与重名冲突处理

这个项目在"起名"上花了不少心思,值得专门说说。默认情况下,PDF 文件名直接取打印任务的标题(也就是文档名),自动补上.pdf后缀。但真实世界的文档标题千奇百怪,于是后端做了几层防护:

  1. 防路径注入:标题里的/会被替换成:,避免"文件名里藏路径"的问题;
  2. 防超长:标题超过 200 字符会被截断;
  3. 兜底命名:从命令行管道输入且没指定标题时,标题显示为(stdin),此时文件统一命名为Untitled.pdf
  4. 重名不覆盖:如果目标文件名已存在,自动追加-1-2这样的数字后缀,旧文件永远不会被悄悄覆盖。

最后一条的实现也值得一提:后端用O_CREAT|O_EXCL标志原子地创建文件——先探测再创建的传统写法存在"检查与执行之间的时间差",而原子创建从根上消灭了并发覆盖的可能。也就是说,即使多个打印任务同时到达,也不会出现两个任务争抢同一个文件名的状况。这几行代码是main.swift里最值得读的部分。

进阶玩法:用命令行批量转换 PDF

图形界面适合单发操作,但如果你有一批文件要处理,命令行才是效率之王。lpr是 macOS 自带的打印命令,配合 PDFwriter 可以这样用:

# 把一批 PDF 批量"打印"到输出目录 for f in ~/待处理/*.pdf; do lpr -P PDFwriter "$f" done

这段命令逐个把文件交给 PDFwriter,生成的 PDF 会以原标题落在输出目录。如果想自定义文件名,用-T参数指定任务标题即可:

cat 报告.pdf | lpr -P PDFwriter -T "季度报告-2026"

这里需要注意:后端只认%PDF文件头,如果输入的不是 PDF(比如纯文本),CUPS 会尝试用系统自带的文本转 PDF 过滤器处理;格式不兼容的任务会被直接取消。所以批量转换时,源文件最好是 PDF,或者先经过能导出 PDF 的应用。

再进一步,你还可以把它接进自动化工作流——比如用 Automator 建一个"文件夹操作",监听某个目录,新文件出现就自动执行lpr -P PDFwriter,实现"扔进去就转成 PDF"的免手动体验。核心命令就一条,剩下的是组合想象力。

你想做的事推荐做法
偶尔存一两个网页/文档应用里⌘ + P选 PDFwriter
一批 PDF 统一转存循环执行lpr -P PDFwriter
想自定义输出文件名lpr -T "自定义标题"
新文件自动转 PDFAutomator 文件夹操作 / fswatch 监听后 lpr

常见问题答疑:新手最容易踩的四个坑

Q1:打印对话框里找不到 PDFwriter 打印机?

先确认安装完成后是否退出了 Utility(没有退出的话安装流程未收尾);再检查驱动目录/Library/Printers/RWTS/PDFwriter/是否存在;都不行就重新运行一次安装包。

Q2:创建目标文件夹时报"先打印一份文档"?

这是正常的引导提示——你的个人 spool 目录还没生成。随便用 PDFwriter 打印一份测试文档,再回来创建文件夹即可。

Q3:想换个输出目录怎么办?

配置工具明确提示"替换已存在的位置不受支持"。正确的做法是:删掉旧的符号链接,重新打开 Utility 创建新位置;或者直接手动用ln -s把新目录指向/var/spool/pdfwriter/<用户名>

Q4:生成的 PDF 打不开?

多半是打印了不兼容的输入格式。后端会因为数据不是有效 PDF 而取消任务,排查时可以查看 CUPS 日志/var/log/cups/error_log,里面会有具体原因。

Q5:同一台电脑的其他人能看到我的 PDF 吗?

不能。个人目录权限是 700,只有文件属主本人能进入,多用户之间天然隔离。

卸载与源码编译:装上容易,卸下也容易

卸载同样走配置工具:打开 PDFWriter Utility,点击Reveal Uninstall script,在 Finder 打开的目录里运行uninstall脚本,输入管理员密码即可。卸载会移除打印机配置、驱动文件和 CUPS 后端注册,但保留你已经生成的 PDF 文件,不用担心数据丢失。

想从源码自己编译也简单:

git clone https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter cd RWTS-PDFwriter ./build/buildscript.sh

需要先装好 Xcode 命令行工具。脚本会调用xcodebuild编译驱动与配置工具,再用pkgbuild/productbuild打出一个带安装界面的 pkg 安装包。如果你有 Apple 开发者账号想签名公证,加上-n "<你的钥匙串配置文件>"参数即可。整个构建流程很干净,值得对照build/buildscript.sh读一遍,能学到不少 macOS 安装包制作的知识。

延伸方向与资源清单

目前 RWTS-PDFwriter 刻意保持"单功能极简"——只做打印转 PDF 这一件事,但它的架构为扩展留足了空间:输出到云存储、生成 PDF/A 归档格式、自动加水印与数字签名、提供 REST API 供第三方调用,都是可以探索的方向。如果你动手能力强,完全可以 fork 一份做自己的定制版。

最后附上项目的核心资源路径,按需取用:

  • pdfwriter/main.swift—— CUPS 后端核心实现,文件校验、命名、权限都在这里;
  • PDFWriter Utility/ContentView.swift—— SwiftUI 配置工具源码;
  • build/PDFWriter.drv—— 打印机驱动定义(PPD 源文件),可了解打印机如何注册进系统;
  • build/buildscript.sh—— 一键打包安装器的构建脚本;
  • README.md—— 官方使用说明。

给不同人群的下一步建议:普通用户直接安装官方 pkg,享受"打印即存档"的便利;技术用户把lpr命令接进自己的脚本和自动化流程;开发者则可以从main.swift入手,学习如何用 Swift 写一个生产级的 CUPS 后端。一台免费、本地、开源的虚拟打印机,换来的是每天省下的无数次"另存为",这笔账怎么算都划算。

【免费下载链接】RWTS-PDFwriterAn OSX print to pdf-file printer driver项目地址: https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表