TOOLPIPO LAB スキャンPDF · 12条件

スキャンPDFのページ抜け・重複・順番異常は、どこまで分かる?

印刷ページ番号入りのスキャン風PDFを自作し、ページ抜け・重複・順番の入れ替わり・OCR失敗などをブラウザ内で確認しました。

結論

印刷ページ番号が連続する文書なら、PDF上の進み方と比べることで、ページ抜け・重複・順番の戻りの手がかりを得られます。画像だけの自作PDF12条件を現行Toolで読み直しました。

番号だけOCRできないページがPDF内にある場合と、ページそのものがPDFにない場合は、同じ結果になりませんでした。一方、OCR誤読・意図した無番号ページ・章ごとの番号リセットは、人が紙面と照らして確認する必要があります。

今回の検証方法

入力
12種類、計70ページの自作PDF。紙面と番号を画像化し、PDF text layerなし。実在資料・個人情報なし。
測定
公開済みスキャンPDF・ページ抜けチェッカーの操作画面で、実際に全条件をOCRしました。
条件
Tesseract.js 7.0.0、eng、数字whitelist、PSM 7。採用しきい値70。PDF.js 6.3.289でrender。
データ
PDF・README・測定JSON。Tool入力PDF・ページ画像・OCR結果の外部送信0。共通の広告・アクセス解析通信は別です。

PDFページと、紙面の印刷番号は別物

PDFビューア上の3ページ目と、紙面に印刷された「3」は同じ意味ではありません。途中欠落のPDFは4枚で、印刷番号は1、2、4、5です。PDF 2→3は1枚進みますが、印刷2→4は2進みます。

PDF上の1、2、3、4と印刷1、2、4、5の違い
missing-page.pdfの実測。印刷3のページがPDFにない条件を自作しました。

正常な10ページでは、候補0件だった

印刷1~10は全10枚を番号として採用でき、confidenceは全て96でした。抜け・重複・順序異常・進行不一致は0件です。ただし候補0件だけでPDF全体の完全性を保証する結果ではありません。

途中欠落・二重スキャン・順番変更は、異なる候補になる

1、2、4、5はページ抜け候補1件で、印刷3の不足候補でした。1、2、2、3、4は重複番号候補1件です。同じ番号でも、同じ紙面の二重スキャンか、誤植か、OCR誤読かは自動では区別できません。

1、2、4、3、5への入れ替えは、ページ抜け候補2件+順序異常候補1件でした。隣接する採用番号の進み方ごとに比較するため、1つの入れ替えで複数の候補が出ます。この候補数は、実際に欠落した紙の枚数とは違います。

OCRできないページがあるだけでは、ページ抜けにならない

5枚の1、2、3、4、5のうち、印刷3だけを極めて薄くしました。OCR textは空、confidenceは0で「読取できず」になりましたが、ページ抜け候補は0件でした。

採用できた印刷2と4の間にPDFページが1枚存在し、PDF上も番号も2進むためです。OCRできなかったPDFページも進行数に含まれます。紙面の3を確認して手動番号3を入力すると、「手動修正済み」1件に変わり、候補0件を維持しました。

PDF内にある読取失敗ページと、PDF内にないページの比較
OCR失敗条件と途中欠落条件の実測を並べた図。紙面の内容を比較した判定ではありません。

意図した無番号ページは、除外すると結果が変わる

1、2、番号なし、3、4の5枚は、最初に「読取できず」1件とページ進行不一致1件が出ました。印刷2→3は1進むのに、PDF上は2枚進むためです。

紙面を見て3枚目を「番号なし」として除外すると、進行不一致は0件になりました。白紙を自動検出して除外する機能ではありません。人がこのPDFページは印刷番号を持たないと確認した場合の操作です。

OCRの結果は、番号位置とROI設定にも左右される

ROIは、画像のうちOCRする領域です。奇数PDFは右下、偶数PDFは左下に番号を置いた8枚では、右下固定で4枚読取・4枚読取できずでした。PDFページindex基準の交互位置を使い、ROI Aを右下・Bを左下にすると、全8枚を読取できました。読取時のconfidenceは96です。

上中央に番号を置いた4枚は、底部中央ROIで0枚読取。top-center presetへ変更すると、4枚読取に改善しました。空の領域をOCRしている場合は、しきい値を変える前にROIの位置を確認できます。

左右交互の番号位置と設定前後の読取4から8の変化
実際のROIは各PDFページに対する相対座標です。左右は紙面の印刷番号の奇偶でなく、PDF page indexの奇偶に対応します。

範囲の先頭・末尾の欠落には、期待する番号が必要

3~8の6枚は、期待番号なしで候補0件でした。解析範囲の最初の印刷番号を1と設定すると、範囲先頭の抜け候補1件、約2ページ分の不足に変わりました。

1~8の8枚も、期待番号なしで候補0件です。範囲の最後を10と設定すると、範囲末尾の抜け候補1件、約2ページ分の不足になりました。Toolが文書は必ず1から始まり10で終わると決めるわけではありません。

