☰
UOS/deepin安装CUPS-PDF虚拟打印机:配置与排错指南
2026/9/30 6:14:24 网站建设 项目流程

在UOS(统信UOS)或deepin(深度Linux)系统里,想把网页、文档、报表直接变成PDF文件,最省事的方案就是安装一个虚拟PDF打印机。这个场景我踩了好几次坑,因为系统默认不带这款工具,很多人上来就找商业PDF编辑器,其实一个CPUS-PDF就能解决问题——当然,更准确的名字是CUPS-PDF,中文社区里常被念成“CPUS-PDF”,本文就用这个大家更熟悉的名字来写。

这篇文章适合谁看?一是正在用UOS、deepin办公,经常需要把业务系统单据、网页、文档“打印”成PDF的普通用户;二是给公司批量部署国产系统打印环境的技术人员。我会把安装前的准备、三种安装方式、配置文件核心参数、实际打印测试,以及我遇到过的各种坑,全部拆开讲清楚。哪怕你之前完全没碰过Linux命令行,跟着步骤操作也能搞定。

1. 这个东西是什么,为什么UOS/deepin用户要用它

1.1 CPUS-PDF的前世今生:其实叫CUPS-PDF

先把这个名字说清楚。在Linux生态里,负责打印服务的组件叫CUPS(Common Unix Printing System),几乎所有Linux发行版都靠它管理打印机。CUPS-PDF就是在CUPS基础上增加的一个“虚拟打印机”,它不连接任何物理设备,而是把发送给它的打印任务直接转成PDF文件,保存到指定目录。

用户下载这个工具时,经常在压缩包里看到文件名前缀是“cups-pdf”,在终端包管理器里搜索也是“cups-pdf”,但中文输入法顺手一打,就变成了“CPUS-PDF”。我把两种写法都在搜索框里试过,都能搜到资料,说明这个口误在中文社区已经广泛存在。如果你去英文官网看,绝大多数场合写的都是CUPS-PDF,本文后续涉及配置文件、包名和命令时,我会统一用“cups-pdf”这个真实名称,标题里保留用户更熟悉的“CPUS-PDF”。

这个工具的实现原理其实很朴素:它虚拟出一个PostScript打印机队列,当用户打印时,CUPS会把应用传来的数据交给Ghostscript处理,再通过cups-pdf的过滤脚本写入一个PDF文件。整个过程对用户完全透明,你只需要像打印到普通打印机一样操作,最后去指定文件夹拿结果就行。

1.2 虚拟PDF打印机的适用场景

为什么UOS/deepin用户特别需要这个虚拟打印机?我从实际工作里总结了几类高频场景。

第一类是业务系统单据归档。很多政务、企业系统只提供打印按钮,不提供导出PDF功能,比如报销单、审批表、合同页面。直接打印到纸张要耗纸耗墨,电子归档又不方便,装一个虚拟PDF打印机,随手就能把所有单据存成电子版。

第二类是网页保存。浏览器确实自带“另存为PDF”功能,但遇到大页面、复杂表格、动态滚动区域时,保存出来的排版经常错位。借助虚拟打印机,浏览器打印对话框里选一下PDF打印机,渲染效果和真实Windows下的“Microsoft Print to PDF”几乎一致,排版基本不会乱。

第三类是软件交付和协同办公。比如开发人员要把程序用户手册导出给客户,普通员工要把演示文稿发给领导审阅,虚拟PDF打印机就能把能打印的内容统一变成标准PDF,避免不同系统字体缺失导致文档乱码。

试想一下,你刚把一台UOS专业版电脑发给财务部同事,对方马上要去报销系统打一张电子发票打印件作为附件,没有虚拟PDF打印机就只能截图,截图后又不能作为正式凭证。装好CPUS-PDF之后,这类问题一分钟解掉。

2. 安装前的准备:系统、依赖和软件源

2.1 确认系统版本和CPU架构

动手安装前,先确认你的系统版本。这里有个容易踩坑的点:UOS和deepin虽然同源,但软件仓库的完整程度、包版本都不一样。UOS主要分专业版、个人版、社区版,deepin目前主推20.x和23系列。命令查看版本:

cat /etc/os-release uname -m

第一行命令能看到系统名称和版本号,比如uos 20或者deepin 23;第二行看CPU架构,x86_64是Intel/AMD 64位机器,aarch64是ARM架构机器(常见于国产飞腾、鲲鹏处理器的设备)。

