PDFからテキストを取り出したいときに使えるテクニック
更新日:
このページの目的
PDFファイル(以下、「PDF」という)からテキストを取り出す目的の一つとして、テキストをデータとして活用したいことがあります。
ここではPDFに数字や文字として保存されているデータを取得し、加工する作業を自動化したいときに使えるテクニックをいくつか紹介します。
この記事は、2021年7月27日に行われた「ちょっと一息・アンテナハウスウェビナー」の内容をもとに、Webページとして適切にするように変更を加えたものです。ウェビナーの録画はYouTubeのアンテナハウスPDFチャンネルでも公開されています。次からご視聴いただけます。
PDFからテキストを取り出したい!使えるテクニックをご紹介
データはPDFファイルしかないのに、その中のテキストデータをどうしても取り出したいことがあります。そんなときに使えるテクニックをご紹介します。
PDFからデータを取り出す処理を自動化したいのはどんなとき?
PDFからテキストを取り出して活用したいといった場面としては、毎日、毎週のデータ集計や報告書つくりなどに使うデータがPDFとしてしか入手できないときがあります。
毎日、毎週の定型業務のためのデータをPDFから取り出すとき、同じような形式のデータがPDFの形式大量にあるときには、PDFからデータを取り出す作業を自動化できれば効率が良くなります。
テキスト抽出自動化のためのライブラリ
PDFからテキストを抽出する処理を自動化するときは、通常はPDFを扱うライブラリを使うことになります。また、抽出したい文字範囲をまず調べ、調べた範囲をライブラリに知らせてテキスト抽出を実行する、という二つの段階があります。
上の図は、弊社の製品を利用した例ですが、『PDF Viewer SDK』のPDFビューアーでまずテキストの位置をしらべて、『PDF Tool API』のテキスト抽出コマンドに矩形範囲を指定してテキストを抽出すると、IDの数値が取れるといった例になっています。
ライブラリを使って、テキスト抽出の自動化を考えるときに留意するべきポイントは次の2点があります。
- 抽出したいテキストの範囲を指定する際の注意点について
- レイアウトが変化するPDFからデータを取り出すときの工夫
テキスト範囲指定の注意点
まず、基本的なことですが、テキスト範囲を指定する際の注意点としては、次の点があります。
- 使うツールの座標系
- フォントのグリフの範囲
- PDFに含まれる文字
次にそれぞれ説明します。
ツールの座標系
まず一点目は、使うツールの座標系です。矩形の座標値が次の図のように「左上(6,8)―右下(10,14)」としてあたえられたとき、その矩形の範囲はどこになるでしょうか。
これは、座標値だけでは決まらず座標系によります。具体的には、原点の位置、x/y軸の方向、長さの単位、ページの回転によります。
図の右と左の例では、長さの単位や、原点位置が違いますので、同じ座標値でも実際の矩形の位置は変わってきます。
さきほどの弊社の製品の例では、PDFビューアーとテキスト抽出コマンドでは、長さの単位と、原点位置が違います。
ビューアーでしらべた座標値を、コマンドの座標系にあわせて、次の図のように変換して、それをコマンドにわたしています。
このように使うツールの座標系に注意する必要があります。
フォントのグリフの範囲
次のフォントのグリフについての注意点です。
こちらの例で「500」の数字を取得したいとしましょう。
黒枠をテキスト範囲として設定します。これで問題ないように思いますが、しかし、実際にはテキストが抽出できません。文字はフォントのグリフで表現されており、グリフの範囲は見かけ上の文字よりも大きい場合があります。□の枠で囲った部分を拡大し、またグリフを赤枠で表示すると次の図のようになります。
この例では、グリフが含まれるように範囲を指定する必要があり、大きな赤枠の範囲を指定するとうまく行きます。このようにグリフを意識して、範囲を指定する必要があります。
PDFに含まれる文字
次に、PDFに含まれる文字についての注意点です。PDFに実際にデータとして入っている文字は、見かけとは異なる場合があります。
上の図で1つ目の例は、見えない空白文字です。この場合空白文字も抽出されるので、余分な文字として除去する必要があります。
また、2つ目の例は、見かけのデータの順序が違う場合です。この例では、見かけ上は「2021年7月21日」とみえますが、実際には年月日のあとに日付の数字が取れてしまいます。見かけだけではなく、PDFに含まれる文字データを意識してテキストの位置を決める必要があります。
テキストの位置が変化するPDFからデータを取り出す
テキストの位置が固定の場合は、抽出したい範囲を指定するだけで、テキストを抽出できます。しかし、実際のデータでは、位置が変わってしまう場合があります。テキストの位置が変化するのは次のようなケースです。
- データの個数が変わる
- 複数ページに跨る
- 出現するページが変わる
- ページ内の位置が変わる
こうしたときは、それぞれの場合に合わせてテキスト抽出の工夫をする必要があります。次に順番に見ていきます。
データの個数が変わる
まず一つ目は、取得したいデータの個数が変わる場合です。
次の例は見積書などの明細部分です。内容によってデータの数が変化します。
このような場合には、データの個数が最大の場合を考えて、すべてのデータが取れるように位置を指定する事で対応できます。
複数ページに跨る
次の例は、データが複数のページに跨る場合です。
拡大すると次の図のようなフォーマットになっています。ここでは、受診日、氏名、支払金額を取りたいとします。
このような場合にも、データが最大の場合を考えて、取得する範囲を指定することで対応できます。ただし、帳票によっては、中間や最終ページでレイアウトが変わる場合があるので、注意が必要です。
出現するページが変わる
次はデータが出現するページが変化する場合です。さきほどの帳票の例で、何名か分のデータが連結されているデータです。
ここで、Bさんのデータを取り出したいとします。開始ページが決まれば、さきほどの要領でBさんのデータが取得できますが、Aさんのデータ内容によってBさんの開始ページが変わってしまいます。
このような場合は、①先頭ページにしかないキーワード、②最終ページにしかないキーワード、③同一データで共通のキーワード、を探して、ページの区切りを判定します。
例では、「受診記録」は最初のページのみ、「氏名:A」は同一データで共通、
「申請書に添付してください」は最終ページのみのデータです。
ページ内の位置が変わる
次は、ページ中のテキスト位置が変わる場合です。
この例では黒い文字の行数が内容によって変わります。氏名と順位を取得したいのですが、赤い枠の固定の位置だと右の場合にはうまくいきません。
このような場合は、文字列検索でキーとなる文字の位置を調べて、そこからの相対位置を指定するとうまくいきます。
例では氏名で縦の位置をしらべて、そこからの相対位置を予め指定しておき、実際のデータでHを決定してテキストを抽出します。
以上で、レイアウトが変化する場合の、テキスト抽出の工夫についてご紹介しました。
文字列処理の活用
最後に、文字列処理の活用についてご紹介します。文字列処理は、不要な文字の除去に役に立ちます。空白文字や、数字のみ残すといった場合です。
値を調べて範囲指定するのは手間がかかります。これに対して上図の右のように大雑把に範囲指定して文字列を大きめに取り出してから、文字列処理によって必要な文字をあとで絞り込むと座標指定の手間を省くことができます。
この方法は指定が簡単になるほか、レイアウトが多少変わっても影響を受けにくい、というメリットもあります。