ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

UOS/Deepin 虚拟 PDF 打印机 cups-pdf 安装配置与排障全攻略

UOS/Deepin 虚拟 PDF 打印机 cups-pdf 安装配置与排障全攻略 说实话我最初在 UOS 上找虚拟 PDF 打印机的时候也绕了不少弯路。Windows 上用惯的 Adobe PDF 打印机换到国产系统后一度手足无措。后来才发现系统其实早就内置了 CUPS 这套打印架构而 CPUS-PDF实际软件包名是 cups-pdf就是装在这套架构里的虚拟打印机。它解决了办公中一个很实际的问题几乎所有系统都要求上传 PDF 格式的文档但很多国产 Linux 应用只有打印按钮没有另存为 PDF选项。装好 CPUS-PDF 之后任何应用只要走系统打印对话框就能把内容直接生成 PDF 文件。这篇文章我会从环境准备、安装过程、关键配置到故障排查把完整链路写清楚也会分享一些实际操作中踩过的坑和总结出的技巧。内容适合刚迁移到 UOS 统信桌面系统或 Deepin 的用户也适合需要在多台国产化设备上统一部署虚拟打印机的运维人员看完可以直接照着操作。1. 为什么在 UOS/Deepin 上绕不开虚拟 PDF 打印机1.1 国产系统生态里最常见的 PDF 输出困境先说一个我经常被问到的场景公司财务报销系统要求上传 PDF 版电子发票。在 Windows 上很简单打印的时候选 Microsoft Print to PDF 就行。但在 UOS 或 Deepin 上打开打印对话框可选的打印机往往只有一台真实打印机。如果没有实体打印机整个打印对话框基本就是摆设。你可能觉得那用 WPS 打开文档后选输出为 PDF不就行了这确实能解决一部分需求但有个前提——内容必须在 WPS 里打开。如果是网页、图表工具、行业软件里的内容未必能在办公套件里打开。更麻烦的是有些老的业务系统自带打印模板只提供打印按钮这时候除了虚拟打印机没有第二个办法把内容转成 PDF。所以我一直认为虚拟 PDF 打印机不是可选工具而是国产 Linux 桌面的刚需组件。它本质上是一个永远在线、不会卡纸、不需要墨盒的打印机你把任何东西交给它它吐出来的就是一份 PDF 文件。1.2 CPUS-PDF 到底是什么为什么选它不选别的先纠正一个拼写问题标题里写的 CPUS-PDF实际软件包名称是 cups-pdf。CUPSCommon UNIX Printing System是 Linux 和类 Unix 系统下的标准打印服务而 cups-pdf 是 CUPS 的一个后端驱动。它的原理很简单在 CUPS 中注册一台虚拟打印机打印数据流进来后经过 Ghostscript 处理最终生成 PDF 文件写入指定目录。你可能要问系统里有没有其他选择UOS 应用商店里有 WPS PDF、福昕阅读器它们能转 PDF但那是应用级的转换不是系统级的打印接口。真正能和打印对话框无缝对接的方案主要还是 cups-pdf。另外还有一个叫 PDFCreator 的第三方工具但在 Linux 上已经很久不更新了。实测下来cups-pdf 在 Deepin 20.9、UOS 专业版 1050 系列、UOS 家庭版上都表现稳定所以这篇的安装配置都以它为主线。还有一点值得说cups-pdf 是 Debian/Ubuntu 软件源里现成的包不需要编译不需要手动下载二进制文件。这意味着依赖关系被妥善处理了安装失败的概率很低这也是我为什么推荐它而不是从 GitHub 上拉源码来折腾。2. 安装前先把软件源、CUPS 服务和用户环境捋顺2.1 确认系统版本和 CPU 架构避免装错包安装任何软件前先确认系统版本和架构。UOS 和 Deepin 都有 x86_64 版本也有针对飞腾、鲲鹏、龙芯等国产芯片的 ARM 或 MIPS 版本。命令很简单uname -m cat /etc/os-release如果是x86_64直接按常规流程走。如果是aarch64或loongarch64也不用太担心cups-pdf 是一个靠 Python 和 Shell 脚本驱动的包不涉及 CPU 指令集差异软件源里只要收录了就能装。我实测过飞腾 FT-2000 平台的 UOS 专业版apt install cups-pdf是直接成功的。第二件事是确认系统版本UOS 的版本号会直接影响软件源配置。在终端里输入cat /etc/os-release看 VERSION_ID 和 PRODUCT_VERSION 字段记下来备用。后面如果遇到软件源问题这个信息很重要。2.2 检查并激活软件源局域网源、官方源还是公共源很多 UOS 用户在安装软件时会卡在找不到包这一步80% 的原因出在软件源上。UOS 专业版默认使用统信官方源或企业内部搭建的私有源Deepin 默认使用 Deepin 源如果是从旧版本升级上来的系统源可能还残留着旧的版本号导致apt update报 404。安装前最好先跑一次sudo apt update看到报错先别急着下一步。常见情况有两种一是提示 Release 文件过期或不存在说明源地址和当前系统版本不匹配二是提示无法解析域名说明网络不通或 DNS 配置有问题。如果使用的是 UOS 专业版且公司内网有统信镜像源建议优先配置内网源速度稳。如果是个人电脑用家庭版可以直接使用公共源。这里没有统一的标准命令因为不同版本的源地址格式不一样但配置文件都在/etc/apt/sources.list以及/etc/apt/sources.list.d/目录下。修改后执行sudo apt update确保apt update顺利跑完再执行安装才有意义。这一步做好了后面能省掉大量排查时间。2.3 CUPS 服务状态和 lpadmin 用户组被忽略的前置条件cups-pdf 安装在 CUPS 服务之上。如果 CUPS 服务本身没跑起来那装了也是白装。检查方法systemctl status cups如果状态不是active (running)先启动sudo systemctl start cups sudo systemctl enable cups第二个容易忽略的前置条件是当前用户必须在lpadmin用户组里。这个组控制着谁有权限向 CUPS 添加打印机、修改打印机配置。UOS 和 Deepin 的图形界面里第一个创建的管理员用户通常会自动加入lpadmin组但如果你用的是后来添加的账户可能就不在。检查命令groups 你的用户名如果输出里没有lpadmin执行sudo usermod -aG lpadmin 你的用户名注意这条命令执行后需要注销重新登录才生效。我遇到过用户执行完命令不注销就直接去网页端添加打印机结果反复输入密码被拒绝以为自己密码错了其实只是组权限没刷新。3. 安装 CPUS-PDF 与手动注册打印机的完整过程3.1 用 apt 安装 cups-pdf一条命令解决依赖环境就绪后安装就很简单了sudo apt install -y cups-pdf-y参数表示遇到交互式确认自动选 Yes。如果软件源正常apt 会自动处理依赖常见的依赖包包括cups、ghostscript、python3-cups等。安装完成后先别急着去打印先重启 CUPS 服务让新后端被正确加载sudo systemctl restart cups然后刷新一下系统打印设置界面。在 UOS 的启动器里找到打印设置有的版本叫打印机打开看列表里有没有一台名为CUPS-PDF的打印机。如果有恭喜安装成功了一大半。如果列表里没有先别慌看 3.2 节的手动注册方法。这里有个细节值得说明cups-pdf 安装后会自动注册打印机依赖于安装包里的 postinst 脚本。在绝大多数系统上会自动完成但在某些精简过的 UOS 镜像中CUPS 服务可能没有完整初始化导致自动注册失败。所以安装后检查打印设置列表是一个好习惯。3.2 手动注册打印机lpadmin 命令和 PPD 驱动如果打印机没有自动出现手动注册一点也不麻烦。首先确认 cups-pdf 的 URI 类型虚拟打印机的设备 URI 是cups-pdf:/。然后执行sudo lpadmin -p CUPS-PDF -v cups-pdf:/ -E -m drv:///cups-pdf/cups-pdf.ppd命令拆解一下-p CUPS-PDF指定打印机名称这个名称可以改成你喜欢的但别用中文某些旧程序对中文打印机名支持不好。-v cups-pdf:/指定设备 URI这是虚拟打印机的关键标识。-E启用该打印机。-m drv:///cups-pdf/cups-pdf.ppd指定 PPD 驱动文件。drv:/// 是 CUPS 内部驱动的访问方式不需要写绝对路径。执行完再确认一下lpstat -p -d能看到printer CUPS-PDF is idle. enabled since ...这样的输出就说明注册成功了。如果你更习惯图形化操作也可以通过 CUPS 网页管理后台添加。浏览器访问http://localhost:631/admin按提示输入系统用户名密码点击Add Printer设备列表里选CUPS-PDF (Virtual PDF Printer)如果没这个选项就选 Other 并手动填入cups-pdf:/驱动选 CUPS-PDF 对应的 PPD一步步完成。网页后台的方式更直观适合图形界面操作熟练的读者。3.3 设置默认打印机一步让所有应用直接用它注册完成还不算完。系统里可能同时有真实打印机和虚拟打印机如果不设置默认应用打印时可能弹出来让你选有些老程序甚至会忽略选择直接打到默认设备上。所以建议直接把 CUPS-PDF 设为默认打印机sudo lpadmin -d CUPS-PDF确认一下lpstat -d输出会显示system default destination: CUPS-PDF。这样设置的好处是以后在任何应用里按 CtrlP默认输出就是 PDF非常省心。如果有真实打印机需求打印时再手动切换即可。4. 修改 cups-pdf.conf输出目录、命名规则与权限设置4.1 主配置文件结构先看默认值再动手改cups-pdf 的配置在主配置文件/etc/cups/cups-pdf.conf中。安装完成后默认配置基本能用但输出的 PDF 默认存放在/home/你的用户名/PDF目录如果这个目录不存在会自动创建。如果你希望改到别的位置或者需要调整文件命名规则、处理权限问题就得改这个文件。动手前先备份sudo cp /etc/cups/cups-pdf.conf /etc/cups/cups-pdf.conf.bak然后打开编辑sudo nano /etc/cups/cups-pdf.conf不想用 nano 的话用 vim 或者图形界面的编辑器都可以关键是最后保存时确保权限正确。4.2 核心参数详解Out、CreateDir、FileName配置文件里最常用的几个参数如下参数作用我的推荐值OutPDF 输出目录${HOME}/PDF或/home/shared/pdfCreateDir输出目录不存在时自动创建YesFileName输出文件命名规则/%Y-%m-%d-%H%M%S-%Umask输出文件的权限掩码002GRP指定输出文件的属组留空或指定实际用户组Label是否添加标签文本1保留任务名信息Out这个参数比较讲究。默认${HOME}/PDF的好处是不同用户打印出来的文件各自归属各自的 Home 目录互不干扰安全性好。如果这台电脑有多人使用建议保持默认。如果是一个团队共用一台设备所有人打印出来的 PDF 想统一放到一个目录就可以改成/home/shared/pdf这种共享目录但别忘了同时设置好目录权限sudo mkdir -p /home/shared/pdf sudo chmod 775 /home/shared/pdf sudo chown 用户名:用户组 /home/shared/pdf共享目录的权限设置是个容易踩坑的点。我之前遇到过一位同事把 Out 改成了/home/ftp但没处理目录权限打印的时候 CUPS 进程以lp用户身份尝试写入结果权限被拒打印任务一直处于排队状态表面上却看不出来。这里面有个底层机制要明白CUPS 打印任务的后端进程不一定以你的身份运行所以输出目录必须允许后端进程写入。为了防止这种问题一个更稳妥的做法是让 cups-pdf 以后端进程的用户身份写入然后通过GRP参数指定文件属组让当前用户也能读取和删除。这个思路在多人电脑上尤其好用。FileName参数决定输出文件的命名。默认情况下PDF 文件名会与打印任务名保持一致比如从浏览器打印网页任务名是百度一下生成的文件名就是百度一下.pdf。这看起来挺方便但有两个隐患一是任务名可能会包含一些特殊字符导致生成失败二是任务名如果重复后面打印的文件会直接覆盖前面那个。我建议改成时间戳规则FileName /%Y-%m-%d-%H%M%S这样生成的文件名是2025-06-15-143005.pdf每次打印都不会重名。如果你既想保留任务名信息又希望不重名可以写成FileName /%Y-%m-%d-%H%M%S-%%代表原始任务名最终生成类似2025-06-15-143005-发票.pdf的文件既有时间顺序又保留了辨识度。4.3 中文文件名乱码与编码问题在 UOS/Deepin 下用 cups-pdf很多人会遇到一个怪现象打印出来的 PDF 文件名是乱码或者文件内容正常但文档属性里的标题是乱码。这通常是任务名编码问题导致的。CUPS 默认按 UTF-8 处理任务名但某些老应用的打印接口还使用 GBK 编码。解决思路有两个层面。第一在 cups-pdf.conf 中不要依赖任务名作为文件名直接改成纯时间戳格式绕开编码问题。第二如果确实需要保留任务名可以在打印时手动指定lp -d CUPS-PDF -t 发票文件名 待打印文件-t参数指定任务标题这样生成的文件名就是你想要的中文名称。实测在 UOS 专业版上用这种方式打印中文文件名完全正常。5. 打印效果实测与常见故障的完整排查思路5.1 真实场景打印测试浏览器、WPS、LibreOffice配置完成后我建议不要急着直接开始正式使用先做三轮打印测试确认整体链路通畅。第一轮浏览器打印。任意打开一个网页按 CtrlP打印机选择 CUPS-PDF点击打印。正常情况下几秒钟后在输出目录里就会出现一个 PDF 文件。这一轮主要验证打印机后端是否工作正常。第二轮WPS Office 打印。打开一个 docx 文档文件 - 打印选择 CUPS-PDF。这里有个观察点WPS 的打印对话框可能会额外显示一个打印到文件选项。注意区分这两者——打印到文件生成的是 PostScript.ps格式而 CUPS-PDF 生成的是真正的 PDF。建议统一用 CUPS-PDF。如果打印后生成的 PDF 用 WPS 打开排版错乱可以考虑在 WPS 打印设置里关闭打印颜色校正之类的选项这在一些旧版本上会导致颜色异常。第三轮命令行打印。终端里执行echo 虚拟打印机测试 | lp -d CUPS-PDF这条命令会生成一个包含虚拟打印机测试文字的 PDF。命令行打印的意义在于绕过图形界面直接验证 CUPS 任务队列是否正常。如果图形界面打印失败但命令行成功问题多半出在应用层反过来如果命令行也失败就需要检查 cups-pdf 后端本身。5.2 打印队列状态观察排队中、已完成、卡住打印任务发出后可以用lpstat -o查看任务队列lpstat -o正常情况下任务状态会很快从pending排队变为completed完成。如果任务一直卡在pending或者变成stopped说明后端出了问题。这里我分享一个排障链路先看 CUPS 日志再看 cups-pdf 后端日志最后看 Ghostscript 是否正常。CUPS 日志查看命令sudo tail -f /var/log/cups/error_log需要关闭日志级别过滤的话可以在/etc/cups/cupsd.conf中找到LogLevel改成debug然后重启 CUPS。日志里会显示任务从接收、过滤、后端处理到完成的完整过程。看到PID ... stopped字样基本就是后端处理失败再往上看一行通常能看到具体的错误原因。Ghostscript 是 cups-pdf 生成 PDF 的核心组件排查时可以单独验证gs --version如果版本异常或者依赖库缺失重新安装sudo apt reinstall ghostscript5.3 输出目录没有文件排查目录归属和写入权限打印任务显示完成但输出目录里找不到文件这是新手最容易困惑的情况。先说结论优先级最高的检查点是目录归属和写入权限。/var/spool/cups-pdf是这个包的临时工作目录后端进程通过它中转文件。如果这个目录权限不对打印任务表面上是成功的但文件在后续移动过程中丢失。检查并修复ls -ld /var/spool/cups-pdf sudo chown -R lp:lp /var/spool/cups-pdf sudo chmod -R 775 /var/spool/cups-pdf如果你把Out配置成了自定义目录还需要确认该目录允许lp用户写入。我见过的最隐蔽情况是目录使用了 ACL 权限表面权限看着没问题但实际写入时被 ACL 拒绝了。检查 ACLgetfacl /home/你的用户名/PDF如果 ACL 异常直接给后端进程加上写入权限sudo setfacl -m u:lp:rwx /home/你的用户名/PDF5.4 生成空白 PDF 的完整排查链路打印任务完成文件也有但打开是空白页这属于比较棘手的问题。按我排障的经验依次检查三个环节。第一检查原文件本身。如果原文件是图片或网页内容层可能在打印时没有被正确栅格化。可以先把内容放到 WPS 或 LibreOffice 里另存为 PDF验证一下如果应用另存正常说明内容本身没问题问题出在打印驱动层面。第二检查 cups-pdf 是否调用了正确的过滤器。CUPS 打印需要经过过滤器链如果过滤器不完整页面数据可能没有正确渲染。执行sudo lpadmin -p CUPS-PDF -p检查驱动型号是否为drv:///cups-pdf/cups-pdf.ppd。如果是 Generic PostScript 之类的通用驱动建议重新指定为 cups-pdf 专用驱动。第三检查 Ghostscript 的安全配置。某些安全加固过的 UOS 版本会对 Ghostscript 启用沙箱策略比如-dSAFER导致某些字体无法嵌入。如果是这个原因报错日志里通常有InvalidFont或Cant find a usable font的提示。解决办法是安装补充字体sudo apt install -y fonts-noto-cjk fonts-wqy-microhei6. 进阶玩法局域网共享、扫描联动和自动化导出6.1 将虚拟 PDF 打印机共享到局域网一个很实用的场景A 电脑上安装了 CPUS-PDFB 电脑也可能是 Windows 机器想把文件传到 A 上生成 PDF通过局域网共享可以让 B 直接把打印任务发给 A。实现方式很直接在 CUPS 的配置文件/etc/cups/cupsd.conf中确保以下两行没有被注释掉Listen 631 Browsing On然后开放打印共享权限在文件末尾添加Location / Order allow,deny Allow localhost Allow 192.168.1.0/24 /Location注意把网段改成实际局域网网段尽量精确限制不要用Allow all否则任何设备都能向这台机器发送打印任务虽然产出只是 PDF 文件但频繁写入磁盘会造成空间浪费。修改后重启 CUPSsudo systemctl restart cups在局域网内的另一台 Linux 机器上打开打印机设置添加网络打印机地址填写http://A机器IP:631/printers/CUPS-PDF驱动选择与本机一致的 cups-pdf 驱动即可。Windows 机器也可以走 IPP 协议添加打印机时选择使用 IPP并填同一个地址。6.2 与系统截图工具、扫描仪的联动组合CPUS-PDF 不仅接受文档打印任务还能与系统里的其他输入方式组合出很流畅的办公链路。先说截图。UOS 自带的截图工具默认直接保存 PNG但很多需要上传的凭证图片背景复杂、尺寸很大。我的做法是先用截图工具截取需要的内容然后用图像查看器打开按 CtrlP 选择 CUPS-PDF直接打印成 PDF。这样生成的 PDF 不仅体积更小而且图片内容被封装在标准 PDF 里很多审核系统的解析率更高。这个操作方式比先转格式再合成简单得多。再说扫描仪。UOS 自带的扫描应用简单扫描支持直接扫描到 PDF但如果你手边的扫描仪没有 Linux 驱动可以使用 CUPS 的扫描接口配合 cups-pdf 生成 PDF。由于不同扫描仪的空见差异较大这一部分没有统一命令但思路是一致的让扫描仪先输出图片图片再走 CUPS-PDF 转 PDF绕开驱动限制。6.3 配合命令行的自动化导出脚本安装好 CPUS-PDF 之后完全可以把它做成自动化的工具几个常用脚本例子可以参考。批量转换 PDF原来有多个文件想合并打印成 PDFlp -d CUPS-PDF 文档1.docx 文档2.xlsx 文档3.pptxCUPS 会把这几个任务依次排队输出目录里会得到多个 PDF。如果希望合并成一个 PDF可以借助pdfunitepoppler-utils 提供合并sudo apt install -y poppler-utils pdfunite /home/你的用户名/PDF/文档1.pdf /home/你的用户名/PDF/文档2.pdf 合并结果.pdf定时清理输出目录防止硬盘被打印文件堆满#!/bin/bash # 清理7天前的PDF find /home/你的用户名/PDF -name *.pdf -mtime 7 -delete可以把这段存成cleanup-pdf.sh配合 crontab 每周自动执行。6.4 从应用商店误装的 PDF 工具 vs CPUS-PDF 的边界最后想强调一个边界问题。UOS 应用商店里有大量 PDF 工具比如 WPS PDF、福昕、Okular它们能查看、编辑、合并 PDF但都不具备系统级虚拟打印能力。CPUS-PDF 的价值在于它是打印服务的一部分任何应用都能调用它。这两类工具不是替代关系而是互补。我在办公环境里推荐的标准组合是CPUS-PDF 负责把一切可打印内容收成 PDFWPS PDF 负责查看和轻量编辑命令行工具负责批量合并和拆分。这个组合稳定、免费、不依赖外网服务在政务和国企办公环境里尤其吃得开。相比之下如果去装某些闭源 PDF 虚拟打印机一方面许可费用不低另一方面在内网环境下激活验证都是麻烦事。所以 CPUS-PDF 在国产系统里能够胜出靠的不是花哨功能而是它作为系统组件的稳定性。写在最后几个实际操作中的体会文章到这里安装、配置、排查、进阶都覆盖到了最后分享几条我自己亲测的体会。第一安装之前一定要先跑apt update。很多朋友上来直接apt install cups-pdf报错找不到包就懵了。其实多半是软件源索引太旧系统不知道有这个包。把源更新到最新能解决一大半问题。第二安装完之后如果打印机列表里没有 CUPS-PDF别急着卸载重装。先用lpstat -p -d确认一下CUPS-PDF 可能已经注册成功只是图形界面没刷新。注销重登或重启 CUPS 通常就能出现。第三配置文件名规则时建议使用时间戳加任务名的组合既避免重名又能保留辨识度。但如果你的工作流中有很多应用输出的任务名是乱码那不如直接只用时间戳。第四也是最容易忽视的一点想清楚输出目录是给单个人用还是多人共用。单人使用保持默认~ /PDF就行多人共用要统一目录但必须处理好目录权限和 ACL否则打印任务会神秘消失。每次给客户或同事部署完这套流程我都会让他们做完三轮测试再收工。这不是多此一举而是因为安装本身不难难的是在真实办公场景里稳定运行。只要前期把环境的坑填平了CPUS-PDF 在 UOS 和 Deepin 上真的能像 Windows 的虚拟打印机一样变成一个安静的、永远在线的 PDF 生产器。
返回列表