为什么强调架构?因为后面从源码编译时,依赖包路径和编译参数会因架构不同而稍有差异。如果用的是UOS ARM版,软件源里不一定预编译了cups-pdf,编译安装时也可能缺少某些优化指令集。我见过几个人在龙芯(LoongArch)机器上直接装x86的deb包,报错一堆,最后还得重新找对应架构的包。

2.2 配置软件源和安装依赖

UOS和deepin的软件源默认可能指向官方镜像,速度不太稳定,建议先切换到可用的镜像源。打开终端,编辑软件源配置:

sudo deepin-editor /etc/apt/sources.list

如果系统提示没有deepin-editor,就换成:

sudo vim /etc/apt/sources.list

在文件里写入国内镜像源地址,例如:

deb https://community-packages.deepin.com/beige/ beige main commercial community

不同版本源地址差异较大,如果写错源会导致后续apt update报错。最稳妥的做法是保留系统原有源,先执行sudo apt update看看能否正常更新。源没问题的话,直接安装基础依赖包:

sudo apt update sudo apt install -y cups ghostscript libcups2-dev libcupsimage2-dev

缺少ghostscript或libcups相关库,后面无论是安装deb包还是编译源码,大概率会在运行时报“系统无法执行过滤文件”的错。这几个依赖看起来不起眼,却是整个PDF转换链路里的关键角色:CUPS把打印任务交给cups-pdf,cups-pdf调用Ghostscript解释PostScript并生成PDF。任何一个环节缺失,打印机状态都会变成“已停止”。

3. 安装CPUS-PDF的三种方式

3.1 方式一:通过apt直接安装(推荐)

大多数UOS和deepin版本,软件源里已经收录了cups-pdf包,这是最省事的安装方式:

sudo apt update sudo apt install cups-pdf

安装完成后,先检查CUPS服务是否正常运行:

sudo systemctl status cups

如果服务未运行,启动它:

sudo systemctl enable --now cups

正常情况下,此时已经可以通过打印设置界面看到一台名为“PDF”的打印机。如果看不到,尝试重启CUPS服务:

sudo systemctl restart cups

这种安装方式的优点是包管理工具会自动处理所有依赖,卸载也干净。缺点也很明显:部分UOS专业版软件源里根本没有cups-pdf这个包,或者包版本偏旧,这时就得换其他方式。

3.2 方式二:源码编译安装

我的测试机是一台UOS 20专业版,默认源里没有cups-pdf,后来走的就是源码编译路线。这里把详细步骤写一下,关键依赖先装齐:

sudo apt install -y build-essential cups ghostscript libcups2-dev libcupsimage2-dev

下载源码包。官方发布页面地址比较直观,用wget下载:

wget https://www.cups-pdf.de/photorec/cups-pdf_3.0.1.tar.gz tar -xzf cups-pdf_3.0.1.tar.gz cd cups-pdf_3.0.1

源码编译分两步:先编译,再安装:

make all sudo make install

执行完毕后,系统会自动把PDF虚拟打印机相关文件放到CUPS的过滤器目录、PPD目录和后台设备目录。接着把CUPS服务重启一次:

sudo systemctl restart cups

注意,源码编译方式下,如果之前装过其他版本的cups-pdf,编译安装前最好先卸载干净,否则配置文件可能被覆盖或混用。

3.3 方式三:手动下载deb包安装

如果不想编译,又嫌apt源里没包,还可以直接从Debian或Ubuntu官方仓库下载对应架构的deb包来安装。比如Debian 11(bullseye)仓库里有cups-pdf,可以在支持的环境下先下载:

# 在可联网且架构匹配的Debian/Ubuntu机器上操作 apt download cups-pdf

把下载好的cups-pdf_*.deb文件拷贝到你的UOS机器上,然后安装:

sudo dpkg -i cups-pdf_*.deb sudo apt-get install -f # 如果有依赖缺失,执行这行补装

这种方式适合UOS/deepin软件源里没有该包,但系统能运行Debian系deb包的场景。不过要特别提醒:请从系统源或可信渠道获取deb包,不要在网上随意下载来源不明的安装包,安全性没保障。我一般只在官方仓库或受信任的Debian镜像站下载。

三种方式放在一起对比,帮你快速选:

安装方式适合场景优点缺点
apt直接安装软件源内有cups-pdf依赖自动解决,卸载干净源里可能没有该包
源码编译源里没有,或需要最新版可控性强,版本新需要编译环境,时间久
deb包安装能获取到对应架构deb包快速省事,不依赖本地编译依赖版本可能不匹配

