[AI Development Lab] 【deepin插件开发活动】+ DDE 虚拟 PDF 打印机-控制中心插件
Tofloor
poster avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-08-13 09:53
Author

【deepin插件开发活动】DDE 虚拟 PDF 打印机 —— 让 deepin 拥有「Microsoft Print to PDF」

作品名称:DDE 虚拟 PDF 打印机(dde-virtual-pdf-printer)
参赛方向:方向一 · 控制中心插件
源码仓库:https://github.com/Re-s/dde-virtual-pdf-printer
作品类型:CUPS 虚拟打印机(backend)+ DDE 控制中心插件


一、作品简介

在 deepin/UOS v25 上实现类似 Windows「Microsoft Print to PDF」的完整闭环:

任意应用 → 打印对话框 → 选择「DDE-PDF」→ 输出 PDF 到指定目录

并通过 DDE 控制中心插件提供图形化管理界面(打印机状态、PDF 文件管理、输出目录配置、使用帮助),安装即用。

💡 需求来源:论坛用户真实痛点。调研 2000 帖发现,用户迁移到 deepin 后打印机支持是办公障碍第一名(帖子 300634 / 300620),并有用户直接建议「装个 PDF 虚拟打印机」(帖子 300247)。详见 需求调研文档。

二、功能特性

  • ✅ 任意应用打印为 PDF:WPS / 浏览器 / LibreOffice 打印对话框直接可选
  • ✅ 控制中心管理模块「PDF 打印机」4 个页面:
    • 📊 打印机状态:一键安装 / 移除打印机
    • 📄 PDF 文件列表:浏览(名称/大小/时间)、打开、删除、打开目录
    • ⚙️ 设置:自定义输出目录(deepin 原生目录选择器)、自定义文件名模板、保留原文件后缀开关、打印后自动打开 PDF
    • ❓ 帮助:三步使用引导 + 常见问题 + 版本号显示
  • ✅ 自定义 PDF 文件名:支持 {title} / {jobid} / {date} / {time} 占位符模板,默认 {title}-{jobid}-{date}-{time}(如 采购单-42-20260813-103947.pdf),并可选保留原文档后缀
  • ✅ 输出目录可自定义:插件与 backend 统一读配置,修改后全局生效
  • ✅ 多架构支持:GitHub Actions 自动构建 amd64 / arm64 / loong64 三架构 deb 并发布 Release
  • ✅ 功能调用日志:每次操作记录到 ~/.cache/deepin/dde-control-center/pdfprinter.log(含版本号),便于问题排查
  • ✅ 系统卸载入口:随包安装 .desktop 桌面入口(deepin 应用中心识别为可卸载应用),点击直达插件页
  • ✅ 安装即用:deb 包 postinst 自动创建打印机
  • ✅ 中文界面 + DCI 图标,深度融入 DDE 设计语言

三、截图

控制中心入口 打印机状态
入口 状态
PDF 文件列表 设置
文件列表 设置
帮助 输出目录(生成的 PDF)
帮助 输出目录

四、安装方式

方式一:安装 Release deb 包(推荐)

支持 amd64 / arm64 / loong64 三种架构(GitHub Actions 自动构建):

# 按你的系统架构选择(x86_64 用 amd64;飞腾/鲲鹏等 ARM 用 arm64;龙芯用 loong64)
wget https://github.com/Re-s/dde-virtual-pdf-printer/releases/download/v0.8.7/dde-pdf-printer_0.8.7_amd64.deb
sudo dpkg -i dde-pdf-printer_0.8.7_amd64.deb

安装完成即自动创建「DDE-PDF」打印机,打开任意应用打印对话框即可使用。

方式二:从源码构建

# 编译环境
sudo apt install -y build-essential cmake git \
  qt6-base-dev qt6-declarative-dev qt6-tools-dev linguist-qt6 libxkbcommon-dev \
  libdtk6core-dev libdtk6gui-dev libdtk6widget-dev dde-control-center-dev \
  cups cups-filters ghostscript

# 构建 + 打包(完整步骤见仓库 README)
git clone https://github.com/Re-s/dde-virtual-pdf-printer.git
cd dde-virtual-pdf-printer
cmake -S src/plugin -B build/integration -DCMAKE_INSTALL_PREFIX=/usr
cmake --build build/integration -j$(nproc)
# ... 按 README「构建」章节打包 deb

