资讯动态

UOS/Deepin下CUPS-PDF虚拟打印机安装配置与排错实战

发布时间:2026/9/30 6:14:57 来源:尧图企业网站定制
最近帮朋友在一台统信UOS机器上折腾“虚拟PDF打印机”的时候又踩了一圈编译、驱动、权限的坑这问题在deepin、UOS的QQ群里也是隔三差五就有人问。很多人搜索的时候会把项目名打成“CPUS-PDF”其实正规叫法是CUPS-PDFCommon UNIX Printing System下的一个虚拟打印机后端全称是“CUPS-PDF Virtual PDF Printer”。它的作用很简单系统里多出一台名为“PDF”或“CPUS-PDF”的打印机任何软件调用打印功能时选这台打印机就会把文档直接生成PDF文件而不是真的打印到纸上。在UOS/deepin这类国产桌面系统上这个功能其实非常实用。企业报销、电子归档、OA流程、合同传递、学生交作业都依赖“文档转PDF”这一步。Windows系统下大家习惯用Adobe或WPS自带的导出Linux环境下最通用、最不依赖特定软件的做法就是装一个虚拟PDF打印机让任何应用都能通过标准打印接口输出PDF。这篇博文我就把整个安装过程、配置细节、常见坑完整拆开尽量做到照着操作就能成功。1. 先搞明白虚拟PDF打印机到底是怎么工作的很多人在第一步就卡住了不是命令不会敲而是没理解CUPS-PDF的原理导致出了问题不知道怎么排查。这里花点篇幅把机制讲透。1.1 虚拟打印机的核心逻辑整个链路其实和真实打印机是一模一样的只是最后一环从“把数据发给硬件”变成了“把数据交给一个后端程序去生成文件”。应用软件通过CUPS接口提交打印任务时CUPS调度器会拿到页面描述数据。真实打印机走的多是PostScriptPS或PCL语言CUPS负责把应用的数据转成打印机认识的格式。对CUPS-PDF而言这个“打印机”根本不认识纸张它只做一件事把收到的PostScript数据丢给PostScript解释器一般是Ghostscript由Ghostscript渲染并编码成PDF格式写入用户指定的输出目录。所以严格来说CUPS-PDF不只是CUPS的插件还依赖一个完整的PostScript解析环境。整个链路里任何一个环节缺失比如Ghostscript没装、PPD驱动没配对、CUPS后端文件权限不对都会导致打印失败或生成的PDF有问题。理解这层关系后排错思路就清晰多了。1.2 为什么UOS/deepin环境特别推荐这个方案UOS和deepin虽然也自带一些“导出PDF”的入口比如WPS可以直接另存为PDF浏览器也能直接打印成PDF但这些方案有几个实际痛点第一不是所有软件都有PDF导出菜单。有些老旧的业务系统、内部开发的小工具、行业专用软件只提供标准的打印按钮完全靠虚拟打印机兜底。第二统一处理路径。各家软件自己的PDF导出功能格式规则不一有的不带书签有的压缩率极高有的保留不了原始版式。走CUPS-PDF统一输出等于所有应用都从同一个口子出去行为一致性非常好。第三自动化方便。CUPS-PDF生成的PDF会按约定规则落在指定目录运维脚本、档案系统可以直接扫这个目录做后续处理省去了人工“另存为”的大量重复劳动。还有一点很多人忽略UOS这类系统在信创项目里部署量很大办公人员最熟悉的就是“打印”这个动作。你跟他们说“选择打印机PDF点确定”比教他们用各种软件的导出功能要省事太多。这就是虚拟打印机在国产系统环境里不可替代的原因。2. 动手前的准备工作环境检查与软件源安装CUPS-PDF的坑有一大半都出在准备阶段。依赖没装齐、软件源没配好、CUPS服务没起来后续编译和配置全都会表现成莫名其妙的报错。2.1 确认系统版本与CUPS服务状态第一步先看系统信息不同版本的UOS/deepin在依赖包名称上会有细微差别。cat /etc/os-release输出里会看到VERSION_ID和VERSION_CODENAME之类信息。目前常见的有deepin 20.9、UOS 20家庭版、UOS专业版1060系列等底层基本都是Debian体系包管理走得是apt。接着确认CUPS是否已经装好systemctl status cups桌面版一般会自动启动CUPS服务处理用户的所有打印需求。如果是精简安装或定制版系统可能压根没装CUPS。看到unit not found提示时先补上sudo apt install cups安装完再把服务拉起来并设置为开机自启sudo systemctl enable cups --now这里有个操作提示不要用service命令去管理UOS上的CUPS虽然兼容但systemctl能更清楚地看到启动日志和依赖关系排查问题时信息更完整。2.2 软件源切换与依赖包安装UOS/deepin安装deb包前建议先确认软件源是通的。很多生产环境机器在隔离网络里源配置可能是空的或者指向了不存在的镜像。相关热词里大家也在反复问“deepin切换软件源”确实重要。将源切换到可用镜像后更新索引sudo apt update接下来装编译CUPS-PDF需要的依赖。这里要区分清楚两个层面编译期依赖和运行期依赖。编译期需要有CUPS开发头文件和编译工具链sudo apt install build-essential libcups2-dev libcupsimage2-dev运行期必须有Ghostscript这是PDF生成的核心引擎sudo apt install ghostscript建议同时把简体中文字体包装上否则生成的PDF在中文字体处理上很可能出问题sudo apt install fonts-noto-cjk fonts-wqy-zenhei我在实际装的过程中发现libcupsimage2-dev这个包在部分UOS源里可能名称不同如果报错找不到包可以用apt-cache search libcups查一下实际名字再按实际结果安装。依赖装好后用general方式验证Ghostscript可用gs --version能输出版本号说明PostScript解释环境没问题后面编译和运行就算成功了一半。3. 源码编译安装CUPS-PDF的完整流程CUPS-PDF的安装方式和普通deb包不太一样它不是一个可以直接apt install的软件至少在UOS/deepin默认源里没有现成包。最靠谱的方式是下载源码包手工编译安装。整个过程并不复杂但每个步骤都有对应讲究。3.1 获取源码包源码可以从开源社区正常获取一般是一个tar.gz格式的压缩包。下载后用tar解压到工作目录wget 源码包链接 tar -xzf cups-pdf-*.tar.gz cd cups-pdf-*解压后目录里会看到Makefile、src、doc、CUPS-PDF.ppd等文件。如果下载的是从git仓库拉的源码一般还有configure脚本需要先跑configure再make。从发布版tar包走的话Makefile可以直接用。3.2 编译参数与依赖关系说明直接执行make前先看一眼Makefile顶部的配置说明。CUPS-PDF有几个关键的编译变量CUPS_BACKEND_DIRCUPS后端程序的安装目录一般是/usr/lib/cups/backendCUPS_MODEL_DIRPPD驱动文件的存放目录一般是/usr/share/cups/modelCUPS_DATADIR数据目录一般不需要动如果你的UOS系统CUPS目录结构有差异可以这样指定make all一切顺利的话编译过程会生成cups-pdf可执行文件和相关目录结构。接着安装sudo make installmake install会做几件事把后端程序cups-pdf复制到CUPS后端目录把CUPS-PDF.ppd复制到模型目录同时创建/var/spool/cups-pdf之类的缓冲目录。这些文件的位置在排查问题时非常重要建议装完后自己确认一下ls -l /usr/lib/cups/backend/cups-pdf ls -l /usr/share/cups/model/CUPS-PDF.ppd看到这两个文件在编译安装这一步就算稳了。值得一提的是网上有些人直接下载编译好的二进制包复制到对应目录也能用。但源码编译的好处在于动态库依赖、目录路径、PPD文件版本都和你本机环境完全匹配尤其是不同架构的UOS设备比如龙芯、鲲鹏、飞腾等很多现成二进制是x86的根本跑不起来源码编译反而是跨架构最稳妥的方式。3.3 编译后自检安装完成后建议做一次简单的自检验证后端程序能正常被CUPS调用。可以直接执行后端程序看帮助信息/usr/lib/cups/backend/cups-pdf正常情况下会输出类似“cups-pdf backend”的字样没有任何报错。如果提示缺少某个共享库用ldd命令查一下具体缺失项ldd /usr/lib/cups/backend/cups-pdf这是我强烈建议执行的一步因为很多UOS系统是精简安装个别动态库可能缺失。运行后端程序自检能提前暴露问题不用等配置完打印机才发现打印失败。我之前在龙芯机器上就遇到过ldd少了libcupsimage.so.2的情况补装对应的兼容库后才跑通。4. 把虚拟打印机注册进系统两种配置方式对比后端程序装好后CUPS系统里还没有这台打印机。你需要把“CUPS-PDF后端”注册成一个具体的打印机队列。这步有两种常见做法一种适合有图形界面、有桌面的运维人员一种适合远程终端或批量部署场景。4.1 图形化方式浏览器访问CUPS管理后台CUPS自带一个Web管理界面浏览器直接访问http://localhost:631这个页面其实比Linux系统自带的“打印机设置”工具要强大得多能直接看到每一个打印任务的完整状态、错误信息、原始日志。进入页面后点Administration再点Add Printer。此时需要输入系统管理员账号密码UOS下通常就是你的sudo账号。设备列表里会多出一项“CUPS-PDF (Virtual PDF Printer)”选中它继续。下一步选择厂商和型号。这里有个小技巧不要选“Generic PostScript”这类通用驱动直接在列表里找“CUPS-PDF”这是编译安装时PPD文件注册进来的名字和选项都匹配得最好。选中后确认添加打印队列就建好了。添加完成后把“Share this printer”选项按需勾选。同一局域网内的其他UOS/Linux机器可以通过IPP协议发现这台虚拟打印机远程提交打印任务直接生成PDF。这功能用来做集中文档归档特别实用。我实际部署时会让文件服务器跑UOS装好CUPS-PDF后共享给部门内其他机器使用效果很稳。4.2 命令行方式适合远程和批量部署没有图形界面的服务器版本或者需要多台机器批量拷贝配置时用lpadmin命令更高效sudo lpadmin -p CPUS-PDF -E -v cups-pdf:/ -m CUPS-PDF.ppd逐项解释-p CPUS-PDF打印机队列名为CPUS-PDF注意这个名称就是你后续用lp命令打印时填的名字-E启用打印队列-v cups-pdf:/指定后端设备URICUPS-PDF的URI固定为cups-pdf:/-m CUPS-PDF.ppd指定PPD驱动文件CUPS会去模型目录里查找匹配执行完可以用lpstat看一下打印机状态lpstat -p -d输出里出现“printer CPUS-PDF is idle. enabled since...”就代表队列成功。如果-m参数报找不到PPD检查上一步make install是否成功或者改用绝对路径sudo lpadmin -p CPUS-PDF -E -v cups-pdf:/ -m /usr/share/cups/model/CUPS-PDF.ppd这里补充一个实际经验lpadmin里-p后面设置的队列名后续会不会出现在应用打印对话框里取决于桌面系统能否正确发现CUPS队列。UOS桌面一般会自动同步如果没有打开系统自带的打印机设置工具手动添加一次也行。但底层队列还是这个不影响功能。5. 让PDF文件落在正确的位置输出目录配置CUPS-PDF装好后默认会把生成的PDF放到一个约定目录但这个目录未必符合你的习惯而且权限问题特别容易踩坑。这步一定不要跳过。5.1 默认输出路径分析CUPS-PDF的配置文件在/etc/cups/cups-pdf.conf核心参数是Out。默认值通常是Out: ${HOME}/PDF也就是每个用户执行打印时PDF生成到这个用户主目录下的PDF文件夹里。比如你的用户名叫uos文件就落在/home/uos/PDF。听起来很合理对吧但实际操作中这个“合理”藏着一个大坑如果/home/uos/PDF这个目录不存在cups-pdf后端能不能自己创建取决于目录权限和配置版本。很多情况下后端会尝试创建但如果父目录权限受限创建失败任务就直接报错连个明确的错误提示都不给。所以我的经验是安装完后先手动创建输出目录并确保权限正确mkdir -p /home/uos/PDF chown uos:uos /home/uos/PDF这里的用户名换成实际用户名。如果不想让PDF散落在各用户自己的目录里更方便的方式是统一到一个共享目录比如/data/PDF在cups-pdf.conf里改成Out: /data/PDF并保证cups用户通常是lp有写权限sudo mkdir -p /data/PDF sudo chown lp:lp /data/PDF注意这里有个细节CUPS-PDF后端进程是以lp用户身份运行的输出目录的写权限归lp用户而不是你的普通用户。这点和真实打印机生成文档的逻辑不太一样特别容易搞混。5.2 其他值得关注的打印选项cups-pdf.conf里还有几个参数实际使用频率很高UserPS2PDF指定PostScript转PDF的命令默认是/usr/bin/gs一般不用改。但如果你的ghostscript安装路径不标准这里要对应修改。SpoolDir临时缓冲目录默认/var/spool/cups-pdf。任务繁忙时多个打印任务会先写到这里再一个个转PDF目录空间不足会导致神秘失败。PDFVer生成的PDF版本号默认根据Ghostscript能力自动选择。早期有兼容性需求时可以指定PDFVer: 1.4或1.5老阅读器兼容性更好。Label是否给PDF文件加标签页批量打印多份文档时用来区分。一般保持默认。修改配置文件后需要重启CUPS服务才能生效sudo systemctl restart cups这里我多说一句很多人改了配置不重启然后跑到应用里测试发现还是按旧行为输出。这一步虽然不起眼但忘了它的人真不少。6. 实测从常用办公软件打印成PDF一切配置就绪后进入验证环节。测试打印建议从命令行开始因为终端输出信息最直接出了问题能看到日志。6.1 命令行测试先生成一个测试文件echo CUPS-PDF printer test for UOS test.txt然后提交打印任务lp -d CPUS-PDF test.txt任务提交后用lpstat查看状态lpstat -o正常情况下几秒钟后任务应该消失已完成同时在输出目录里出现test.pdf。用文件管理器或ls确认ls -l /home/uos/PDF看到test.pdf生成说明后端链路完全打通从命令行到Ghostscript再到文件输出整条路都是通的。6.2 图形界面测试桌面应用里以WPS Office和LibreOffice为例。打开任意文档CtrlP进入打印对话框打印机列表里选择“CPUS-PDF”或“CUPS-PDF”点打印然后等片刻PDF文件就出现在输出目录。很多人在这一步会遇到一个问题应用打印对话框里看不到刚建的打印机。原因往往是CUPS队列是命令行方式添加的桌面打印服务没有自动发现。解决办法有两类打开系统“打印机设置”工具点击添加系统会重新扫描CUPS队列扫描到后即出现在应用列表中。更稳妥的方法是在应用打印对话框里选择“其他打印机”或“系统打印对话框”选择通过CUPS发现的队列。WPS和LibreOffice这一点做得都比较好能直接走系统CUPS。我自己的习惯是配置完打印机后一定在两个地方都验证一遍一个用lp命令行一个用图形应用。因为后面上线给业务部门用他们只认图形界面里的打印机列表。6.3 打印参数调整CUPS-PDF支持在打印对话框里调整常规参数比如纸张A4/A3、纵向/横向、彩色/灰度、分辨率。这些参数会记录到PPD文件里实际转PDF时由Ghostscript执行对应处理。实测中如果只是简单文档归档分辨率设置300dpi就够了PDF文件体积适中。如果需要印刷级效果可以调600dpi但生成速度会明显变慢文件体积也成倍增加。打印大量图片型PDF时建议把“图像压缩质量”调低一点避免文件过大影响传输。需要说明的是虚拟打印机不涉及物理耗材“彩色”和“灰度”的区别只影响PDF内容呈现不影响任何成本。因此这类打印机参数可以根据使用场景灵活设没有实际打印消耗的顾虑。7. 使用中的高频问题与排查记录这部分内容是我最想写的部分。编译安装网上教程不少但真正让我花了时间的地方全是这些“看起来正常但结果不对”的问题。7.1 打印任务提交成功却一直Pending或错误症状lp -d CPUS-PDF test.txt后lpstat -o显示任务一直pending或者任务状态由processing直接变成aborted。排查思路按顺序来sudo tail -f /var/log/cups/error_log重点看有没有“File does not exist”或者“Permission denied”这类关键词。最常见的原因有两类Ghostscript没有正常启动。执行gs --version确认可用再检查cups-pdf.conf里的UserPS2PDF路径是否是/usr/bin/gs。输出目录权限问题。lp用户没有对输出目录的写权限。前面说过chown lp:lp这一步务必执行。还有一次我遇到过spool目录磁盘写满的情况在/var/spool/cups-pdf下生成临时文件时直接报空间不足。用df -h查一下是小事但出错表现和上面很像容易误判。7.2 生成的PDF文件是空白页或缺失内容症状打印任务正常完成目录里的PDF也存在但打开后一片空白或部分文字缺失。导致这类问题的原因往往是字体。Ghostscript在把PostScript转成PDF时如果原文档里的字体没有对应的系统字体内嵌会尝试用替代字体。替代字体中不含中文字符时生成的中文部分就是空白。解决办法从两个方向入手安装中文字体包fonts-noto-cjk、fonts-wqy-zenhei都装上。在原软件里尽量用常见字体比如宋体、黑体这些字体在Linux字体系里一般有对应替代。排查时有个技巧用Evince或Okular打开PDF前先用命令行工具pdfinfo、pdffonts看一下嵌入字体列表。如果发现中文字体名为“CIDFontF1”这类系统替换字体说明原字体没有被正确嵌入。这时回到原文档换一种字体重新打印问题大概率解决。另外部分过于专业的PostScript文件老的Ghostscript版本解析不了导致内容丢失。遇到这种情况可以升级ghostscript到新版本。UOS软件源里的gs版本通常偏低若真遇到解析问题从源码编译新版gs也是一条路但不建议一开始就走这条路。7.3 中文文件名乱码症状生成出的PDF文件名是一串乱码而不是原文档名称。CUPS-PDF的默认文件命名规则是“原文档名.pdf”。中文文档名在从前某些版本里因为字符编码处理不当会变成乱码。解决方式在cups-pdf.conf里调整Label参数或者用更简单的办法默认输出文件名改成按时间戳生成Label: 1配合一个固定前缀例如Prefix: PDF生成的文件名会变成类似PDF-20250612-134523.pdf。这种方法避免了所有中文编码问题对自动化采集目录中的应用来说也更友好。缺点是可读性下降。如果你更看重文件名的可读性建议升级CUPS-PDF版本新版对UTF-8文件名支持已经相当完善。7.4 系统更新后打印机消失这个问题主要出现在UOS进行大版本升级或者内核更新之后。CUPS服务配置还在但应用里找不到打印机队列。大多数情况是CUPS服务升级后没有自动启动。执行sudo systemctl restart cups sudo systemctl enable cups如果这样还不行用lpstat -p -d看看队列还在不在。队列丢失的话重新执行lpadmin命令添加即可目录配置和cups-pdf.conf文件一般都在不需要重做全套流程。还有个细节升级后/usr/lib/cups/backend/cups-pdf可能因为动态库变动而无法运行务必再执行一次ldd检查。亲测有一次系统更新后libcupsimage.so.2被替换成更高版本后端程序直接罢工重装一次cups-pdf即可解决。7.5 常见问题速查表症状可能原因排查命令/方案任务pending/abortedGhostscript未安装或路径错误执行gs --version检查cups-pdf.conf的UserPS2PDF任务错误输出目录权限不足chown lp:lp 输出目录生成PDF空白中文字体缺失安装fonts-noto-cjk重新打印文件名乱码字符编码问题修改cups-pdf.conf的Prefix、Label应用列表无打印机桌面未发现CUPS队列打开系统打印机设置手动添加更新后无法打印动态库或服务异常systemctl restart cupsldd检查后端程序8. 一些实际使用经验与后续扩展思路CUPS-PDF在UOS上跑起来之后使用体验会很稳定我这边部署了半年多基本没有再碰过。但有几个使用经验想分享给大家。第一输出目录设计尽量提前规划。如果只是个人使用默认的~/PDF完全没问题。如果是在单位部署建议服务端统一输出目录并且让运维脚本定时扫描归档。这个习惯能省下很多手动整理文件的时间。我见过有单位用文件服务器跑UOS加CUPS-PDF配合inotify监控输出目录自动把PDF按日期归档到网盘整个流程非常顺。第二结合CUPS本身的能力可以做得更多。CUPS-PDF只是其中一个后端同样机制下还可以接真实打印机、共享远程打印机、甚至是生成其它格式的后端。理解了CUPS的“打印队列后端程序PPD驱动”这个架构就可以基于它做很多定制功能。这在国产化替代场景里极其有用比如把旧系统的打印流程平滑迁移到新平台。第三配合UOS的软扫、电子签章、OA系统联动起来虚拟PDF打印机的价值还能再放大。很多办公系统要求最终文件必须带电子章或归档水印有了稳定的本地PDF生成通道再叠加后续自动化处理整套无纸化办公链条就完整了。我个人的体会是不要小看一台“虚拟打印机”的作用它往往是整个文档流转链路的起点。最后再给一个实用小贴士在UOS上如果不想编译安装系统中的WPS和永中Office都自带“输出PDF”的功能如果只是偶尔用用完全不用折腾CUPS-PDF。但如果你需要“任何软件都能打印成PDF”、需要批量部署到多台终端、需要统一输出路径做自动化归档那CUPS-PDF这套方案是绕不开的最优解花一两个小时编译配置一次后续收益非常可观。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