4. 配置CPUS-PDF:输出目录、权限和PDF选项

4.1 cups-pdf.conf核心参数

安装完成后,真正决定PDF文件输出到哪、文件权限如何、文件名规则怎样的,是配置文件/etc/cups/cups-pdf.conf。我建议每个管理员都亲自看一眼,不要贸然使用完全默认配置。

sudo vim /etc/cups/cups-pdf.conf

这个文件里有很多参数,每个参数前面都有详细注释,但最核心的几个我单独拿出来解释。

第一个是OutDir,输出目录。默认值是${HOME}/PDF,也就是每个用户打印后,文件生成在自己的家目录下的PDF文件夹。如果只有你自己用,这个设置没问题。但如果公司有几台电脑,员工打印后要去自己家目录找,或者需要在共享文件夹里集中收集PDF,默认值就不够用。我把这个参数改成这样:

OutDir /srv/PDF

这样所有用户的打印任务都会输出到服务器的/srv/PDF目录,方便集中管理。改完后一定要设置好目录属主和权限,否则普通用户没权限写入。

第二个是AnonDirName,匿名用户输出目录,默认/var/spool/cups-pdf/ANONYMOUS。当打印请求不是来自已登录系统账号的时候(比如通过网络匿名IP打印),文件会落到这个目录。这个参数一般不需要动,但多用户共享打印机时建议检查一下。

第三个是UserUMask和Permission,这两个决定生成文件的权限。默认UserUMask 022表示文件权限为644,也就是属主可读写,其他人只读。如果多个人需要协作编辑这些PDF,可以把权限放宽到Permission 0666,允许所有用户读写。

第四个是TitlePref,控制PDF文件名生成方式。值0表示优先使用打印任务自带标题,值1表示使用打印文档内嵌标题,具体效果和应用程序设置有关。我习惯保持默认,遇到文件名乱码时再到这里调整。

4.2 输出目录和权限设置

上面提到把OutDir改成/srv/PDF,这里隐藏着一个新手极容易犯的错:目录权限不对,打印任务显示“成功完成”,但PDF文件却不见了。因为CUPS实际上是以后台用户lp的身份在写文件,如果/srv/PDF不属于lp用户或者权限是700,写文件就失败了。

我用的权限分配方案是:

sudo mkdir -p /srv/PDF sudo chown nobody:nogroup /srv/PDF sudo chmod 1777 /srv/PDF

1777是在普通777权限基础上加了粘贴位,和系统/tmp目录权限一致。这样任何用户都能在里面创建文件,但只有文件属主能删除自己的文件,不会误删别人的PDF,多用户环境下很合适。

如果你是单机使用,把输出目录保持为默认的${HOME}/PDF也完全可以,毕竟文件就存在自己家目录,不需要纠结权限。

4.3 自定义PDF元信息和压缩级别

配置里还有两个容易被忽略但对办公场景有用的参数:PDFVer和1 -dPDFSETTINGS。虽然这些值大多在PPD文件里定义,但cups-pdf.conf里也能看到其影响。

Ghostscript生成PDF时,可以指定PDF版本,比如1.4、1.5、2.0,大部分场景不需要专门调整。压缩级别PDFSETTINGS有/screen、/ebook、/printer、/prepress几个选项,分别对应低清晰度、一般清晰度、高清晰度和印刷级。如果公司要归档截图类文件,压缩太狠文字会模糊;如果只是日常存个网页,用/ebook就够了。我一般不在配置文件里全局改,而是在实际打印时,通过应用打印对话框调整。因为全局调的太细致,终端用户感知不到,反而容易质疑“PDF怎么这么糊”。

5. 实际打印测试和使用场景

5.1 从办公文档打印成PDF

安装和配置都完成之后,真正验证效果最好的办法就是拿一份真实文档打印。在UOS自带的WPS Office或LibreOffice里打开一个docx文件,按Ctrl+P呼出打印对话框:

  1. 打印机列表里选择“PDF”,也就是刚才安装好的虚拟打印机。
  2. 点击“属性”,可以设置纸张大小、方向、缩放比例。
  3. 点击“打印”。
  4. 去/srv/PDF或~/PDF目录查看生成的PDF文件。

