# 書類スキャナー｜紙の写真を、まっすぐに

紙を撮ってください。スキャンしたように見えるものが返ります。

> スマホで撮った紙の写真を、まっすぐで明るさのそろったPDFにします。四隅は自動で見つけ、傾きを戻し、影は割って取り除きます。すべてブラウザの中で動き、何もアップロードしません。

これはhttps://abox.tools/ja/document-scanner/にあるブラウザー用の対話型ツールです。ファイルはそのブラウザーを実行する端末上で処理します。意図した共有や任意の通信機能はページ内で説明します。以下は文章による説明です。利用するにはアドレスを開いてください。

## 書類は**ブラウザー内で処理**されます。処理のためのアップロードはありません。

写真のデコード、まっすぐにすること、整えること、PDFへ書き出すことは、すべて手元のブラウザが、計算とすでに入っているコーデックだけで行います。この道具にはネットワーク機能がそもそもなく、取りに行くものも送るものもありません。ここでそれが効いてくるのは、人がどんな紙を撮るかによります。パスポート、給与明細、賃貸契約書、あるいは役所に「スキャンして返してください」と言われた書類です。

- ✗ アップロードなし
- ✗ アカウント不要
- ✗ 透かしなし
- ✓ オフラインで動く
- ✓ オープンソース

## スマホのカメラで書類をスキャンする方法

1. **紙を撮ります。** 真上あたりから、紙全体が画面に入り、四隅が見えているかほぼ見えている状態で撮ってください。正面である必要も、明るさがそろっている必要もありません。傾きと影こそ、この道具がある理由です。大事なのは画面を埋めることです。部屋の反対側から撮った紙には、取り戻せる細部が残っていません。
2. **四隅を確かめます。** 写真を読んだ時点で自動的に見つけますし、確信が持てないときはページがそう言います。紙と同じ色の机に置かれた紙は、実際に縁がほとんど見えません。写真のどこかを押せばいちばん近い隅が指のところへ来ますし、`Tab`で隅に移って矢印キーで動かすこともできます。
3. **明るさをどうするか選びます。** 「色つき、むらを取る」は紙の明るさをページ全体で測って割り、影が消えても印影や署名は色を保ちます。「白黒」はさらに進み、スキャンをメールで送れる大きさにするのがまさにこれです。画面に出ているものが本当の結果で、ファイルを書くのと同じコードが作っています。
4. **残りのページを足します。** 足した写真はそのまま同じ書類の次のページになり、順番は一覧に並んでいるとおりで、各ページは自分の四隅を保ちます。帯のページに付いた矢印がそれを前後に動かします。
5. **PDFを保存し、送る前に開いて確かめます。** 書類はここ、このページのメモリの中で作られます。作るために何もアップロードされていませんし、それについてどこかに報告されたこともありません。

## 詳しい解説

