はじめに
「それ、誰が使うの?」と聞かれたら、たぶん私です。
多くの人に必要とされるサービスではありませんが、自分の作業では何度も発生する不便だったため、専用のツールを作りました。
今回作ったのは、国際規格などのPDFから、次の3項目をExcelへ抽出するツールです。
- Clause:条項番号
- Text:条項本文
- Page:PDF上のページ番号
出力形式は、非常に単純です。
| Clause | Text | Page |
|---|---|---|
| 1 | Scope ... | 5 |
| 3.1 | Terms and definitions ... | 8 |
| 4.2 | The equipment shall ... | 12 |
普通の人から見れば、「PDFの文章をExcelへ入れるだけ」に見えるかもしれません。
しかし、国際規格の内容を調査や比較に使おうとすると、単純なコピー&ペーストでは、なかなかうまくいきませんでした。
なぜ作ったのか
国際規格の調査では、PDFを読みながら、必要な条項をExcelへ整理することがあります。
Excelに整理しておくと、次のような作業がしやすくなります。
- 条項ごとの内容確認
- 旧版と新版の比較
- 適用要件の整理
- コメントや調査結果の追記
- ページ番号を使った原文確認
- 説明資料や差異表の作成
ところが、PDFから文章をそのままコピーすると、次のような問題が発生します。
- 条項番号と本文が別々に抽出される
- 文章が不自然な位置で改行される
- ヘッダーやフッターが本文に混ざる
- ページ番号が本文として取り込まれる
- AnnexやBibliographyの構造が崩れる
- 表や図の中の文字まで混ざる
- 同じ条項の本文が複数行に分割される
一般的なPDF変換ツールは、PDFの見た目を別の形式へ変換することを目的としています。
私が欲しかったのは、見た目を再現したファイルではありません。
欲しかったのは、調査に使える形に構造化されたデータでした。
欲しかった出力
私が最低限必要としていたのは、次の3列です。
Clause | Text | Page
Clause列には、次のような条項番号を入れます。
1
2
3.1
3.1.1
4.2.3
Annex A
Bibliography
Text列には、その条項に属する本文をまとめます。
Page列には、抽出元のPDFページ番号を入れます。
ページ番号は、後から原文を確認するための証跡になります。
内容だけを抽出できても、どのページから取得した文章なのか分からなければ、調査資料としては使いにくいためです。
ツールの構成
ツールはPythonで作成しました。
主な処理は、次の流れです。
- PDFから文字列と位置情報を取得する
- ヘッダーやフッターなどの不要な文字を除外する
- 条項番号らしい文字列を判定する
- 条項番号以降の本文をまとめる
- ページ番号を付与する
- Excelファイルとして出力する
画面からPDFを選択し、必要に応じて抽出対象ページを指定できるようにしました。
出力されたExcelでは、Clause、Text、Pageを横並びで確認できます。
難しかった点
1. 数字がすべて条項番号とは限らない
PDF内には、条項番号以外にも多くの数字があります。
例えば、次のようなものです。
10 mm
50 Hz
2 kg
Figure 3
Table 4
ISO 12345
数字だけを見て条項番号と判定すると、単位、図番号、表番号、規格番号などがClause列に入ってしまいます。
そのため、文字列の形式だけでなく、周辺の文字や位置関係も考慮する必要がありました。
例えば、単純に次のような形式だけを条項番号として扱うとします。
3
3.1
3.1.1
それでも、文書内の数字が同じような形で配置されていれば、誤判定が起こります。
条項番号かどうかは、その文字列だけで完全に判断できるとは限りません。
2. 文字を取得できても、文章になるとは限らない
PDFから文字を取得できても、取得結果がそのまま読める文章になるとは限りません。
例えば、次の文章が、
The equipment shall be designed to prevent
unintentional operation.
複数の行や単語に分割されて取得されることがあります。
反対に、見出し、本文、箇条書きなど、本来は分けるべき要素が、連続した文字列として取得される場合もあります。
特にOCRを利用したPDFでは、文字認識ができても、読み順、段落、Clauseとの対応までは自動的に復元されません。
そのため、このツールでは、取得した文字列をそのままExcelへ出力するのではなく、行の位置や周辺の要素を確認しながら、本文として再構築する必要がありました。
この「OCRで拾った文字を文章へ戻す処理」については、別の記事で詳しくまとめます。
3. すべての改行を消せばよいわけではない
PDFから取得した行を単純に結合すると、通常の英文は読みやすくなります。
しかし、すべての改行を消すと、別の問題が発生します。
例えば、次のような箇条書きがあります。
a) temperature;
b) pressure;
c) vibration.
これを単純に一行へ結合すると、文書上の構造が分かりにくくなります。
また、次のような要素まで一つにつながる可能性があります。
- 条項見出し
- 条項本文
- 箇条書き
- 注記
- Figureタイトル
- Tableタイトル
- 次の条項番号
つまり、分割された文章は結合したい一方で、本来分かれている要素は残す必要があります。
文章をつなげる処理よりも、「どこはつなげてはいけないか」を判断する方が難しいこともありました。
4. ヘッダーやフッターが本文へ混ざる
規格PDFでは、各ページに同じヘッダーやフッターが表示されることがあります。
例えば、次のような情報です。
INTERNATIONAL STANDARD
ISO 12345:2026
© ISO 2026
15
人間がPDFを読むときは、これらを本文とは認識しません。
しかし、文字抽出処理から見ると、ページ内にある通常の文字列です。
そのため、何も処理しなければ、ページが変わるたびに同じ情報が本文へ混ざります。
繰り返し出現する文字列や、ページ上部・下部の位置情報などを使って、本文ではない可能性が高い文字を除外する必要がありました。
5. 規格ごとに構造が少し違う
国際規格には一定の構成がありますが、PDFの作り方は完全に同じではありません。
例えば、次のような違いがあります。
- 文字サイズ
- インデント
- 段組み
- Annexの表記
- FigureやTableの配置
- ページ番号の位置
- OCRの有無
- テキストレイヤーの状態
- 行や単語の分割単位
一つのPDFで意図した結果になっても、別のPDFでは誤抽出が発生することがあります。
そのため、特定の一冊だけに合わせるのではなく、複数の条件を組み合わせて、できるだけ保守的に判定するようにしました。
ただし、すべての規格PDFに完全対応できるわけではありません。
文書ごとの違いを吸収することは、現在も継続している課題です。
Figureの中の文字まで本文として抽出される
PDFから文字を取得すると、本文だけでなく、図の内部に配置されている文字も抽出されます。
例えば、図の中に次のようなラベルがあるとします。
Input
Sensor
Control unit
Output
Power supply
これらも通常の文字列として取得されるため、そのままでは本文へ混ざります。
一方で、次のようなFigure番号とタイトルは残したい情報です。
Figure 3 — Example of system configuration
私が必要としていたのは、次のような処理でした。
図内部の文字 → 除外する
Figure番号とタイトル → 残す
図の前後にある通常本文 → 残す
図に関係する文字をすべて削除すると、Figure番号とタイトルまで消えてしまいます。
反対に、すべて残すと、図内部のラベルが本文へ大量に混ざります。
この処理も独立した課題になったため、別の記事で詳しくまとめます。
AnnexやBibliographyも独立して扱いたい
国際規格では、本文の後にAnnexやBibliographyが続くことがあります。
例えば、次のような構成です。
1 Scope
2 Normative references
3 Terms and definitions
4 Requirements
Annex A
Annex B
Bibliography
単純に数字から始まる行だけをClauseとして認識すると、AnnexやBibliographyを正しく扱えません。
そのため、通常の条項番号とは別に、次のような見出しも構造として認識する必要がありました。
Annex A
Annex ZA
Bibliography
Annexの中には、次のような下位項目が含まれる場合もあります。
A.1
A.2
A.2.1
通常本文とAnnex内の条項を、同じExcel上でどのように整理するかも検討が必要でした。
「PDFをExcelに変換するツール」ではない
このツールは、PDFの内容を完全に再現することを目的としていません。
表、数式、画像、複雑な段組みなどを、そのままExcelへ移すものでもありません。
目的は、国際規格の文章を、調査や比較に利用しやすい単位へ整理することです。
そのため、処理の中心は、単純なファイル変換ではなく、次のような文書の構造化です。
PDF上の文字情報
↓
不要な情報を除外
↓
Clauseと本文の関係を判定
↓
分割された本文を再構築
↓
ページ番号を付与
↓
Excelへ出力
PDFをExcelへ変換すること自体が目的ではありません。
PDFから、調査に必要な情報を取り出し、再利用できる形へ整えることが目的です。
ページ番号を残す理由
抽出した文章だけをExcelへ出力することもできます。
それでもPage列を設けたのは、後から原文へ戻れるようにするためです。
自動抽出では、次のような誤りが発生する可能性があります。
- 条項番号の誤認識
- 本文の欠落
- 不自然な文章結合
- ヘッダーやフッターの混入
- Figure内テキストの混入
- ページをまたぐ文章の分断
そのため、Excel上の文章だけを最終的な根拠にはできません。
Page列があれば、確認したい箇所をPDF原文ですぐに見直せます。
自動化によって原文確認を不要にするのではなく、原文確認をしやすくすることを重視しました。
実際に作って分かったこと
最初は、PDFから文字を取り出せば、すぐにExcelへ整理できると思っていました。
実際には、文字を取り出すことよりも、次の判断の方が難しい作業でした。
- 何を本文とするか
- 何を削除するか
- どこからどこまでを一つの条項とするか
- どの改行を残すか
- どの行を結合するか
- FigureやTableをどこまで残すか
- どの情報を証跡として残すか
これは単なるPDF変換というより、文書構造をどのように解釈するかという問題でした。
PDF上では同じように見える文章でも、内部のデータ構造が異なる場合があります。
人間にとって自然な読み順と、PDFから取得できる文字列の順番が一致するとも限りません。
見た目として読める文書を、機械が扱える形へ変えるには、文字認識とは別の処理が必要でした。
保守的に処理する
このツールでは、判断が難しい場合に、積極的に文章を加工しすぎない方針を取っています。
例えば、二つの行が同じ段落かどうか判断できない場合、無理に結合すると、異なる文章を一つにしてしまう可能性があります。
不要な文字列が少し残る場合は、後から確認して修正できます。
しかし、本来別々だった文章を誤って結合すると、原文との対応関係が分かりにくくなります。
そのため、
自動処理で完全な文章を作ることよりも、原文へ戻れる状態を保つ
ことを優先しました。
完全自動化ではなく、確認作業を支援するためのツールという位置づけです。
私しか得しないけれど、私には役立つ
このツールが必要な人は、それほど多くないと思います。
国際規格PDFから条項番号と本文を取得し、ページ番号付きでExcelへ整理したい人は、かなり限られています。
ただ、私の作業では何度も発生します。
一回の作業時間を少し短縮するだけでも、繰り返し使えば大きな差になります。
また、毎回同じ形式でExcelへ整理できれば、案件ごとの結果も比較しやすくなります。
「多くの人に使われるか」ではなく、
自分が繰り返し困っていることを、再利用できる処理に変える
というのが、今回の個人開発の目的でした。
今後改善したいこと
現在も、すべてのPDFを完全に処理できるわけではありません。
今後は、次のような改善を考えています。
- 文書ごとに異なるOCR結果への対応拡張
- 段組みPDFへの対応
- 英文段落の結合精度向上
- 箇条書き構造の復元
- Annex構造の判定改善
- TableタイトルとFigureタイトルの判定改善
- 文書ごとの判定設定
- 抽出結果の確認画面
- 誤抽出箇所を修正しやすい仕組み
- テスト対象となる文書パターンの追加
すべてを自動で正しく処理することは簡単ではありません。
そのため、対象文書を増やしながら、誤認識しやすいパターンを一つずつ確認しています。
このツールから派生した二つの課題
このツールを作る過程では、文字を抽出するだけでは解決できない問題がいくつもありました。
特に大きかったのは、次の2点です。
- OCRで取得した文字列を、Clauseごとの読める文章へ戻すこと
- 図内部の文字を除外し、Figure番号とタイトルだけを残すこと
どちらもツール全体の一機能ですが、それぞれ独立した処理が必要になりました。
具体的な判定方法や、実装時に困った点については、別の記事で詳しくまとめます。
まとめ
今回作ったのは、国際規格PDFから次の情報をExcelへ抽出する、自分専用のツールです。
Clause | Text | Page
広く使われるサービスではありません。
しかし、自分の実務で何度も発生する作業を減らすという意味では、十分に価値がありました。
PDFから文字を取得するだけでは、調査に使えるデータにはなりません。
不要な情報を除外し、条項番号と本文の関係を判定し、分割された文章を再構築し、原文へ戻るためのページ番号を残す必要があります。
誰が使うのかと聞かれたら、今のところは私です。
それでも、自分が繰り返し必要としているなら、作る理由としては十分なのだと思います。
運営サイト
法規・規格調査や、個人開発したツールについて発信しています。