意図した番号リセットや、大きな飛びは人が確認する

1、2、3、1、2、3は、3→1で順序異常候補1件でした。章・付録・別文書の結合による意図した番号リセットかは自動で区別できません。

1、2、23、24は、2→23の進行21を大きな番号変化1件として表示しました。読み取った24のconfidenceは94、他は96です。現行実装は番号の進行が20を超えるとこの候補を出します。「抜け22ページ」と断定する結果ではありません。

12条件の実測結果

「PDF内の印刷番号」は、各PDFページに配置した番号の順です。変更前後の候補を全条件分載せています。

条件PDF内の印刷番号Tool結果人が確認すること
正常な10ページ
normal-sequence.pdf
1, 2, 3, 4, 5, 6, 7, 8, 9, 10候補0件
OCR読取 10/10
OCR結果が紙面の番号と一致するか
途中のページ欠落
missing-page.pdf
1, 2, 4, 5ページ抜け候補1件
OCR読取 4/4
印刷3が必要な文書か
同じ番号の二重スキャン
duplicate-page.pdf
1, 2, 2, 3, 4重複番号候補1件
OCR読取 5/5
重複スキャン・誤植・OCR誤読のどれか
ページ順の入れ替え
out-of-order.pdf
1, 2, 4, 3, 5ページ抜け候補2件/順序異常候補1件
OCR読取 5/5
実際の順番と全候補の関係
意図した無番号ページ
intentional-unnumbered-page.pdf
1, 2, 番号なし, 3, 4ページ進行不一致1件
変更後:候補0件
OCR読取 4/5 → 4/5
この紙面が意図した無番号ページか
途中の番号だけOCRできない
ocr-unreadable-middle.pdf
1, 2, 3, 4, 5候補0件
変更後:候補0件
OCR読取 4/5 → 4/5
存在するPDF 3の紙面番号を目視確認
左右交互の番号位置
alternating-page-number-position.pdf
1, 2, 3, 4, 5, 6, 7, 8候補0件
変更後:候補0件
OCR読取 4/8 → 8/8
PDF index基準の奇数・偶数と左右が合うか
上中央の番号
top-page-number.pdf
1, 2, 3, 4候補0件
変更後:候補0件
OCR読取 0/4 → 4/4
紙面に合うROI位置か
範囲先頭の欠落
missing-start.pdf
3, 4, 5, 6, 7, 8候補0件
変更後:範囲先頭の抜け候補1件
OCR読取 6/6 → 6/6
解析範囲の最初の番号はいくつか
範囲末尾の欠落
missing-end.pdf
1, 2, 3, 4, 5, 6, 7, 8候補0件
変更後:範囲末尾の抜け候補1件
OCR読取 8/8 → 8/8
解析範囲の最後の番号はいくつか
章ごとの番号リセット
section-number-reset.pdf
1, 2, 3, 1, 2, 3順序異常候補1件
OCR読取 6/6
章・付録で番号が戻る意図があるか
大きな番号変化
large-number-jump.pdf
1, 2, 23, 24大きな番号変化1件
OCR読取 4/4
OCR誤読・文書結合・本当の飛びか

読取数はOCRのまま採用した番号の数です。手動修正と無番号除外は別に数えます。

正常な10ページ:OCRと設定の詳細

PDF 10枚。印刷番号 1, 2, 3, 4, 5, 6, 7, 8, 9, 10。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
333 963番号読取
444 964番号読取
555 965番号読取
666 966番号読取
777 967番号読取
888 968番号読取
999 969番号読取
101010 9610番号読取
途中のページ欠落:OCRと設定の詳細

PDF 4枚。印刷番号 1, 2, 4, 5。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。ページ抜け候補1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
344 964番号読取
455 965番号読取
同じ番号の二重スキャン:OCRと設定の詳細

PDF 5枚。印刷番号 1, 2, 2, 3, 4。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。重複番号候補1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
322 962番号読取
433 963番号読取
544 964番号読取
ページ順の入れ替え:OCRと設定の詳細

PDF 5枚。印刷番号 1, 2, 4, 3, 5。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。ページ抜け候補2件/順序異常候補1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
344 964番号読取
433 963番号読取
555 965番号読取
意図した無番号ページ:OCRと設定の詳細

PDF 5枚。印刷番号 1, 2, 番号なし, 3, 4。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。ページ進行不一致1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
3番号なし(空)0—読取できず
433 963番号読取
544 964番号読取

変更後

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
3番号なし(空)0—番号なし・除外
433 963番号読取
544 964番号読取
途中の番号だけOCRできない:OCRと設定の詳細

PDF 5枚。印刷番号 1, 2, 3, 4, 5。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
33(空)0—読取できず
444 964番号読取
555 965番号読取

変更後

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
33(空)03手動修正済み
444 964番号読取
555 965番号読取
左右交互の番号位置:OCRと設定の詳細

