前提と注意事項
この記事では以下を前提としています。
- Paperless ngx は Docker compose を使って構築、稼働させる前提です。
- Paperless ngx を動作させるのは Ubuntu22.04 上になります。
以降では、Paperless ngx を単に Paperless と表記します。 なお、この記事では Paperless ngx の公式ドキュメントである以下を参考にしています。
Hooking into the consumption process
Sometimes you may want to do something arbitrary whenever a document is consumed. Rather than try to predict what you may want to do, Paperless lets you execute scripts of your own choosing just before or after a document is consumed using a couple of simple hooks.
docs.paperless-ngx.com
この記事のゴール
この記事では、Paperless に新しくファイルをアップロードしたり、Consume フォルダにファイルを追加したりした後に、Paperless によってファイルが処理されて登録されたことをトリガとして、追加したファイル情報を指定したテキストファイルに追記するスクリプトを実行できるようにします。
Paperless に追加したファイル情報をテキストファイルに追記するだけでは特に実用上大きな利便性はありませんが、指定したスクリプトファイルなら何でも実行できるため、Paperless をより有効活用するために大変便利です。
活用事例
本記事の内容を活用して以下のようなシステムの構築を行うことができました。
- スマートフォンで撮影したレシートを OCR 処理した上で Paperless にアップロードする(別アプリ使用)
- Paperless にレシート画像と情報が登録されると同時に、登録したレシート情報(OCR によって読み取った内容)を ChatGPT に送信する(OpenAI API を利用)
- ChatGPT がレシートの内容から会計システムに保存したいデータ(レシートに含まれる金額や購入した製品名、購入日時、購入場所など)を抽出し、整形したデータを返信する
- 返却された データをそのまま会計システムの API に送信して、会計システムにレシート情報を保存する
上記によって、スマートフォンでレシートを撮影するだけで、Paperless にレシート画像と情報が登録されて、さらに別の会計システムにもその情報が書き込まれるシステムになります。ただし、OCR 機能や ChatGPT による処理が100%正確ではないため、多少の手直しは必要ですが、それでも大幅な効率化が図ることができました。
事前準備
Paperless を Docker Compose で動かすために、適当なディレクトリ~/paperless-ngx
を作成し、そこに移動します。
$ mkdir ~/paperless-ngx
$ cd ~/paperless-ngx
その後、docker-compose.yml
を作成します。
$ vi docker-compose.yml
docker-compose.yml
の内容は次に記載します。
Paplerss の docker-compose.yml を修正する
Paperless においてファイルの追加時にスクリプトを実行するためには、Docker compose の設定を変更する必要があります。
具体的には、以下のようにPAPERLESS_POST_CONSUME_SCRIPT
という項目を追記します。
version: '3.4'
services:
broker:
image: docker.io/library/redis:7
restart: unless-stopped
volumes:
- ./redisdata:/data
db:
image: docker.io/library/postgres:15
restart: unless-stopped
volumes:
- ./pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
depends_on:
- db
- broker
ports:
- '8001:8000'
volumes:
- ./data:/usr/src/paperless/data
- ./media:/usr/src/paperless/media
- ./export:/usr/src/paperless/export
- ./consume:/usr/src/paperless/consume
- ./scripts:/usr/src/paperless/scripts
env_file: docker-compose.env
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_POST_CONSUME_SCRIPT: /usr/src/paperless/scripts/post-script.sh
volumes:
data:
media:
pgdata:
redisdata:
上記では、Paperless にファイルが追加、登録された後に/usr/src/paperless/scripts/post-script.sh
を実行するように設定しています。なお、/usr/src/paperless/scripts/post-script.sh
はコンテナ内のパスなので、これをホストマシン(Ubuntu 22.04)の./scripts
にバインドしています。すなわち、Ubuntu の~/paperless-ngx/scripts
に実行したいスクリプトファイルを作成します。
スクリプトを用意する
続いて Paperless へのファイル追加時に実行したいスクリプトファイルを保存するための適当なディレクトリを作成し、その中にpost-script.ts
というスクリプトファイルを作成します。
$ mkdir ./scripts
$ cd ./scripts
$ vi post-script.sh
post-script.sh
の内容を以下のようにしました。以下のスクリプトは、公式ドキュメントにあるPost-consumption script
のものを使っています。
#!/usr/bin/env bash
echo "
A document with an id of ${DOCUMENT_ID} was just consumed. I know the
following additional information about it:
* Generated File Name: ${DOCUMENT_FILE_NAME}
* Archive Path: ${DOCUMENT_ARCHIVE_PATH}
* Source Path: ${DOCUMENT_SOURCE_PATH}
* Created: ${DOCUMENT_CREATED}
* Added: ${DOCUMENT_ADDED}
* Modified: ${DOCUMENT_MODIFIED}
* Thumbnail Path: ${DOCUMENT_THUMBNAIL_PATH}
* Download URL: ${DOCUMENT_DOWNLOAD_URL}
* Thumbnail URL: ${DOCUMENT_THUMBNAIL_URL}
* Correspondent: ${DOCUMENT_CORRESPONDENT}
* Tags: ${DOCUMENT_TAGS}
It was consumed with the passphrase ${PASSPHRASE}
" >> /usr/src/paperless/scripts/consumed_list.txt
上記は、/usr/src/paperless/scripts/consumed_list.txt
というテキストファイル(Ubuntu 上では~/paperless-ngx/scripts/consumed_list.txt
)に、追加されたファイルの情報を追記するスクリプトです。
なお、上記のスクリプトファイルに含まれているDOCUMENT_ID
やDOCUMENT_FILE_NAME
などの埋め込まれている変数は、Paperless が処理したファイルの情報です。
上記のスクリプトでは実用性はありませんが、例えばDOCUMENT_ID
を使って Paperless の REST API に GET リクエストを送信して処理されたファイルの詳細な情報を取得し、その情報を別のシステムの API を通して書き込む ということもできます。
上記のスクリプトファイルを実行できるよう、実行権限を付与します。
$ chmod +x ./post-script.sh
Paperless を起動する
あとは以下で Paperless を起動します。必要に応じてsudo
を使うなどしてください。
$ docker compose up -d
あとは実際に Paperless の Web ダッシュボードから新しいファイルをアップロードしたり、Consume フォルダにファイルを追加したりしてconsumed_list.txt
が更新されるか確認してみてください。
ファイルの登録前にスクリプトを実行したい場合
以上で Paperless にファイルを追加して、Paperless にファイルが登録された後にスクリプトを実行できる環境を構築できました。
逆に Paperless にファイルが登録される前にスクリプトを実行することもできます。この場合は、PAPERLESS_PRE_CONSUME_SCRIPT
を使用します。
該当部分を抜粋すると、docker-compose.yml
は以下のようになります。
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_POST_CONSUME_SCRIPT: /usr/src/paperless/scripts/post-script.sh
PAPERLESS_PRE_CONSUME_SCRIPT: /usr/src/paperless/scripts/pre-script.sh
上記のようにすると、Paplerss ngx にファイルが追加された時に、Paperless にファイルが登録される前に/usr/src/paperless/scripts/pre-script.sh
を実行することができます。
まとめ
Paperless ngx で新しいファイルを追加した時に指定したスクリプトを実行する方法について解説しまました。Paperless は大変便利なツールですが、本記事で紹介したようにファイルの追加前後で任意の処理を実行することでさらに便利になります。