这时你可能会发现一个现象:打印对话框里的打印机名字叫“PDF”,而不是“CPUS-PDF”,这是正常的。cups-pdf安装后在CUPS中的队列名就是“PDF”。如果系统输出队列名是“Print-to-PDF”,那可能是发行版自定义了名称,原理一样。

5.2 从浏览器和阅读器打印成PDF

浏览器打印网页是另外一个高频场景。在Chrome、Firefox或者UOS默认浏览器里按Ctrl+P,然后在目标打印机里选“PDF”,最后点“保存”。这种方式得到的PDF包含网页的排版样式,超链接也可以保留,比“另存为网页”更可靠。

具体细节上,打印前要检查两点:纸张大小和边距。有的网页内容宽,默认A4纵向打印时会被截断,建议在打印预览里把尺寸改成A4,边距选“默认”或者“无”,页面缩放选“适合页面”。UOS里部分浏览器还能在“更多设置”里勾选“背景图形”,如果打印的是报销单或公告页面,这项很关键,否则背景色和表格线会全部丢失。

PDF阅读器打印也是常用的,比如要批量合并多个PDF文档,或者给PDF做手写批注后输出成新的PDF。直接用阅读器的打印功能选择PDF打印机,系统会把原文件重新排版生成一份新的PDF,本质上是对文件做了一次“光栅化再组合”,可以顺手把一些复制保护属性去掉(仅限你自己有权限的文件)。

5.3 终端环境下的打印命令

对于习惯命令行的用户,打印测试不必依赖图形界面,可以用lp命令直接往虚拟打印机发任务:

echo "Hello PDF" | lp -d PDF

或者指定打印某个文件的路径:

lp -d PDF -o media=A4 /tmp/test.txt

-o media=A4指定纸张类型,其他常用选项还有:

lp -d PDF -o orientation-requested=3 /tmp/sample.txt # 3代表逆时针旋转90度 lp -d PDF -o number-up=2 /tmp/book.txt # 每页放2页内容,节省纸张

命令执行后,终端会返回打印任务编号,比如request id is PDF-18 (1 file(s)),然后去输出目录看有没有对应的PDF生成。lpstat -t能查看打印机的完整状态,CUPS服务异常时,这个命令能很快定位问题。

6. 常见问题与排查技巧

6.1 打印机列表中看不到PDF打印机

这是最常遇到的问题。明明已经装了cups-pdf,打印对话框里却找不到“PDF”打印机。

首先检查CUPS服务状态:

sudo systemctl status cups

如果服务未运行,启动并设为开机自启:

sudo systemctl enable --now cups

其次检查CUPS是否识别到PDF队列:

lpstat -p -d

正常情况下会输出类似:

printer PDF is idle. enabled since ...

如果输出里没有PDF打印机,有几种可能:安装过程不完整、系统在安装前已经处于异常状态。重新执行安装命令,或者重启机器,很多问题在重启后才自动恢复。

还有一个细节:UOS桌面版可能存在“打印设置”图形界面显示异常,但底层CUPS里打印机是正常的。这时优先看命令行结果,不要只看图形界面。

6.2 打印后没有生成PDF文件

打印任务显示“成功完成”,但输出目录里文件不存在,这是最让人抓狂的。排查思路从权限和日志入手。

第一步:确认输出目录真的存在。如果你想自定义OutDir但没创建目录,或者目录权限不对,CUPS写文件就会失败。执行:

ls -ld /srv/PDF

第二步:查看cups-pdf日志,默认日志路径是/var/log/cups/cups-pdf_log:

sudo cat /var/log/cups/cups-pdf_log

日志里会明确记录文件生成了没有、写到哪去了、失败原因是什么。常见错误是Permission denied,说明目录权限设置不当;另一种是No such file or directory,说明目录不存在。

第三类比较隐蔽,输出目录存在但用户是systemd通过服务调用,实际写文件时用的是CUPS后台用户lp,不是你自己。用ls -ld确认目录对lp用户或者other有写权限,具体权限方案前面已经演示过。

6.3 文件权限、中文文件名乱码问题

中文环境下,PDF文件名乱码是个高频问题。比如打印“项目验收报告.docx”,生成的文件名变成了一串乱码或/tmp/xxx.pdf。原因有两种:一是打印任务自带的标题编码不是UTF-8;二是Ghostscript在解析过程中把标题信息转成了奇怪的格式。

最简单的处理办法是改配置,把标题生成方式设置成自动:

TitlePref 0

如果不行,再设置成使用原始标题以外的自动生成模式:

