PdfDing 介绍与选型指南
面向准备自托管 PDF 管理平台的读者,讲清 PdfDing 的定位、功能特性与同类组件量化对比,并给出什么场景选它、什么场景别选它的决策依据。
PdfDing 介绍与选型指南
目标:面向准备自托管 PDF 管理平台的读者,讲清 PdfDing 是什么、能做什么、与其他同类组件的量化差异,并给出「什么场景选它、什么场景别选它」的决策依据。本文为认知篇,全部数据均来自官方仓库、官方文档站与公开徽章服务,查询日期 2026-10-29。
一、环境信息
本文为软件介绍与选型篇,不依赖本地部署,信息来源与查询日期如下:
- 项目仓库:codeberg.org/mrmn/PdfDing(主仓库);github.com/mrmn2/PdfDing(原 hrushi20/PdfDing,现已迁移,仓库描述为 "NOW MANAGED ON CODEBERG")
- 官方文档站:docs.pdfding.com(含 Getting Started / Configuration / Guides 三组文档)
- 官方镜像:hub.docker.com/r/mrmn/pdfding(amd64 / arm64)
- Kubernetes 部署:官方 Helm Chart,仓库地址 charts.pdfding.com
- 查询日期:2026-10-29;星数与版本号取自 shields.io 徽章服务实时数据
- 撰写时最新稳定版:v1.14.1(Codeberg Releases
/releases/latest重定向指向tag/v1.14.1,为安全修复版本)
💡 说明:PdfDing 于 2026 年将主仓库从 GitHub 迁至 Codeberg,GitHub 侧仓库保留为只读镜像(星数冻结在迁移前约 1.8k,Codeberg 侧重新计数)。检索项目时两个地址都会命中,以 Codeberg 为准。
二、软件概述
PdfDing 是一个自托管的 PDF 管理器、阅读器与编辑器(Selfhosted PDF manager, viewer and editor),由开发者 mrmn2(原 GitHub 用户 hrushi20)个人维护,采用 AGPL-3.0 许可证开源。它的定位可以概括为「把个人/小团队的 PDF 文件集中存到自己的服务器上,用浏览器完成上传、打标签、阅读、批注、签名与对外分享」的一站式工具。
与重度文档 OCR 识别派(如 Paperless-ngx)和 PDF 处理工具箱派(如 Stirling-PDF)不同,PdfDing 的重心在「阅读与整理」:内置 pdf.js 查看器直接在浏览器里翻页阅读,阅读进度、阅读时长、高亮与评论都会被记录;同时支持在查看器内直接编辑——添加批注、签名、高亮、手绘,保存后回写服务器上的文件。
技术选型上,PdfDing 是一个典型的轻量级单体应用:Python Django 框架 + htmx 前端 + Tailwind CSS + pdf.js,默认使用 SQLite 存储,可切换 PostgreSQL;后台任务(consume 目录定时导入)由 Huey 调度;HTTP 服务由 Gunicorn 提供;静态文件经 WhiteNoise 压缩后由应用进程直接吐出。整个系统只需要一个官方容器即可运行,官方同时提供 SQLite 与 PostgreSQL 两套 Compose 编排和一套 Helm Chart。
💡 技术拓展:自托管 PDF 类工具当前主要有三类流派,选型时先分清流派再看细节——
流派 代表 核心思路 适合谁 文档管理+OCR 归档 Paperless-ngx、Docspell 扫描件批量导入、OCR 全文检索、自动归档 大量纸质文档电子化 PDF 工具箱 Stirling-PDF、Signature PDF 页面拆分合并、压缩、转换等无状态处理 偶尔处理文件、不想入库 PDF 阅读与管理 PdfDing、Papermerge 在线阅读器+批注+标签+分享,文件为中心 精读 PDF、个人知识管理 PdfDing 属于第三类,且是该流派中部署最轻的一个(单容器 + SQLite 即可)。
三、核心架构
PdfDing 的架构在官方仓库(codeberg.org/mrmn/PdfDing,分支 master,查询日期 2026-10-29)中可以完整读到,主要组成部分如下:
| 组件 | 技术 | 职责 |
|---|---|---|
| Web 框架 | Django 5.x | 路由、模板、ORM、认证(django-allauth) |
| 前端交互 | htmx + Alpine.js + Tailwind CSS | 无重前端构建的局部刷新交互 |
| PDF 查看器/编辑器 | pdf.js v6(构建时经 terser 压缩) | 浏览器内渲染、批注、签名、绘制 |
| 应用服务器 | Gunicorn(gthread worker) | 处理 HTTP 请求,WORKERS/THREADS 可调 |
| 后台任务 | Huey(SQLite 文件 db/tasks.sqlite3) | consume 目录的定时导入任务 |
| 数据库 | SQLite(默认)/ PostgreSQL(可选) | 用户、PDF 元数据、标签、分享记录 |
| 对象存储 | 本地文件系统 | media/<用户ID>/default/pdf/ 等目录 |
| 静态文件 | WhiteNoise(Gzip+Brotli 压缩) | 直接由应用进程提供静态资源 |
| 邮件 | Django EmailBackend(CONSOLE/SMTP) | 注册验证、密码重置等账号邮件 |
| 认证 | django-allauth + django-mfa | 邮箱密码、MFA(TOTP/恢复码/WebAuthn)、OIDC SSO |
几个对部署决策有直接影响的设计点:
- 单进程单体 + 嵌入式数据库默认:默认 SQLite 下整个系统只有一个应用进程和一个 Huey 线程,没有外部依赖,备份就是拷贝一个
db.sqlite3文件。 - 媒体目录按用户分片:PDF 文件、预览图、缩略图分别落在
media/<用户ID>/default/{pdf,previews,thumbnails}/,文件与数据库记录分离,可独立做文件级备份。 - 运行在非 root 用户:官方镜像以
nonroot(uid/gid 1000)运行,bind mount 时宿主目录属主要与 uid 1000 匹配,这是自托管时最常见的踩坑点。 - 安全模型围绕分享链接展开:对外分享通过
shared/<标识符>公开页建立访客会话,支持密码、最大查看次数、定时删除三重约束(详见下文功能特性)。
四、功能特性
以下功能清单整理自官方文档站 guides 章节与 v1.7.0–v1.14.1 的 Release Notes(查询日期 2026-10-29):
- 上传与组织:单文件上传、批量上传(bulk add,支持同名同大小去重跳过)、consume 监控目录自动导入(按 cron 周期扫描,自动打标签、导入后删除源文件);多级标签(
a/b/c最多两级子标签)、树形/平铺两种展示、星标与归档、批量操作(v1.8.0 引入)。 - 阅读与批注:pdf.js 查看器内嵌阅读,记录阅读进度(页码)与阅读时长;查看器内直接编辑——批注、签名、高亮、手绘,保存即回写;高亮与评论有独立的全局视图页。
- 检索:全局搜索;v1.13.0 引入高级搜索(Advanced PDF Search)与搜索弹窗。
- 元数据:v1.10.0 引入 PDF 元数据查看/编辑,支持 BibTeX 导入导出(面向科研文献场景)。
- 分享:单 PDF 或整个集合(Collection,v1.9.0)生成公开链接,可设密码、最大查看次数(max views)、定时删除(
NdNhNm格式),支持二维码(SVG)输出;分享有独立管理页,可随时下架。 - 多用户与协作:用户注册(可开关)、邮箱验证、管理员后台(用户管理/建号/改密/重置双因素)、工作区(Workspace)与集合(Collection)机制,v1.12.0 起按工作区用户分别记录阅读信息。
- 安全:强制 MFA 能力(TOTP + 恢复码 + WebAuthn)、「信任此浏览器」、OIDC SSO(可配 OIDC_ONLY 关闭本地密码登录)、CSRF/Session Cookie 安全标志、HSTS、SSL 重定向等标准项。
- 国际化:v1.7.0 引入 i18n 框架;界面主题 light/dark/system(v1.7.0 移除了 creme 主题,v1.13.0 移除了主题色选择)。
- 演示模式:内置 DEMO_MODE 环境变量(官方文档未列出,见配置详解篇),支持定时重置演示库、限制最大用户数。
版本节奏方面,2026 年 3 月至 10 月间发布了 13 个版本(v1.6.1 至 v1.14.1),平均每月 1–2 个,其中 v1.7.0(2026-03-29)、v1.8.0(06-05)、v1.9.0(06-22)、v1.10.0(07-09)、v1.11.0(07-24)、v1.12.0(08-02)、v1.13.0(08-11)为功能版本,v1.7.1、v1.7.2、v1.14.1 为安全版本。安全响应记录良好:CVE-2026-34376(分享认证绕过)在报告后 6 天内随 v1.7.0 发布修复;v1.7.1 修复分享过期/最大查看/删除绕过;v1.12.0 修复跨用户集合写入与备份恢复路径穿越。
五、快速开始(最小可用示例)
以下为官方文档站 Getting Started → Docker 页面给出的最小启动方式(docs.pdfding.com/getting_started/docker/,查询日期 2026-10-29),一条命令即可跑起一个 SQLite 版实例:
docker run --name pdfding \
-p 8000:8000 \
-v sqlite_data:/home/nonroot/pdfding/db -v media:/home/nonroot/pdfding/media \
-e HOST_NAME=127.0.0.1 -e SECRET_KEY=some_secret \
-e CSRF_COOKIE_SECURE=FALSE -e SESSION_COOKIE_SECURE=FALSE \
-d \
mrmn/pdfding:latest
启动后访问 http://127.0.0.1:8000 进入登录页,页面底部提供 Sign up 入口,注册后即可上传第一个 PDF。
关于该最小示例的三点解读:
HOST_NAME既是访问域名白名单(进入 Django 的ALLOWED_HOSTS与CSRF_TRUSTED_ORIGINS),也用于拼装账号邮件中的链接,本地 HTTP 试运行时需同时把CSRF_COOKIE_SECURE/SESSION_COOKIE_SECURE关掉,否则浏览器不回传 Cookie。SECRET_KEY用于签名会话与 CSRF 令牌,必须设为长随机值;生产部署若走 HTTPS,两项 Cookie 安全标志要改回TRUE。- 数据落在两个命名卷:
sqlite_data(数据库)与media(PDF 与缩略图),销毁容器不丢数据;生产建议改用 bind mount 便于文件级备份。
正式部署推荐使用 Docker Compose 并把环境变量一次性配齐,完整步骤与生产参数见 《PdfDing 1.14 Docker Compose 部署指南》,全部环境变量逐项解释见 《PdfDing 1.14 配置参数详解》。
六、适用场景与限制
适合的场景:
- 个人/小团队 PDF 精读库:文献、报告、合同等需要反复阅读和批注的 PDF,希望阅读进度、高亮、评论跟账号走。
- 对外定向分发:把文档以链接发给客户/同事,需要防扩散(密码)、防刷(最大查看次数)、定时失效(定时删除)与二维码物料。
- 低资源长期在线:家用 NAS 或 1C1G 级别的小服务器上长期运行,SQLite 形态无外部依赖。
- 科研文献管理:BibTeX 导入导出 + 多级标签 + 高级搜索,配合元数据页可承担轻量文献库角色。
限制与不适配的场景:
- 不做 OCR 与全文索引:扫描件无法全文检索(高级搜索面向元数据与标签),重度扫描归档应选 Paperless-ngx 或 Docspell。
- 不做无状态 PDF 加工:拆分、合并、压缩、格式转换不是它的目标,这类需求选 Stirling-PDF,两者可以共存互补。
- 个人自托管项目的固有风险:单一维护者、AGPL-3.0、2026 年才迁移到 Codeberg,企业级支持与长期保障弱于基金会项目;数据迁移成本(换系统需重传+重打标签)需纳入考量。
- 协作深度有限:工作区/集合提供基础多人协作与阅读统计,但不是分布式团队编辑系统;并发编辑同一 PDF 也不在其设计目标内。
- 编辑保存机制:官方文档明确提示,查看器内每次保存都会把整个文件重新传回后端,超大文件不适合频繁保存。
七、同类选型对比
下表为同领域可自托管的 PDF/文档管理组件的量化对比(星数与版本取自 shields.io 徽章服务,查询日期 2026-10-29;星数仅代表社区关注度,非质量指标):
| 组件 | Stars | 最新版本 | 许可证 | 技术栈 | 默认数据库 | 部署形态 | 定位差异 |
|---|---|---|---|---|---|---|---|
| PdfDing | 1.8k(GitHub 冻结) | v1.14.1 | AGPL-3.0 | Django + htmx + pdf.js | SQLite / PostgreSQL | 单容器 / Compose / Helm | 阅读器+批注+标签+受控分享 |
| Paperless-ngx | 47k | v3.3.4 | GPL-3.0 | Python(Django) + Redis + OCR | PostgreSQL / MariaDB / SQLite | 多容器 Compose | 扫描件 OCR 归档与全文检索 |
| Stirling-PDF | 95k | v3.2.2 | MIT/商业双许可 | Java (Spring Boot) | 无(无状态) | 单容器 | PDF 工具箱:拆合/压缩/转换 |
| Papra | 5.6k | @papra/cli@0.2.6 | AGPL-3.0 | TypeScript (Node) + Hono | SQLite / PostgreSQL | 单容器 / Compose | 轻量文档归档,OCR 集成中 |
| Docspell | 2.3k | v0.43.0 | AGPL-3.0 | Scala + JVM 多进程 | PostgreSQL / MariaDB / H2 | 多容器(restserver+joex 等) | 智能归类、邮件摄取、全文检索 |
| Papermerge | 549 | v3.5.3 | Apache-2.0 | Python (Django) + OCR | PostgreSQL / SQLite | 多容器 | 扫描件管理,文件夹式组织 |
| Signature PDF | 831 | v1.11.0 | AGPL-3.0 | PHP + pdf.js | 无(会话即弃) | 单容器 | 在线签名/盖章,用完即走 |
关键差异解读:
- 若核心诉求是「读」而不是「扫」,PdfDing 是该组中唯一把内嵌阅读器、阅读进度与时长统计、查看器内批注保存做成第一优先级的组件;Paperless-ngx 的浏览器预览仅用于核对识别结果。
- 若核心诉求是全文检索海量扫描件,选 Paperless-ngx(47k stars、OCR 生态成熟、多语言支持完善);Docspell 提供更智能的自动归类但 JVM 体系资源占用更高。
- 若需要的是一次性处理(压缩、拆分、签名、转换),Stirling-PDF 功能面最广且无状态;Signature PDF 专注签名场景且极轻。
- 若追求单容器极简 + 精读体验,PdfDing 与 Papra 最接近:都是 AGPL、单容器、SQLite 默认。差异在能力侧重——Papra 偏「文档仓库 + 分享」,Pdfra 偏「阅读器 + 批注」,Papra 目前社区热度更高(5.6k vs 1.8k),PdfDing 功能迭代节奏更快(月均 1–2 版)且已内置阅读时长/批注回写/集合分享。
- 部署复杂度排序(从低到高):Signature PDF ≈ Stirling-PDF ≈ PdfDing(SQLite 形态)< Papra < Papermerge < Paperless-ngx < Docspell。
「如果…则…」选型建议:
- 如果你是个人用户,想把自己的 PDF 收藏变成带标签、可批注、能外链分享的私人阅读站 → PdfDing。
- 如果你有大量扫描件要 OCR 检索归档 → Paperless-ngx(PdfDing 可作为其后的阅读层共存)。
- 如果团队需要一个「瑞士军刀」式 PDF 处理入口 → Stirling-PDF。
- 如果只做在线签署 → Signature PDF。
- 如果要企业级长期保障与商业支持 → 上述组件均为社区项目,需自建运维与备份策略,PdfDing 尤其建议锁定版本、定期备份数据库与媒体目录。
八、参考链接
- 项目主仓库(Codeberg):https://codeberg.org/mrmn/PdfDing
- GitHub 只读镜像:https://github.com/mrmn2/PdfDing
- 官方文档站:https://docs.pdfding.com
- Docker Compose 部署文档:https://docs.pdfding.com/getting_started/compose/
- 配置项官方说明:https://docs.pdfding.com/configuration/
- 官方 Helm Chart:https://charts.pdfding.com
- Docker Hub 镜像:https://hub.docker.com/r/mrmn/pdfding
- CVE-2026-34376 修复记录(v1.7.0):https://github.com/mrmn2/PdfDing/pull/294
- 相关文档:《PdfDing 1.14 Docker Compose 部署指南》、《PdfDing 1.14 配置参数详解》、《PdfDing 1.14 常用 CLI 命令与工具详解》