五、使用说明

  1. 打开任意文档(WPS、浏览器、LibreOffice 等)→ 打印(Ctrl+P)
  2. 打印机选择 DDE-PDF → 打印
  3. PDF 保存到默认 ~/PDF/(可在控制中心设置页修改输出目录、文件名模板、是否保留原文件后缀)
  4. 控制中心「PDF 打印机」→ 管理生成的 PDF 文件

六、开发过程说明(deepin Skills 使用)

使用的 Skill 模块

Skill 用途
dde-control-center-development 控制中心插件开发规范:
DccObject 页面结构、DCC_FACTORY_CLASS 注册、
插件打包(dcc_install_plugin)、翻译处理
dtk-development DTK6 应用框架:
DCI 图标规范、QSettings 配置、系统集成
dde-shell-development DDE 生态集成认知(插件加载机制、懒加载行为)
deepin-25-platform deepin 25 平台特性:ostree 只读系统、dpkg 打包写路径、CUPS 集成

关键技术点(开发过程中解决的难题)

  1. ostree 不可变系统适配:deepin 25 的 /usr 只读,CUPS backend 无法手动拷贝 → 用 deb 包 + --root-owner-group 走 dpkg 专用写路径
  2. CUPS backend 权限模型:backend 带 world 执行位会以 lp 用户运行(读不了用户 700 的配置)→ 权限 700 强制 root 运行,脚本内用 pwd.getpwnam 定位用户并 chown 输出文件
  3. 纯 QML 应用的目录选择:控制中心是 QGuiApplication,QFileDialog(Widgets)直接崩溃、QML FolderDialog 被 dde-file-dialog 接管行为不可控 → D-Bus 异步调用 com.deepin.filemanager.filedialog(createDialog → setFileMode(Directory) → accepted 信号 → selectedUrls)
  4. QML 编译缓存陷阱:QML 被编译进 lib_qml.so,改 QML 必须完整重建,否则旧代码生效(增量 make 不感知)
  5. Q_PROPERTY WRITE 陷阱:setOutputDir 是属性 WRITE 方法,QML 中不能当函数调(TypeError)→ 用属性赋值 dccData.outputDir = dir
  6. 多架构(arm64/loong64)CI 构建:GitHub Actions + debootstrap deepin beige rootfs 隔离构建(loong64 无原生 runner,用 qemu-user-static 用户态模拟);发现 arm64 静态库链 .so 必须 -fPIC(AArch64 严格要求,x86_64 侥幸通过)→ 全局 CMAKE_POSITION_INDEPENDENT_CODE ON;打包改用 make install DESTDIR 产物(插件路径由 CMake 决定,兼容 DCC API v1.0/v1.1)
  7. 自动化发布:tag 触发 → 三架构构建 → artifact 汇总 → gh api 手动上传 Release(gh --clobber 有 404 bug,改用「先删同名资产再 POST uploads」)

开发模式

采用 AI 辅助模块化开发:先 POC 验证 CUPS backend 可行性 → 定义接口契约(docs/contract.md)→ 服务层 / 插件 C++ / 插件 QML 三模块并行开发 → 集成验证 → deb 打包全链路测试。整个开发过程由 AI 编程工具 + deepin Skills 协作完成,对话记录截图见下。

AI 工具调用 deepin Skills 对话记录截图

AI 对话记录

上图展示 AI 编程工具调用 deepin Skills(dde-control-center-development / dtk-development / deepin-25-platform)辅助开发的关键过程:POC 验证 → 契约化并行开发 → 目录选择闪退修复(D-Bus 方案)→ 回写修复(WRITE 属性/QML 缓存)→ P0 增强与发布。

七、安全说明

  • ✅ 无任何网络请求(纯本地功能)
  • ✅ 无敏感数据采集(不读系统文件,仅操作输出目录)
  • ✅ 路径穿越 / 命令注入防护已实测(见 docs/security-audit.md)
  • ✅ 开源协议:GPL-3.0-or-later(OSI 批准)

八、项目文档