TitlePref 1

改完之后重启CUPS服务再测试。这个方法我在deepin 20上实测对LibreOffice的文档有效,但WPS有时仍会乱码,那种情况直接手动重命名文件就好。

文件权限问题也很常见。默认生成的文件是644权限,其他用户只能读但不能改。如果公司需要让多个同事在PDF上做批注,就要把权限放宽到666:

Permission 0666

改配置文件后重启CUPS:

sudo systemctl restart cups

6.4 如何卸载和重装

遇到安装混乱、永久性问题,干脆卸载重装。如果当初是用apt安装的,卸载很干净:

sudo apt remove --purge cups-pdf sudo apt autoremove

如果当初是源码编译安装,需要手动清除文件。去/usr/lib/cups/backend/下删除pdf相关文件,去/usr/share/cups/model/下删除cups-pdf的PPD文件,再删除配置文件:

sudo rm /usr/lib/cups/backend/pdf sudo rm /usr/share/cups/model/cups-pdf.ppd sudo rm /etc/cups/cups-pdf.conf

最后重启CUPS服务,确认系统里已经看不到PDF打印机,然后再重新安装。

这里我列一个速查表,方便你在排查时直接对照:

现象可能原因排查方式解决方向
看不到PDF打印机CUPS未启动systemctl status cups启动并设置开机自启
看不到PDF打印机包没装上lpstat -p -d重新安装
打印成功但没文件输出目录权限不对ls -ld /srv/PDFchmod 1777 输出目录
打印成功但没文件日志文件不生成查看cups-pdf_log按日志定位失败原因
中文文件名乱码标题编码问题改TitlePref设为0或1
生成的文件无法编辑文件权限太低查看Permission设为0666

7. 踩坑经验与进阶玩法

7.1 让PDF输出到共享目录

前面我建议把OutDir设置为/srv/PDF,这其实已经为团队共享打好了基础。把整个目录通过Samba或NFS共享给局域网用户,所有员工打印出来的PDF文件就能自动集中到一台服务器,再配合定时清理脚本,归档很方便。

实际部署时注意一点:如果共享目录在Windows客户端挂载,NTFS或者FAT文件系统对文件名的字符集要求比较严格,中文文件名在Windows下可能显示成乱码。最稳妥的方案是输出目录放在Linux分区,再通过Samba共享,不要直接把输出目录设置到Windows挂载点上。

7.2 结合cups-browsed实现局域网共享

多台UOS机器想共用一台装了CPUS-PDF的打印机,不需要每台都装一次cups-pdf。在装有虚拟打印机的服务器上,CUPS本身就能通过IPP协议共享打印机,客户端直接添加网络打印机即可。

服务端确认共享设置:

sudo cupsctl --share-printers sudo cupsctl --remote-any

客户端打开打印设置,选择“添加打印机”,输入服务端IP地址,例如ipp://192.168.1.100:631/printers/PDF,系统会拉取服务端的认证和驱动信息,然后就可以直接使用。这个方案在公司办公环境里尤其有用,一台电脑配置好,整个部门都能用。

7.3 与办公系统、云打印的配合

很多国产信息化项目里,业务系统跑在Web上,用户在浏览器里点“打印”,系统调用的是本地默认打印机。装好CPUS-PDF后,可以把系统默认打印机设为PDF打印机,这样所有打印操作都直接落成电子版,再从/srv/PDF里做二次分发。实测过一些业务系统,流程能正常走通。

还要提醒一句:UOS环境下打印PDF时会调用系统Ghostscript字体渲染,如果某些PDF里的字符乱码,通常是系统缺少相应字体导致的,装一下系统字体库,比如fonts-noto-cjk,能解决大部分显示问题:

sudo apt install fonts-noto-cjk

写在最后

这次把CPUS-PDF(cups-pdf)在UOS和deepin上的整套玩法梳理了一遍,从安装到配置再到排错应该都覆盖到了。我在实际使用中最大的体会是:工具本身不难,反而是系统差异和文件权限这类环境问题更费时间。如果你手头的UOS版本源里直接能装cups-pdf,那就少了很多折腾;如果装不上,源码编译也不是什么困难的事,按步骤来就行。

最后再分享一个小技巧:装好后建议立刻打印一张测试页并检查输出文件名和权限,别等要用的时候才发现PDF根本生成不出来。这个工具配置一次就能常年服务于日常归档,值得你花十几分钟彻底搞定。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询