- 后端
- 前端
- 企业应用
【免费下载链接】paperless-ng
A supercharged version of paperless: scan, index and archive all your physical documents
导读
Paperless-ng 是一个将纸质文档数字化的个人文档管理系统:借助文档扫描仪,它把成堆的纸质档案转变为可搜索的电子归档,并提供分类、自动匹配、全文检索等一系列实用工具。本文以官方使用概览文档(docs/usage_overview.rst)为主体,结合仓库源码(consumer、matching、index、mail 等模块)深入讲解核心术语、五种文档入库方式、OCR 配置、组织与搜索实践,以及官方推荐的全流程工作法——读完即可上手搭建一套"扫描即归档、搜索即所得"的个人文档库。
一、核心概念与术语
Paperless 本质上由两个相互配合的部分组成:
- consumer(消费器):持续监视指定文件夹,把放入其中的所有文档"消费"进系统——执行 OCR、建立索引并存储到媒体目录。核心实现见 src/documents/consumer.py。
- web server(Web 服务器):提供一个 UI,供你搜索、查看与管理已扫描文档。
每一份文档都有一组可赋值的字段(对应模型定义见 src/documents/models.py):
| 字段 | 含义 |
|---|---|
| Document(文档) | 一张可能包含有价值信息的纸 |
| correspondent(通信方) | 文档的来源方或接收方,可以是个人、机构或公司 |
| tag(标签) | 可自由赋给文档的标记。标签是"更强大的文件夹":多个文档可共享一个标签,单个文档也可拥有多个标签,这是普通文件夹做不到的。Paperless 之所以不实现文件夹,正是因为标签远比文件夹灵活 |
| document type(文档类型) | 用来界定文档类别,如信函、银行对账单、发票、合同等,用于说明"文档是关于什么的" |
| date added(入库日期) | 文档被扫描进 paperless 的日期,不可也不应修改 |
| date created(创建日期) | 文档最初签发日期,如购买产品日、签订合同日、信件寄出日 |
| archive serial number(档案编号,简称 ASN) | 文档在实体纸质档案夹中的编号,详见下文"推荐工作流" |
| content(内容) | 文档经 OCR 提取出的文本,会被送入搜索引擎,并用于匹配标签、通信方与文档类型 |
需要说明的是,在仓库当前版本中,"Frontend overview" 一节仍标注为TBD(待补充截图),故本文不展开前端界面细节,而聚焦于可验证的功能流程与配置。
二、把文档送进 Paperless
2.1 入库时的三步处理流程
一旦 Paperless 开始消费文档,会对文档依次执行以下操作:
- OCR 识别:如果文档没有文本层,则执行 OCR;数字文档通常自带文本,此步会被跳过。
- 生成 PDF/A 归档副本:Paperless 会从你的文档生成可归档的 PDF/A 文件。若文档来自扫描仪,将嵌入可选中的文本。
- 自动匹配:在存入数据库之前,Paperless 会对文档执行标签、通信方和文档类型的自动匹配。
从源码看,消费流程由 src/documents/consumer.py 的try_consume_file完成:先做前置检查(文件存在、目录创建、MD5 去重),再按 MIME 类型选取解析器解析文档、生成缩略图、提取文本与日期,接着通过load_classifier()加载分类模型做自动匹配,最后在事务中落库并复制原文件、归档文件与缩略图。
关于归档副本的配置:如果你不希望为数字文档生成归档版本,可通过环境变量配置PAPERLESS_OCR_MODE=skip_noarchive实现。完整的 OCR 配置说明见 docs/configuration.rst。
重要提示:无论你选择何种选项,Paperless 都会始终保存在消费目录或邮件中找到的原始文档,且绝不会覆盖它。归档版本与原版并排存储。
2.2 OCR 模式详解
Paperless 使用OCRmyPDF执行 OCR(见 docs/configuration.rst),并读取环境变量(见 src/paperless/settings.py)。PAPERLESS_OCR_MODE有四种取值:
| 模式 | 行为 | 适用场景 |
|---|---|---|
skip(默认) | 跳过所有已有文本的页面,仅在无文本的页面上执行 OCR | 最安全的选项,始终生成归档文档 |
skip_noarchive | 在skip基础上,当文档中找到任何文本时不再生成归档版本 | 不想在媒体目录保留两份几乎相同的数字文档;速度最快 |
redo | 对文档所有页面重新 OCR,尝试替换原有文本层 | 扫描仪自带 OCR 但效果不佳的文档;也会对纯数字文档执行 OCR。注意:该模式在含表单等无法移除特性的文档上可能失败,此时改用文档原有文本 |
force | 将文档栅格化,把文字全部转成图像,再把 OCR 文本压印其上 | 适用于所有文档,但生成文件可能显著变大,放大后文字不如原版清晰 |
与 OCR 相关的常用配置还包括:
PAPERLESS_OCR_LANGUAGE:OCR 语言,取 ISO 639 三位语言代码,默认eng;可组合多语言如deu+eng(注意多语言会显著增加 CPU 耗时;语言名含连字符如chi-sim时须写成chi_sim)。PAPERLESS_OCR_CLEAN:是否用unpaper预处理,取值clean(默认)、clean-final、none;clean-final与redo模式不兼容。PAPERLESS_OCR_DESKEW:纠正倾斜,默认true;与redo模式不兼容(自动禁用)。PAPERLESS_OCR_ROTATE_PAGES/PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD:自动纠正 90°/180°/270° 页面旋转,阈值默认12(15保守、2激进)。PAPERLESS_OCR_OUTPUT_TYPE:输出 PDF 类型,默认pdfa,可选pdf、pdfa-1/pdfa-2/pdfa-3。PAPERLESS_OCR_PAGES:仅对前 N 页 OCR,默认0(全部页面)。PAPERLESS_OCR_IMAGE_DPI:扫描仪输出图片时用于换算 DPI,默认自动按 A4 估算。PAPERLESS_OCR_USER_ARGS:以 JSON 字典形式向 OCRmyPDF API 传递额外参数(参数名用下划线而非连字符)。注意:不兼容的参数组合可能导致消费失败,请谨慎使用。
2.3 消费目录(Consumption Directory)
把文档放进数据库的主要方式,是将其放入消费目录。consumer 在一个无限循环中监视该目录的新增文件,一旦发现便执行 OCR 解析、索引,并存入媒体目录。消费目录位置由PAPERLESS_CONSUMPTION_DIR配置(默认consume/,见 src/paperless/settings.py),相关轮询与容错参数包括PAPERLESS_CONSUMER_POLLING、PAPERLESS_CONSUMER_POLLING_DELAY、PAPERLESS_CONSUMER_POLLING_RETRY_COUNT、PAPERLESS_CONSUMER_DELETE_DUPLICATES、PAPERLESS_CONSUMER_RECURSIVE、PAPERLESS_CONSUMER_IGNORE_PATTERNS(默认忽略.DS_STORE/*、._*、.stfolder/*)与PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS(见 src/paperless/settings.py)。
如何把文件送进该目录由你决定:
- 在本机运行 Paperless,直接拖放文件即可;
- 在服务器上运行、希望扫描仪自动推送文件,则需要搭建某种接收服务,典型方案是 FTP 服务器(如 Proftpd)或 Windows 文件夹共享(Samba)。
完整的扫描仪选型建议(支持 FTP/NFS/SMB/SMTP/API 的各品牌型号)参见 docs/scanners.rst。
2.4 仪表盘上传(Dashboard Upload)
仪表盘(dashboard)提供文件拖放上传区:直接把文件拖入该区域,或通过文件对话框选择文件即可。支持一次选择多个文件。
2.5 移动端上传(Mobile Upload)
- Android 用户可通过paperless_share这类兼容应用,把任意文档"分享"给 Paperless;该方式可与 Office Lens 等手机扫描 App 组合使用。
- 另有Paperless App,除上传外还支持文档浏览与下载功能。
- 手机扫描时建议使用专门扫描 App(普通相机拍照可能对比度不足,影响 OCR 效果),具体机型与软件对比见 docs/scanners.rst。
2.6 IMAP 邮件消费(Email)
如果你经常收到需要归档的邮件文档,可以让 Paperless 直接从邮箱消费附件——这是一个非常灵活强大的功能。配置在**管理后台(admin interface)**中分两步完成:
- 定义邮箱账户(e-mail accounts):包括 IMAP 服务器、端口、加密方式(无加密/SSL/STARTTLS)、用户名密码与字符集。模型定义见 src/paperless_mail/models.py。
- 为账户定义邮件规则(mail rules):指定文件夹、最大邮件年龄、发件人/主题/正文/附件名过滤器,并可设定消费后动作以及标题、通信方、标签、文档类型的分配方式。模型定义见 src/paperless_mail/models.py。
规则执行流程(见 src/paperless_mail/mail.py):
- 连接到邮件服务器;
- 按规则定义的文件夹、最大年龄和过滤器抓取所有匹配邮件;
- 检查是否存在可消费的附件(默认仅处理
attachment类型的附件,也可选择包含内联附件,此时建议配合文件名过滤器); - 若有,则指示 Paperless 消费附件,并可应用规则中提供的元数据(标题来源:邮件主题或附件文件名;通信方来源:邮件地址、发件人姓名或指定通信方);
- 若邮件中消费了文档,则在邮件上执行规则动作。
Paperless 会完全忽略不匹配过滤器的邮件,也只会对已消费文档的邮件执行动作。所有动作都通过不同机制保证同一封邮件不会被重复消费:
- Delete(删除):立即删除已消费文档的邮件。请谨慎使用。
- Mark as read(标记已读):把已消费的邮件标记为已读。Paperless 不会消费已读邮件——如果你在 Paperless 看到之前读了邮件,它将被忽略。
- Flag(标记):给已消费文档的邮件设置"重要"标记。Paperless 不会消费已标记邮件。
- Move to folder(移动到文件夹):把已消费邮件移出原位,避免再次消费。
谨慎:邮件消费器会对所有已消费文档的邮件执行这些动作。请留意:实际消费过程可能因某些原因失败,导致 paperless 中缺少文档(但邮件动作已经执行)。
提示:配合正确的规则集,你可以完全自动化处理邮件文档——为每个常收到数字文档的通信方建一条规则即可。默认动作"标记已读"非常温和,不会造成任何破坏或数据丢失。
提示:你也可以在邮箱中为 Paperless 建立专用文件夹,用常用邮件客户端把待消费邮件手动或自动移入,再让 Paperless 消费后移到另一个文件夹。
提示:Paperless 按管理后台中定义的顺序处理规则。你可以定义兜底规则并让其最后执行,例如给未匹配的文档打上"Unknown mail document"标签以便进一步检查。
Paperless 默认每 10 分钟检查一次邮件,此间隔可在管理后台的"Scheduled tasks"页面修改。对应定时任务实现见 src/paperless_mail/tasks.py(process_mail_accounts遍历所有账户并汇总新增文档数)。
2.7 通过 REST API 上传
你还可以使用 REST API 提交文档,上传端点为/api/documents/post_document/。以 multipart 表单 POST,其中表单字段document包含要上传的文档;文件名会被清理后存入临时目录,并指示 consumer 从该处消费(实现见 src/documents/views.py)。该端点支持的可选表单字段:
title:指定消费器使用的标题;correspondent:指定通信方 ID;document_type:同 correspondent 用法;tags:指定标签 ID,可多次指定以添加多个标签。
若消费进程成功启动,端点会立即返回"OK";由于消费在独立进程中执行,此端点不提供消费过程的额外状态信息。API 的完整端点清单(/api/documents/、/api/correspondents/、/api/document_types/、/api/logs/、/api/tags/)、下载/预览/缩略图/元数据接口及三种认证方式,参见 docs/api.rst。
三、最佳实践:组织你的文档库
Paperless 提供了一批帮助你整理文档集的工具,但如何用好它们取决于你自己。以下思路来自官方文档,可直接套用:
- 文档类型(document type):按"是什么"分类,例如"Receipt""Invoice""Contract"。如果你以前把收据统一放进一个文件夹,现在可以在 paperless 中定义对应文档类型、把文档赋给它,再按类型过滤,只看全部收据。不必强求每份文档都有类型——偶尔才用一次的类型难以界定也无妨,只要定义的类型确实有助于组织即可。
- 标签(tag):把标签想成更灵活的文件夹或活页夹。大学相关、汽车、医疗等主题都可建为标签并赋给相关文档,随后按标签过滤查看。与实体文件夹最大的区别在于:一份文档可同时拥有多个标签,而实体文件不可能同时出现在两个文件夹中。
- 应用示例:某个任务(如办理大学入学手续)需要从各处汇集一批文档,你可以新建一个标签把它们临时归组,既不打乱原有组织结构,任务结束后删掉标签即可"归还原位"。
- 通信方(correspondent):上述逻辑同样适用。只要觉得有助于组织,就把通信方附到文档上。
- 保存视图(saved views):整理好文档后,为常访问的集合创建若干保存视图。这相当于桌面上贴了标签的实体活页夹——区别是保存视图是动态的,随你不断加入文档而自动更新。
官方建议可在文档库中使用的标签示例:
inbox:给尚未人工编辑的新入库文档。car:所有与车相关的内容(维修、注册、保险等)。todo:仍需处理(回复、在线办理等)的文档。bank account x:某账户相关的所有银行对账单。mail:任何通过邮件处理能力加入的文档。missing_metadata:需要补元数据但暂时没空/不想处理的文档。
值得补充的是:在模型层面,Tag还拥有is_inbox_tag字段(见 src/documents/models.py),被标记为 inbox 的标签会自动赋予所有新消费的文档;StatisticsView也据此统计待处理文档数(见 src/documents/views.py)。
四、搜索
Paperless 提供强大的搜索机制,让你能快速定位想找的文档——比如几个月前买的东西、八年前签的合同。
搜索时,Paperless 会匹配查询词与文档的content、title、correspondent、type 和 tags,并返回按得分排序的结果列表:匹配度越高的文档排在越前面。默认情况下,Paperless 只返回包含搜索栏中全部单词的文档。如需进一步收窄结果,可使用以下高级语法(全部可自由组合):
匹配逻辑表达式:
shopname AND (product1 OR product2)匹配特定标签、通信方或类型:
type:invoice tag:unpaid correspondent:university certificate匹配日期:
created:[2005 to 2009] added:yesterday modified:today模糊词匹配:
produ*name提示:模糊词对搜索索引而言较难处理,这类查询可能耗时较长,这也是 Paperless 提供自动补全(autocomplete)与查询纠错(query correction)的原因。
Paperless 使用Whoosh 的默认查询语言实现上述语法。从源码看,全文搜索通过 src/documents/index.py 的DelayedFullTextQuery执行:它用MultifieldParser在content/title/correspondent/tag/type多字段上解析查询,并挂载DateParserPlugin支持日期语法,同时用correct_query提供查询纠错;自动补全由 src/documents/index.py 的autocomplete基于索引中高频词条(Tf/Idf 打分)实现。搜索索引的字段模式(Schema)见 src/documents/index.py,包含内容、标题、ASN、通信方、标签、类型及 created/modified/added 三个日期字段。API 侧的全文搜索查询参数与__search_hit__结果结构(score/highlights/rank)见 docs/api.rst。
五、推荐工作流(The Recommended Workflow)
当你熟悉 Paperless 并准备把所有文档纳入管理后,官方推荐如下工作流。它同时兼顾"部分文档必须保留纸质原件"的现实,同时确保这些文档也能享受数字化的一切便利。
5.1 工作流总览
Paperless 推荐工作流图
5.2 在 Paperless 中的前期准备
- 创建一个inbox 标签,让所有新文档自动带上它;
- 创建一个TODO 标签。
5.3 纸质文档的处理
在办公桌上放一个物理收件箱(physical inbox):每当收到需要归档的文档就放入其中。定期对收件箱中的文档执行以下操作:
- 逐份判断是否必须保留纸质原件——这适用于合同、证书等重要文件;
- 如需保留,在扫描前手写一个递增流水号(从 1 开始递增),这就是档案编号ASN;
- 扫描文档;
- 有 ASN 的文档,放入唯一一本按 ASN 排序的活页夹中,不要用其他任何方式排序;
- 没有 ASN 的文档,直接丢掉。恭喜,你成功瘦身了!
随着时间推移,实体活页夹会装满:满后,在夹脊标注 ASN 区间(例如"Documents 1 to 343"),存入地下室或别处,再启用新活页夹。
这套流程的核心思想是:你永远不必在实体活页夹里翻找文档。需要某份纸质原件时:
- 在 Paperless 中搜索该文档;
- 从扫描件上找到它的 ASN;
- 按 ASN 直接取出对应活页夹中的原件——因为它们按编号排序,取用非常容易。
5.4 在 Paperless 中处理文档
扫描入库后,在系统中按下述步骤整理:
- 若文档有 ASN,为该文档赋 ASN;
- 为文档指定通信方(雇主、银行等)——非必须,但有助于日后查找;
- 为文档指定文档类型(发票、银行对账单等)——非必须,但同样有助于查找;
- 为文档指定合适的标题(所购物品名称、信件主题等);
- 核对日期是否正确——Paperless 会尝试从文档内容读取日期,但 OCR 不佳或文档上出现多个日期时可能出错;
- 从文档上移除 inbox 标签。
提示:你可以为通信方和标签设置手工匹配规则(如 "Any"/"All"/"Literal"/"Regular expression"/"Fuzzy match" 等算法),Paperless 会自动赋值;消费若干文档后,你甚至可以让 Paperless 通过Auto算法(基于神经网络的自动匹配)自己学习何时赋标签与通信方。各匹配算法的具体行为与实现见 docs/advanced_usage.rst 与 src/documents/matching.py。
5.5 任务管理(Task Management)
部分文档需要你进一步采取行动。根据你使用 Paperless 的频率,有两种不同的处理方式:
- 如果你定期扫描并处理文档:给所有待办文档打上TODO 标签,并在仪表盘创建一个显示该标签下所有文档的保存视图,随时跟进;
- 如果你不经常扫描、只把 Paperless 当作归档工具:在物理收件箱旁放一个实体 TODO 盒子,把待办文档放进去;完成相关任务后,再把文档移回收件箱。
结语
从概念术语、五种入库渠道(消费目录、仪表盘上传、移动端、IMAP 邮件、REST API)、OCR 模式配置,到标签/类型/通信方的组织策略、Whoosh 高级搜索语法,再到"ASN 编号 + 物理活页夹 + inbox/todo 标签"的推荐工作流,本文完整覆盖了 Paperless-ng 日常使用的核心路径。相关实现细节与配置均可继续在仓库中深入研读:src/documents/consumer.py、src/documents/matching.py、src/documents/index.py、src/paperless_mail/mail.py、docs/configuration.rst 与 docs/api.rst。
- 后端
- 前端
- 企业应用
【免费下载链接】paperless-ng
A supercharged version of paperless: scan, index and archive all your physical documents
相关推荐
3 步搞定 B 站视频上传:social-auto-upload Bilibili 自动上传完整指南
3 步搞定 B 站视频上传:social auto upload Bilibili 自动上传完整指南 social auto upload 是一个覆盖抖音、小红
后端RPA工作流自动化AI 技能终极Paperless-ngx文档管理指南:从扫描到归档的完整工作流
终极Paperless ngx文档管理指南:从扫描到归档的完整工作流 Paperless ngx是一个功能强大的文档管理系统,能够将你的物理文档转化为可搜索的在
后端前端全文检索OCR知识管理华硕笔记本性能调节轻量替代:G-Helper 免费完整上手指南
华硕笔记本性能调节轻量替代:G Helper 免费完整上手指南 G Helper 是一款面向华硕笔记本的性能调节工具,定位是 Armoury Crate 的轻量
桌面应用系统编程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考