PDF 8枚。印刷番号 1, 2, 3, 4, 5, 6, 7, 8。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.66,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
22(空)0—読取できず
333 963番号読取
44(空)0—読取できず
555 965番号読取
66(空)0—読取できず
777 967番号読取
88(空)0—読取できず

変更後

ROI alternating/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.66,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.04,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
333 963番号読取
444 964番号読取
555 965番号読取
666 966番号読取
777 967番号読取
888 968番号読取
上中央の番号:OCRと設定の詳細

PDF 4枚。印刷番号 1, 2, 3, 4。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
11(空)0—読取できず
22(空)0—読取できず
33(空)0—読取できず
44(空)0—読取できず

変更後

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.02,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
333 963番号読取
444 964番号読取
範囲先頭の欠落:OCRと設定の詳細

PDF 6枚。印刷番号 3, 4, 5, 6, 7, 8。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
133 963番号読取
244 964番号読取
355 965番号読取
466 966番号読取
577 967番号読取
688 968番号読取

変更後

ROI same/confidenceしきい値 70/expected first 1/expected last 未指定。範囲先頭の抜け候補1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
133 963番号読取
244 964番号読取
355 965番号読取
466 966番号読取
577 967番号読取
688 968番号読取
範囲末尾の欠落:OCRと設定の詳細

PDF 8枚。印刷番号 1, 2, 3, 4, 5, 6, 7, 8。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。候補0件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
333 963番号読取
444 964番号読取
555 965番号読取
666 966番号読取
777 967番号読取
888 968番号読取

変更後

ROI same/confidenceしきい値 70/expected first 未指定/expected last 10。範囲末尾の抜け候補1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
333 963番号読取
444 964番号読取
555 965番号読取
666 966番号読取
777 967番号読取
888 968番号読取
章ごとの番号リセット:OCRと設定の詳細

PDF 6枚。印刷番号 1, 2, 3, 1, 2, 3。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。順序異常候補1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
333 963番号読取
411 961番号読取
522 962番号読取
633 963番号読取
大きな番号変化:OCRと設定の詳細

PDF 4枚。印刷番号 1, 2, 23, 24。このPDFをダウンロード

変更前(初回)

ROI same/confidenceしきい値 70/expected first 未指定/expected last 未指定。大きな番号変化1件

{"A":{"x":0.35,"y":0.83,"width":0.3,"height":0.15},"B":{"x":0.35,"y":0.83,"width":0.3,"height":0.15}}

PDF page印刷番号OCR textconfidence採用番号status
111 961番号読取
222 962番号読取
32323 9623番号読取
42424 9424番号読取

confidenceは、正解確率ではない

ToolPipoは、OCR結果を採用するためのしきい値として70を使います。今回の数字読取は94~96、空のOCR textは0でした。confidenceを「正解確率70%」とは解釈しません。高い値でも紙面との照合は必要です。

低confidence条件も試しましたが、9種類のサイズ・blur・noise条件は、数字として読めた場合94または96、その他は空のOCR textでした。数字としてparseできて70未満の条件を作れなかったため、低confidenceのfixtureは採用していません。しきい値を都合よく変更せず、大きな番号変化を含めて12条件に確定しました。

このToolだけでは判断できないこと

  • 本当に紙がなくなったか、元文書の番号誤植か、意図した欠番か
  • 意図した無番号ページか、章で番号が戻るのか、OCR誤読なのか
  • ページ内容が同じか、PDF全体が完全か、スキャン品質全体がよいか

自動OCRは数字0~9をwhitelistにして、1~999999のアラビア数字を採用対象にします。ローマ数字i・ii・iii・iv、漢数字一・二・三、A-1や1/10を正常なページ番号として自動解析できる機能ではありません。番号の進行から出た候補を、紙面と合わせて確認してください。

自分のスキャンPDFを確認する

番号位置にROIを合わせ、読取できなかった番号は紙面を確認してください。必要に応じて手動修正・番号なし除外・範囲端の期待番号を使えます。

自分のスキャンPDFを確認する

再現用PDFと測定JSON

12条件のPDFと測定結果をダウンロード/公開results JSON

README、12個のPDF、測定snapshotを含みます。個別PDFのSHA-256もJSONに保存しています。OCR結果は環境・render条件・ROIで変わる可能性があります。

package:317,848 bytes

SHA-256:75c9e59e8ff8e60c08eb4fbf152a8ea35cc90b71f8b665e61559d8175bb14186

ZIP自身の最終hashは循環参照を避け、外部の公開JSONを正本としています。同梱JSONは同じ測定結果のsnapshotです。

検証条件・実装資料

検証日2026-10-05。Chromium 151.0.7922.34。紙面は612×792 pt、画像1224×1584 px、Arial bold 48px。OCR時のPDF renderはscale上限2.5・最大400万画素。ROI画像をgray化しcontrast 1.35で処理する現行Toolの実装をそのまま使用しました。画像生成日時とPDF metadata日時は固定しています。

OCR workerの返り値を観測し、結果を変更せず保存しました。画面のOCR番号・採用番号・status・候補表示と、同じ判定moduleを使ったJSONの一致も確認しました。