Claude Code × Medical Application
【Claude Code】目視の確認を自動チェックに Part1:改ページの検出 — 灰色の濃さで余白を測る

1. はじめに — 崩れたページは「余白」に表れる
参照ページで見たとおり、改ページが崩れたページには共通の形があります。
- ページの最後に1〜2行だけ残って、下が大きく空いている
- 列が次のページに送られて、右側が大きく空いている
- 見出しと脚注だけで、中身がほとんど無い
数値は正しいので、数値の確認では見つかりません。人が PDF を1ページずつめくって見つけています。逆に言えば、ページの下の端と右の端にどれだけ白い部分があるかを測れば、目で見るべきページを絞り込めます。
この回では、その測り方を順に見ていきます。
- 手法の出どころ
- Claude Code に任せる前に書いたもの
- ページを灰色の画像にして、白の割合を測る
- 印を付ける — しきい値と「しきい値に近い」札
- 1ページ目を除く理由と、検査する範囲
- しきい値を動かすと何が変わるか
- この手法で見つからないもの
- 31ページ連載で使うダミーの帳票(検査は2〜31ページの30ページ)
- 8ページCHECK が付いたページ。わざと崩した8ページと一致
- 0.98下の端・右の端の白の割合のしきい値
- 約30ミリ秒1ページあたりの計算時間(ブラウザの中)
2. 手法の出どころ
この方法は、PharmaSUG 2026 で発表された論文「Detecting Abnormal Page Breaks Using Grayscale Pixel-Density Analysis in R Shiny」(Yi Guo, Paper AP-233)にもとづきます。同じ手法は R/Pharma 2026 のワークショップでも紹介されました。
論文の考え方は単純です。ページを灰色の画像にして、白い画素の割合を数える。表や文字が詰まった普通のページは白の割合がほどほどで、崩れたページは端のほうがほぼ真っ白になる。この差を数字で捉えます。
TLF Visual QC では、この手法を論文に書かれた手順と既定値のとおりに、ブラウザの中で動く形で書き直しました。PDF をサーバーに送らず、使う人のパソコンの中だけで計算するためです(この設計は Part4 で扱います)。
3. Claude Code に任せる前に書いたもの
3-1. 指示書
実装は Claude Code に任せましたが、始める前に、何を作って何を守るかを指示書に書きました。中身は次のとおりです。
| 項目 | 書いたこと |
|---|---|
| 目的 | TLF の PDF から、不自然な改ページのページを見つける |
| 手順と既定値 | 論文の手順どおり。解像度・縮小の割合・切り取る帯・白の判定・しきい値は論文の既定値をそのまま使う |
| 守ること | 利用者の PDF をどこにも送らない。外部への通信(解析や広告のタグを含む)を入れない。実在の薬剤名・試験番号・会社名を使わない |
| 確かめ方 | わざと崩したページを混ぜたダミーの帳票を作り、正解のページ番号を先に決めておく。CHECK のページが正解と一致すれば合格 |
| 止まる場所 | 改ページの検出まで実装したら、報告書を書いて止まる。色の確認や画面の仕上げは次の段階 |
3-2. 人が決めたこと
指示書で特に大事だったのは、手順と既定値を自分たちで工夫しないと決めたことです。
論文の値には、それぞれ理由があります。「もっと良くなるかも」と手を入れると、論文の結果と比べられなくなり、何が効いているのかも分からなくなります。手を入れるのは、論文どおりに動くことを確かめてから、と順番を決めました。
もう1つは、正解を先に用意することです。どのページを崩したかを記録したダミーの帳票があれば、「CHECK が付いた8ページは、わざと崩した8ページと同じか」で合否が決まります。結果を見てから「だいたい合っている」と判断する余地をなくしました(確かめ方の詳細は Part2 で扱います)。
4. ページを灰色の画像にして、白の割合を測る
手順は6段です。
4-1. ページを画像にする(120 dpi)
PDF の1ページを、120 dpi の画像に描きます。ブラウザの中では、PDF を表示するための部品(PDF.js)でページを描き、その画素を読み取ります。
4-2. 灰色にする
色の付いた画像を、明るさだけの灰色の画像にします。画素の値は 0(黒)から 255(白)です。
4-3. 縮める(25%)
画像を縦横25%に縮めます。細かい文字の形はつぶれますが、ここで知りたいのは「どこが白いか」だけなので、困りません。計算する画素が16分の1になるので、速くなります。
4-4. 端の帯を切る(上下6%、左右8%)
ページの上と下の6%、左と右の8%を切り落とし、真ん中の部分だけを見ます。
用紙の余白や、毎ページに同じように入るページ番号・ヘッダーは、どのページにもあるので、ページの違いを見分ける役に立ちません。先に除いておくと、本当に見たい「中身の配置」の違いが数字に出やすくなります。
4-5. 白とみなす(245 より明るい画素)
画素の値が 245 より大きければ「白」と数えます。真っ白(255)だけでなく、紙の地に近い明るい灰色も白に入れます。表の罫線や薄い網かけは白に入りません。
4-6. 3つの白の割合
残った部分について、白い画素の割合を3つ計算します。
| 指標 | 範囲 | 役割 |
|---|---|---|
| 下の端の白の割合 | 残った部分の 下半分 | ページの最後に少しだけ残った行を見つける(主) |
| 右の端の白の割合 | 残った部分の 右半分 | 列が送られて右が空いたページを見つける(主) |
| 全体の白の割合 | 残った部分の 全体 | ほぼ白紙のページを見つける(補助) |
5. 印を付ける — しきい値と「しきい値に近い」札
5-1. CHECK の条件
次のどれか1つでも満たしたページに CHECK の印を付けます。それ以外は OK です。
- 下の端の白の割合が 0.98 より大きい
- 右の端の白の割合が 0.98 より大きい
- 全体の白の割合が 0.95 より大きい
下半分の98%以上が白、というのは、下半分に文字がほとんど無いということです。普通の表のページでは、表が最後の行まで詰まっているので、そうはなりません。

