PDFファイルはビジネスにおいて多用されるファイル形式であり、避けては通れません。その背景として、①OSやプラットフォームに依らず閲覧しやすい、②複数のファイル形式(Excel, Word, PowerPoint等)をひとつにパッケージできる、という特徴があるからでしょう。特にB to B企業間のデータ交換方式としてPDFが多用されているように感じます。あるPDFを作成した企業(人)にとって、そのPDFはデータ処理の「終着点」かつ成果物ですが、受け取る側としてはデータ処理の「出発点」であり、この辺りのギャップがPDFデータ処理における根深い課題のように感じています。
PDFのような非構造化データのパース処理は一般的にとてもチャレンジングなタスクです。構造化データの場合は方眼紙のように列名と行番号でデータを特定できますが、非構造化データは白紙の自由帳であり、データの特定は幾何学的な位置情報に頼らざるをえません。
Alteryx DesignerでPDFを入力したいと考えたときに、まずIntelligence SuiteのAdd-onツールの利用を検討するかと思います。こちらのブログ(英語)に、その活用例が紹介されています。
一方、Pythonツールを利用することでもPDFデータを読み込むことが可能であり、選択肢として知っておいて損はありません。本ブログではIntelligence Suiteを使わずに、Pythonツールとpdfminer.sixライブラリーを利用したPDFパース手法を紹介します。
pdfminer.sixのライブラリーの詳細な説明は割愛しますが、重要な点は、このライブラリーを利用すると、PDF内のテキストデータに加え、その座標情報も取得できるということです。ただし、pfeminer.sixにはOCRの機能はないため、入力するPDFはReadableなテキストである必要があります。この点ご留意ください。
例えば以下のような履歴書のPDFを読み込んでみます。
Pythonツール内でpdfminer.sixライブラリーを利用して、各テキストの属性情報をいくつか抜き出してみたのが下図です。PDF内のテキストは矩形のオブジェクトとして認識されており、その矩形の4つの頂点の(X, Y)座標を取得し X0, X1, Y0, Y1 としています。Angleはテキストの角度を表しています。0°であれば横書き、90°/-90°であれば縦書きとなります。座標情報はPDFパースにおいて非常に重要な情報です。例えば、X0(Y0)の値が同じテキストは、縦(横)に整列しているとみなし、表形式を再現するのに利用できるかもしれません。
ここからは応用例です。先述の通りテキストデータは取得できましたが、どのレコードに欲しいデータがあるのか判別できません。これを空間オブジェクトを利用して、抜き出してみたいと思います。この手法は、こちらのブログ(英語)で紹介されているImage Templateツールと似たような発想になります。つまり、予めテンプレートのPDFに、抜き出したいデータのある個所をマークアップしておき、そのテンプレートと照合する形でデータを抜き出します。
まずは抜き出したいデータのある個所をマークアップしたテンプレートを作成します。同じ様式のページがひとつのPDFファイル内で繰り返し存在する想定として、1ページ目をテンプレートに利用します:
PDF内では、もともとPDFに入っているテキストオブジェクトと、先のステップで追加したような注釈オブジェクトは、異なる種類のオブジェクトとして認識されます。これらのオブジェクトを取得し、テキストと座標を取得する一連の処理をマクロ化してみました。下図のマクロの出力アンカーから
Tアンカー:テキストオブジェクト ➡取り出したいデータ と 矩形の空間オブジェクト
Aアンカー:注釈オブジェクト ➡テンプレートの注釈データ と 矩形の空間オブジェクト
が出てきます。
続いて、TアンカーとAアンカーの空間オブジェクトをSpatial Matchで照合させます。こうすることで、テンプレート側の注釈オブジェクトの範囲内に存在するテキストデータのみを抜き出すことが可能になります。下図の左側の設定画面を見ると、その包含関係が視覚的にも分かります。
この後の処理は目的によりますが、例えばページでグループ化し、クロスタブをするとこのような形に変換されます
先ほど紹介したWFをyxzpで共有しますので、興味ある方は一度動作させてみてください。WF内で利用しているマクロ'Spatial PDF.yxmc'を利用するにあたり注意事項です。このマクロをお使いのコンピュータで初めて実行する際は、Pythonライブラリーをインストールする必要があります。以下手順に従ってください:
①Alteryx Designerを管理者権限で起動する。アイコン右クリック➡管理者として実行
②yxzpを展開しWFを開く。Spatial PDFの設定画面で 'Library' Install Mode' を選び、WFを実行。
実行後にエラーが出なければライブラリーのインストールは成功
エラーが出た場合、以下を確認
・Pythonのライブラリーインストールのコマンド pip がネットワークではじかれていないか?オフィスからだとProxyでブロックされていることがあるので、IT管理者に問い合わせる。
・Alteryx Designerが管理者権限で起動しているか?
本ブログでは、Pythonツールと空間ツールを利用したPDFデータのパースについてご紹介しました。毎回決まったところに存在するデータを抜き出す場合に有効な手法となります。また、空間オブジェクトを使わずとも、座標情報を利用することで表を再現するなど、他にも応用がきくと思います。
PDFパースは一般的な最適解がないタスクです。Intelligence Suite等の機能も併せて、何がベストプラクティスとなりうるのか、幅広くご検討いただければと思います。
本ブログで共有しているWFについての申し送り事項です
・2022.3と2024.1にて動作確認済みです
・技術紹介目的で作成したWFであり、必ずしも動作を保証するものではありませんので、利用・不具合修正等は自己責任で実施ください
・エラー/不具合等の問い合わせ対応はいたしかねますのでご了承ください
ここにコメントを追加するには、ご登録いただく必要があります。 ご登録済みの場合は、ログインしてください。 ご登録がまだの場合は、ご登録後にログインしてください。