[スマホで書類をスキャンする方法](https://abox.tools/ja/guides/scan-a-document-with-your-phone/): ページを撮った写真と、そのページのスキャンを分けているもの。傾きと、むらのある明るさと、ファイルの大きさです。写真の撮り方、そのあと何を直すのか、そしてなぜそのどれにもサーバーが要らないのか。

## 箱の中のほかのツール

- [動画から音声を抽出](https://abox.tools/ja/extract-audio-from-video/): 動画を置けば、音だけが取り出せます。映像は一度も復号されず、何もアップロードされません。
- [音声の切り出し](https://abox.tools/ja/trim-audio/): 再生しながら残したい場所に印を付けます。印の付いた分が1つのファイルになって、指定どおりの位置で切れて戻ってきます。
- [音声編集ツール](https://abox.tools/ja/edit-audio/): 逆から再生する、速さを変える、小さな録音を持ち上げる。そのすべてを手元の端末の中で。
- [PDF結合・分割](https://abox.tools/ja/merge-pdf/): サーバーを一往復せずに、ページを入れ替える。

## よくある質問

### 書類はどこかへアップロードされますか。

いいえ。写真のデコード、まっすぐにすること、整えること、PDFへ書き出すことは、すべて手元のブラウザが手元のハードウェアで行います。この道具にはネットワーク機能がそもそもなく、何かを取りに行くことも送ることもありません。ページの`Content-Security-Policy`には接続しうるアドレスがすべて書かれていますが、そのどれもこのサイトのものではありません。ページを一度読み込んで回線を切っても、そのまま動きます。

### モデルなしでどうやって紙の四隅を見つけているのですか。

四角形を作る4本の長い直線の縁を探しています。写真を縮め、勾配を取り、つまり画像がどこでどちら向きに変わるかを見て、縁の上にある画素はそれぞれ自分が乗るはずの直線に投票します。強い直線を組み合わせて候補の四角形を作り、候補ごとにその4辺をたどって、各辺の下に本当にどれだけ縁があるか、そしてその4本が1つのものの境界になっているかを問いながら点を付けます。紙は周りより明るいか暗いかのどちらかですが、4辺すべてで同じ向きにそうであり、それが文字の一行を紙の下端と取り違えるのを防ぎます。重みはなく、何もダウンロードされず、どの書類が通っても計算は同じ計算です。

### 見つかった四隅が違います。どうすればいいですか。

ドラッグして直してください。四隅は出発点であって、決定ではありません。スキャンは4つの隅が最後に落ち着いた場所から取られます。写真のどこかを押せばいちばん近い隅が指のところへ飛んできますし、そのほうが小さなつまみを正確に触るより簡単です。矢印キーは、選ばれている隅を1画素ずつ動かします。四隅が見つけたものではなく推測であるときもページがそう言い、その1ページを帯で目印します。だいたいの原因は、紙が自分と似た色の机に置かれていることで、そこには本当に見つけるべき縁がほとんどないからです。

### まっすぐにした紙が、なぜ潰れずに正しい形で出るのですか。

形を縁から測るのではなく、遠近から復元しているからです。斜めから撮った紙は遠い側の縁が縮んで見えるので、いかにもな方法、つまり向かい合う辺のいちばん長い組を取ってそれを比とみなす方法では、目に見えて寸詰まりのA4ができます。ウェブのスキャナーの多くがそれを返します。実は四角形の写真には、カメラがふつうのカメラでありさえすれば、その四角形の縦横比とカメラの焦点距離の両方を復元できるだけの情報が入っています。2003年のZhangとHeの結果で、`src/shared/document-geometry.js`がしているのがそれです。正面から撮った写真には復元すべき遠近がなく、その必要もありません。そのときは縁が正確だからです。そこで縁のほうへ戻り、どちらが答えたのかをページが書きます。

### 「整える」は画像に実際何をしているのですか。

明るさを割って取り除いています。紙自身の明るさをページ全体で測ります。細かい升目に分け、升目ごとに明るさの高い側の分位点を取るのですが、文字はそれを動かすには暗すぎまばらすぎます。そして各画素を、その場所で見積もった紙の明るさで割ります。残るのはインクで、明るさはそろい、影も周辺の落ち込みもありません。これはコントラストを上げるのとは違います。撮った紙のコントラストを上げると、明るい側は白く、暗い側は黒くなり、暗い側に書かれたものは読めなくなります。「自動レベル補正」がこうした写真をよくするどころか悪くするのはそのためです。

### 白黒モードはなぜそんなに小さいのですか。

色が2つの画像は、1600万色の画像に比べて本当にごくわずかなデータで、ここでもそのままそう保存するからです。1画素1ビットを1バイトに8つずつ詰め、正確に圧縮します。白黒の画像をJPEGにするのとは違います。同じページでカラーモードの18分の1ほどになるので、20ページの契約書が15メガバイト前後ではなく1メガバイト未満に収まります。しきい値はSauvolaのもので、各画素をページ全体のひとつの数値ではなく、その画素自身の近傍の平均とばらつきに照らして決めます。それが影の中の文字を読めるまま保ちます。中間調がないので、写真の載ったページはほかのモードを使ってください。

### 複数のページを1つのPDFに入れられますか。

はい。足した写真はそのまま次のページになり、順番は一覧に並んでいるとおりで、各ページは自分の四隅を保ちます。ですから続けて撮った紙の束が1つの書類になります。帯の各ページに付いた矢印がそれを前後に動かします。整える設定をすべてのページで共有するのは意図的です。同じ書類の中で違う整え方をされたページは、2つの書類のように見えるからです。

### 文字を読み取って、PDFを検索できるようにしてくれますか。

いいえ。テキストの層も文字認識もありません。出てくるのはページの画像が1ページに載ったものです。きちんとやるならOCRエンジンが要り、それは数十メガバイトのモデルをダウンロードすることになります。給与明細を読む前にモデルを取りに行く書類スキャナーは、給与明細について本国へ電話をかける理由のある書類スキャナーです。文字が必要なら、白黒モードが作るファイルこそ、手元のOCRソフトがいちばんうまく扱える種類のものです。

### ぼやけて出ました。なぜですか。

ほとんどの場合、写真の中で紙が小さかったからです。プレビューの下の欄が、紙が画面の何割を埋めたか、そしてその大きさの用紙でおよそ何dpiに当たるかを書いています。150 DPIあたりを下回ると印刷したスキャンは眠く見えますし、そもそもファイルに入っていなかった細部については、どんな道具にもできることはありません。拡大するのではなく近づき、じっとして、押す前にカメラに紙で焦点を合わせさせてください。手ぶれがもう一つの原因で、それも取り戻せません。

### 無料ですか。アカウントは必要ですか。

無料で、アカウントもログインも試用期間もページ数の制限も透かしもありません。写真の大きさにも制限はありません。その費用を払うサーバーがないからです。処理は手元の端末で起こります。このサイトは広告で運営されていて、広告側にはあなたの書類について何も渡されません。

## この主張を確かめる方法

- **処理はこのブラウザー内で行います。** 入力と結果はブラウザー内で処理し、処理コードはそれらを処理用にアップロードしません。Content-Security-Policyは資源と接続先を制限しますが、許可済みの相手はリクエストを受け取れます。内容は検査せず、何も送られないことを単独で証明しません。具体的な操作の要求とソースを比較するか、切断中にローカル操作を完了してください。
- **モデルがないので、ダウンロードするものも問い合わせる先もありません。** 紙の四隅を見つけるのは計算です。画像の勾配、その中の直線への投票、そして勝った四角形の各辺の下に実際に何があるかの確認です。重みも、推論ランタイムも、初回に取りに行くものもなく、他人の書類で違う振る舞いをするものもありません。`src/shared/document-detect.js`を見てください。
- **書類には日付も作成者も端末名も入りません。** スキャンは人が他人に送るもので、たいていは役所に求められて送ります。PDFにページ以外で書かれるのはこの道具の名前だけで、題名を入力すればそれが加わります。作成日も、作成者も、製造番号もなく、時計やファイル名や端末から導いたものもありません。`src/document.js`を見てください。
- **ここでは何もどこからも取ってきません。** `src/`のどこにも`fetch`も`XMLHttpRequest`も`sendBeacon`もありません。やっているのは`getImageData`と、バイト列を回るいくつかのループと、ブラウザ自身のJPEGエンコーダーだけで、どれもすでに端末に入っているものです。
- **オフラインで動きます。** 回線を切っても道具は変わりません。もともとネットワークの段階がなかったからです。いちばん簡単な証拠であり、パスポートをスキャンする前に一度試しておく価値のあることです。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、四隅がどうやってモデルなしで見つかるのかは`src/shared/document-detect.js`、まっすぐにする処理は`src/warp.js`、むらのある明るさを割って取り除く処理は`src/clean.js`です。
