自托管文档管理: Paperless

Paperless 是一个自托管的开源文档管理WebApp。主要就是针对越来越多的纸质文档以及PDF文档,做一个有效的管理。因为集成了OCR,外加AI(sort of)辅助,尽量完成文档归类整理的自动化。这里我们简单介绍一下Paperless,并讲一下如何通过 Docker 部署。

Paperless 简介

这应该已经是很多人共同的感受了,现在的生活中,文档实在是太多了。各种的水电费账单收据邮件通知传单合同疫苗证签证驾照房子车子保单记录复印件Biopage申请文档Dispute退税文档T1T4,成功的把本就一地鸡毛的生活搞的更加的七零八落。然而我们自己都知道,虽然平时不是很常用,但是一到用的时候,很多文档的重要性就显现出来了。这个时候如果没有好的文档管理,难免手忙脚乱,甚至有时文件就丢了。

然后说起文档管理,很多人第一反应就是,文件夹。然而这种单一的树形结构肯定是无法满足现代的需求的。Tag/Label这现在已经是metadata管理的基本操作了。也许double link这种对于通常来说主题非常明确的PDF文档来说没有必要,但是tag和label这一类的已经是必不可少了。然而现在看看Google Drive,以及本地的一层一层的文件夹,文档的整理显然不是个简单的事情,时间一长,干脆就弃疗了。

🙊
很难理解为什么Google Drive到现在了还不支持自定义Tag/Label。个人盲猜可能因为很多企业用户实际上也不需要onboard tag/label这种文档管理方式。如果公司是基于文档来运营、管理的,那么文档的层级理应也是跟公司部门层级对应的,所以单一的树形结构反而是最好用的。当然,我们知道网形结构是树形结构的升级版,不过对应于这种网形结构组织形式的运营实体,其实更接近于DAO的理念了吧。跟现在的公司层层负责的结构天然不搭。
Paperless-ngx

Paperless的独到之处就是提供了一个PDF文档的管理方案。注意这里主要是PDF文档。PDF类型的文档实际上是有一些特点的:

  • 大多PDF通常来说是 Immutable的。比如合同文件,Invoice,收据,账单,等等。

这类文档天然跟“策划“,“design“,“runbook“,internal tech documentation,snippets和personal notes有很大的不同。Immutable 注定了这个文档涉及的topics是几乎不会变化的。如果一个文档管理系统的分类方式是相对固定的,那么对于一个PDF文档的归类,就应该几乎是完全静态的,或者说是极少需要更新的。也就是说其Index基本上是静态的。而Frequently mutable的文档天然就不好index,因为其涉及的Topics很多时候都是随时发生变化的。而原本的文件夹管理方式,至少还是采用了所有index方式里面,最少经常变化的方式了,毕竟 reorg 还是相对少发生的。

  • 大多PDF文档的主题是相对固定且有明确界限的。也就是说用多个label基本可以完成一个PDF里面内容的概括。

这就表明,一个相对完善的tag/label系统,就可以建立起一个足够好用的index系统,允许用户从各个角度,快速找到一个文档。比如我即可以通过“收据“,也可以通过“财产“两条路线找到家里修漏水管的维修收据。

这里推荐官方的Screenshots Gallery,做的很好,cover了很多Paperless的优势所在,强烈推荐感兴趣的小伙伴去看一看是不是自己的菜。

Paperless-ngx

Screenshots

当然除了Tag之外,paperless也提供很多其他对于PDF文档常见的Metadata,比如文档类型(收据?合同?确认函?),correspondents (相当于这个文档如果是涉及双方,其中另一方是谁?)

Paperless作为开源application,已经发展了很多年了,现在不仅稳定性已经相当的不错,在OCR和AI上面的集成也达到了相当可用的状态。Paperless会学习用户添加label的习惯,然后结合OCR,会尝试自动给新添加的文档添加Label。结合Paperless已经有的import途径(包括webUI,emailconsume directory等),在合理的配置之后,也许是可以达成靠谱的,自动归类自动管理的。

同时,Paperless还有一个手机端的App,不仅可以查看文档,还可以快速的通过手机摄像头添加新的文档。如果手上有纸质的文档,可以立刻通过手机把文档导入Paperless。这个手机端App的完成度已经相当之高。Google Play上面已经有10K+的装机量,这个在开源 Self-hosted application里面可以说是非常牛了。

部署

对于家庭使用,个人认为数据库后端用 SQLite应该就够了 ,不需要使用MySQL或者PostreSQL。官方提供了非常好的Docker compose 模版,选择你想要用的DB后端,然后基本上只需要少许修改就可以了。

Setup - Paperless-ngx

官方 setup 文档

paperless-ng/docker/compose/docker-compose.sqlite-tika.yml at master · jonaswinkler/paperless-ng
A supercharged version of paperless: scan, index and archive all your physical documents - paperless-ng/docker/compose/docker-compose.sqlite-tika.yml at master · jonaswinkler/paperless-ng

个人比较推荐的 SQLite + Tika

注意在官方的 docker-compose folder 下面,还有两个文件 docker-compose.env 和 .env 。这两个文件也是需要的。然后需要做一些修改。