文档 链接
README(功能/安装/构建) https://github.com/Re-s/dde-virtual-pdf-printer
AI 二次开发引导(AGENTS.md) https://github.com/Re-s/dde-virtual-pdf-printer/blob/master/AGENTS.md
架构设计 https://github.com/Re-s/dde-virtual-pdf-printer/blob/master/docs/design.md
需求调研(2000 帖分析) https://github.com/Re-s/dde-virtual-pdf-printer/blob/master/docs/forum-print-survey.md
安全审查报告 https://github.com/Re-s/dde-virtual-pdf-printer/blob/master/docs/security-audit.md

Release:https://github.com/Re-s/dde-virtual-pdf-printer/releases/tag/v0.8.7 (三架构 deb 包 + 截图,GitHub Actions 自动构建发布)

Reply Favorite View the author
All Replies
avatar
骑🐖追帅哥bot
Moderator
2026-08-13 10:09
#1

企业微信截图_20260813100907.png

Reply View the author
avatar
𰻞𰻝面
deepin
2026-08-13 10:55
#2

太强了!like

Reply View the author
avatar
晚秋(lateautumn)
Moderator
2026-08-13 11:55
#3

这个我很需要。applaud

龙电脑是不是也可以安装使用?

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-08-13 12:35
#4
晚秋(lateautumn):

这个我很需要。applaud

龙电脑是不是也可以安装使用?

理论上可以,需要交叉编译一份龙芯架构。

Reply View the author
avatar
MeGusta
deepin
2026-08-13 15:06
#5

挺好,我可以用它来替换cups-pdf了。

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-08-13 15:08
#6
晚秋(lateautumn):

这个我很需要。applaud

龙电脑是不是也可以安装使用?

https://github.com/Re-s/dde-virtual-pdf-printer/releases/download/v0.7.2/deepin-pdf-printer_0.7.2_loong64.deb

你试试这个能不能用

Reply View the author
avatar
晚秋(lateautumn)
Moderator
2026-08-13 15:11
#7

笔记本x86尝试了5次,安装成功。
image.png

Reply View the author
avatar
晚秋(lateautumn)
Moderator
2026-08-13 15:12
#8
neko:

https://github.com/Re-s/dde-virtual-pdf-printer/releases/download/v0.7.2/deepin-pdf-printer_0.7.2_loong64.deb

你试试这个能不能用

好的,谢谢。等我回单位用我的龙台式机,测试一下。

Reply View the author
avatar
zijinyise
deepin
2026-08-13 16:03
#9

20.9能用吗

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-08-13 16:45
#10
zijinyise:

20.9能用吗

我没测试,但25的dde-shell改动较大不一定能用,你可以安装测试一下行不行。

Reply View the author
avatar
MeGusta
deepin
2026-08-15 20:09
#11
neko:

https://github.com/Re-s/dde-virtual-pdf-printer/releases/download/v0.7.2/deepin-pdf-printer_0.7.2_loong64.deb

你试试这个能不能用

deepin-pdf-printer_0.7.2_loong64.zip

龙芯上的梯子客户端还没搞定,github上下载不下来,我传个附件。

在龙芯上运行正常。

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-08-16 01:53
#12
It has been deleted!
avatar
MeGusta
deepin
2026-08-16 08:47
#13

梯子搞好了,0.8.3正常用。

dde-pdf-printer_0.8.3_loong64.zip

Reply View the author
avatar
怪力熊玩Fedora
deepin
2026-09-01 17:39
#14

希望搞个RPM版本的

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-09-02 09:38
#15
怪力熊玩Fedora:

希望搞个RPM版本的

deepin没rpm系的吧,而且这个只适用于DDE桌面其它桌面不一定能加载插件。

Reply View the author
avatar
怪力熊玩Fedora
deepin
2026-09-02 10:18
#16
neko:

deepin没rpm系的吧,而且这个只适用于DDE桌面其它桌面不一定能加载插件。

希望有时间适配一下kde桌面版本的

Reply View the author
avatar
🐖¹².₁₃高老庄的书生℘࿐
deepin
2026-09-14 16:54
#17

是个好东西,我的UOS20折腾了下还是安装成功了,可以正常使用,非常感谢

Reply View the author