ダミーの帳票では、5, 8, 10, 15, 18, 21, 24, 29 の8ページに CHECK が付きました。わざと崩した8ページと同じです。
5-2. 平均と標準偏差は判定に使わない
論文では、ページの画素の平均と標準偏差も計算しますが、判定には使わず、参考の値として表示するだけです。平均や標準偏差はページ全体の白さの変化は捉えますが、白い部分が どこにあるか は分かりません。崩れたページかどうかは「端に寄って白いか」で決まるので、位置を持つ3つの割合で判定します。
中央値など、外れ値に強い指標も使いません。ページの画素のほとんどは白に近い値なので、中央値はどのページでもほぼ同じになり、差が出ないからです。
5-3. 「しきい値に近い」札
しきい値ちょうどで線を引くと、0.979 と 0.981 で判定が分かれます。そこで TLF Visual QC では、白の割合がしきい値の ±0.01 以内 のページに、控えめな「しきい値に近い」札を付けることにしました。論文には無い、ツールで足した表示です。判定そのものは変えません。

ダミーの帳票では、10, 15, 21, 24 の4ページ(いずれも CHECK)と、31ページ(OK)に札が付きます。31ページは、短い表のあとに脚注が2行あるページで、下の端の白の割合は 0.977 です。CHECK にはなりませんが、OK でも念のため目で確かめておきたいページ として拾えます。
6. 1ページ目を除く理由と、検査する範囲
論文では、検査を 2ページ目から 始めます。1ページ目は表紙や目次で、ロゴや題名が中心になり、帳票の本文とは形が違うからです。1ページ目の崩れはまれで、あってもふつうの見直しですぐ気づけます。
TLF Visual QC も既定では2ページ目からにしています。ただ、表紙の無い PDF(1ページ目からいきなり表が始まるもの)もあるので、検査する範囲を自分で決められるようにしました。

7. しきい値を動かすと何が変わるか
0.98 という値は、論文が既定にしたもので、どの帳票にも最適とは限りません。しきい値を下げると印が増え、上げると減ります。
ダミーの帳票では、わざと崩した8ページは下の端か右の端の白の割合が 1.000 に近いので、しきい値を 0.99 まで上げても8ページのまま残りました。下げていくと、0.97 で31ページ(短い表と脚注のページ)、0.94 で7ページ(表がページの3分の2で終わる普通のページ)が加わり、10ページになります。全体のしきい値(0.95)を 0.91 以下に下げても、31ページが加わります。
しきい値を下げすぎると、普通のページにも印が付き、目で見るページが増えます。上げすぎると、崩れ方が小さいページを見逃します。会社や帳票の作り方によって、ちょうどよい値は変わります。論文も、しきい値は固定の決まりなので、各社のレイアウトに合わせて調整が要る、としています。
8. この手法で見つからないもの
この手法は「端に寄った白い部分」を測るので、次のような場合には役に立ちません。
| 場合 | 起きること |
|---|---|
| もともと短い表 | 数行で終わる集計表は、崩れていなくても下が白いので CHECK になる |
| 下半分に脚注やフッターがある | 切り落とす帯(下の6%)より上、測る範囲の下半分に脚注やフッターがあると、その文字の分だけ白の割合が下がる。表の下が大きく空いていても、0.98 に届かず OK のままになることがある |
| 余白以外の崩れ | 表の見出しが次のページで繰り返されていない、行の途中で切れている、などは余白に表れない |
短い表の印は、目で見れば数秒で「崩れではない」と分かります。一方、脚注やフッターによる見逃しは、印が付かないぶん気づきにくいので、脚注の多い帳票では注意が要ります。ツールの About にも、この注意を書いています。申請形式の実際の帳票で、この見逃しがどう現れたかは Part2 で紹介します。
9. まとめ
- 崩れた改ページは、ページの下の端か右の端の不自然な余白として現れる
- ページを120 dpi の画像にし、灰色にして25%に縮め、上下6%・左右8%を切り落としたうえで、下半分・右半分・全体の白(245 より明るい画素)の割合を測る
- 下か右が 0.98、全体が 0.95 を越えたら CHECK。ツールでは、しきい値の ±0.01 以内に「しきい値に近い」札も付ける
- 手順と既定値は論文どおりにし、正解つきのダミーで確かめてから手を入れる、と先に決めた
- 短い表は印が付き、下半分の脚注やフッターは見逃しのもとになる。目視の代わりではなく、目視の絞り込みに使う
崩れたページを見つけるのは、目より数字のほうが疲れません。ただ、数字が何を測っているかを知っておくことが、見逃しを防ぐいちばんの近道です。
次のステップ
Part2 では、この計算が正しく動いているかをどう確かめたかを扱います。画像の処理を別の道具と画素単位で突き合わせたこと、わざと崩したダミーの帳票と正解の作り方、そして R Consortium が公開している申請形式の帳票で試した結果を紹介します。
出典
- Yi Guo. Detecting Abnormal Page Breaks Using Grayscale Pixel-Density Analysis in R Shiny. PharmaSUG 2026, Paper AP-233. https://pharmasug.org/proceedings/2026/AP/PharmaSUG-2026-AP-233.pdf(この手法は R/Pharma 2026 のワークショップでも紹介された)
- 本ページの帳票の画像と数値は、架空のデータで作成したダミーの TLF(31ページ)によるものです。実在の試験・薬剤・企業とは関係ありません
