Paperless-ngxで家の紙書類を自宅サーバーに取り込む:日本語OCRの設定とタグ運用

Photo: Mikhail Nilov / Pexels
先に結論です。Paperless-ngx で日本語の書類を扱うときは、次の2点を押さえれば迷いません。
- Docker の環境変数で、日本語の OCR データを入れる設定(
PAPERLESS_OCR_LANGUAGES)と、使う設定(PAPERLESS_OCR_LANGUAGE)の両方を書く - タグなどの自動振り分けは、「Any」「All」ではなく「Regular expression(正規表現)」か「Auto(自動)」を使う
前者を片方だけ書くとコンテナが起動せず、後者を知らないと「キーワードを登録したのにタグが付かない」状態になります。
Paperless-ngx と日本語対応の現状
Paperless-ngx は、スキャンした PDF や画像を取り込み、OCR で文字を読み取って全文検索できるようにするオープンソースの文書管理システムです。書類にはタグ・発行元(Correspondent)・書類の種類(Document type)を付けられ、ルールに沿って自動で振り分けることもできます。
2026年10月時点の最新は v3.3.0 です。v3 系では検索エンジンが Tantivy に置き換えられたとされ、v3.2.0 で、日本語のように単語の間に空白がない言語を2文字ずつに区切って検索する改善が入りました。v3.3.0 では、日本語などの PDF を画面上で正しく表示するためのデータ(CMap)も同梱されています。
Docker Compose で立てる(日本語 OCR 込み)
公式が配布している Compose ファイル(PostgreSQL 版)をもとに、日本語の設定を足したものが次です。紙の書類が中心なら、Word や Excel を取り込むための Tika・Gotenberg は省いて構いません。
services:
broker:
image: docker.io/valkey/valkey:9-alpine
restart: unless-stopped
volumes:
- redisdata:/data
db:
image: docker.io/library/postgres:18
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql
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:
- "8000:8000"
volumes:
- data:/usr/src/paperless/data
- media:/usr/src/paperless/media
- ./export:/usr/src/paperless/export
- ./consume:/usr/src/paperless/consume
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_DBENGINE: postgresql
PAPERLESS_SECRET_KEY: "<ランダムな長い文字列>"
PAPERLESS_TIME_ZONE: Asia/Tokyo
PAPERLESS_OCR_LANGUAGES: "jpn jpn-vert"
PAPERLESS_OCR_LANGUAGE: "jpn+eng"
USERMAP_UID: 1000
USERMAP_GID: 1000
volumes:
data:
media:
pgdata:
redisdata:
日本語に関係するのは2行です。
PAPERLESS_OCR_LANGUAGES:追加でインストールする言語。標準では英語・ドイツ語・イタリア語・スペイン語・フランス語しか入っていないため、jpnを足します。縦書きも読むならjpn-vertも入れますPAPERLESS_OCR_LANGUAGE:OCR で使う言語。複数あるときは+でつなぎます。名前に-が入る言語は_に置き換える決まりなので、縦書きも使うならjpn+jpn_vert+engと書きます
PAPERLESS_OCR_LANGUAGE だけに jpn を書いてコンテナが起動しなくなった例は、公式の掲示板でも報告されています。名前がよく似ているので、両方書いたかを確認してください。使う言語を増やすほど OCR は遅くなるとされているため、縦書きの書類が少ないなら jpn+eng で始めるのが無難です。
v3 では、PAPERLESS_SECRET_KEY が既定値の change-me のままだと起動できなくなりました。次のコマンドで作った文字列を入れます。
python3 -c "import secrets; print(secrets.token_urlsafe(64))"
USERMAP_UID と USERMAP_GID には、ホストで id -u と id -g を実行した値を入れます。ホストのユーザーとコンテナの両方が取り込みフォルダに書き込めるようにするためです。docker compose up -d で起動し、http://<サーバーのIP>:8000 を開くと、最初の管理者アカウントを作る画面が出ます。
スキャナーから取り込みフォルダへ直接入れる
Paperless-ngx は consume フォルダを見張っていて、PDF や画像が置かれると自動で取り込みます。このフォルダを Samba で共有すれば、PC を経由せずにスキャナーから直接入れられます。
ネットワークフォルダへ直接保存できる機種としては、ブラザーの ADS-4300N が「スキャン to ネットワーク」で SMB(CIFS)の共有フォルダへ送れます。PFU の ScanSnap iX2500 も、2025年10月のアップデートで NAS などのネットワークフォルダへ PC なしで保存できるようになりました。OCR 用には 300dpi 程度で読み込むのがよいとされています。
取り込みフォルダの中のサブフォルダ名を、そのままタグにする設定もあります。environment に次の2行を足します。
PAPERLESS_CONSUMER_RECURSIVE: "true"
PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS: "true"
consume/保険 に入れた書類には「保険」タグが付く、という動きです。スキャナー側で保存先ごとにボタン(プロファイル)を分けておけば、スキャンした時点で大まかな分類が終わります。
注意点は2つです。
- 取り込みフォルダが NFS などのネットワーク共有の上にあると、ファイルの追加を検知する仕組み(inotify)が働かず、取り込まれません。その場合は
PAPERLESS_CONSUMER_POLLING_INTERVALに秒数を入れ、定期的に見に行く方式に切り替えます - OCR の既定モード
autoでは、すでに文字が入っている PDF の OCR は飛ばされます。スキャナーが作った OCR 済み PDF の日本語が崩れているなら、PAPERLESS_OCR_MODE: redoで読み直させます
タグ運用:日本語は「正規表現」か「自動」で振り分ける
タグ・発行元・書類の種類には、それぞれ自動で割り当てるルール(マッチング)を設定できます。ここに日本語ならではの落とし穴があります。
「Any」「All」「Exact」は、ソースコードを見ると、登録した語の前後に「単語の区切り」があることを条件に探す作りです。英語は単語の間に空白があるので問題ありませんが、日本語は文が続けて書かれるため、「保証書」と登録しても「本保証書は」のように文の途中にあると一致しません。
日本語では次の2つを使い分けるのが確実です。
- Regular expression:決まった言葉が必ず載る書類に使う。例えば書類の種類「保証書」に
保証書|保証期間と登録すれば、どちらかが本文のどこかにあれば一致します - Auto:過去に自分が振り分けた結果から学習する方式。書類がある程度溜まってから効いてきます
Auto には「受信箱(Inbox)タグが付いたままの書類は学習に使わない」という仕様があります。そこで、新しい書類に自動で付く Inbox タグを1つ作り、中身を確認して分類を直したら Inbox を外す、という流れにします。これを続けるほど Auto の精度が上がります。
分類の軸は、私は次の3つに分けるのがよいと考えています。増やしすぎると付け直しが面倒になり、続かなくなるためです。
- 書類の種類:請求書・領収書・契約書・保証書・通知書
- 発行元:市役所・保険会社・勤務先など
- タグ:用途や年(「確定申告2026」「家電」「子ども」)
取り込んだ原本は media ボリュームに入ります。バックアップには、書類とタグなどの情報をまとめて書き出す document_exporter が用意されています。
docker compose exec -T webserver document_exporter ../export
税金や契約に関わる書類は、原本の保管が求められる場合があります。紙を捨てるかどうかは、書類ごとに確認してから決めてください。
まとめ
PAPERLESS_OCR_LANGUAGESにjpnを入れ、PAPERLESS_OCR_LANGUAGEをjpn+engにする。片方だけでは起動しない- v3 では
PAPERLESS_SECRET_KEYを必ずランダムな値にする consumeを Samba で共有すれば、ネットワーク保存に対応したスキャナーから直接取り込める。サブフォルダ名をタグにもできる- 日本語の自動振り分けは「Any」「All」では一致しにくい。「Regular expression」か「Auto」を使う
- Auto は Inbox タグを外した書類から学習する。確認したら外す運用にする
運営者が作った Excel テンプレートを BOOTH で配布しています。IT 資産管理台帳(無料 Lite 版あり) / IT 資格の学習管理シート


