PDF Tool API活用術その1.BERTを組み合わせた名前墨消し

Please enter alt text.

■概要

今回の活用例では、「PDF Tool API」と「言語処理用の深層学習モデル」を組み合わせることで、AIがコンテキストを判断しながらPDFを自動処理する例をご紹介します。

具体的には、「PDF Tool APIで抽出した文字列から固有表現抽出モデルBERT(※1)を用いて個人名(名前)を判別し、PDFに含まれる名前を見つけ、墨消しする」処理を行います。
これにより、従来の文字列完全一致では難しかった、文脈に応じた柔軟な情報秘匿が可能になります。

また本ケースでは誤検出に備え、中間ファイルとしてjsonファイルを挟んでいます。jsonファイルを修正することで、誤検出した名前の手作業で修正も可能にしています。詳しくは後述の『処理の流れとシステム構成』をご参照ください。

■処理の流れとシステム構成

本サンプルは、PDF Tool APIによる抽出・加工処理と深層学習モデルによる文字列解析を組み合わせて実行します。処理のステップと使用するモデル・ライブラリは以下のものです。

【処理のステップ】

具体的には、以下のステップで処理します。

  1. 文字列抽出:PDFから文字列を抽出しテキスト形式ファイルの形で出力します。
     〔使用インターフェース:PDF Tool API コマンドライン〕
  2. AIによる名前の特定: 日本語固有表現抽出モデル(jurabi/bert-ner-japanese)を用いて、『ステップ1』のテキストファイル内から「人名」に該当するキーワードを特定します。特定した名前をリスト化し、json形式ファイルの形で出力します。
     〔使用インターフェース:Pythonプログラム〕

出力されるjsonファイルの例: 

{
 "names": [
  {
   "name": "山田太郎",
   "page": 0,
   "index": 1
  },
  {
   "name": "田中花子",
   "page": 1,
   "index": 2
  }
 ]
}

3. 『ステップ2』のjsonファイルをもとに、PDF Tool APIを使用して「人名」の文字列検索を行います。その後、ヒットした箇所に墨消し注釈を付けます。
 〔使用インターフェース:Javaプログラム〕

処理フロー図

Please enter alt text.

【処理の中核を担うライブラリ・モデル】

PDF Tool API

  • PDFからの文字列の抽出・墨消し注釈の挿入に使用

jurabi/bert-ner-japanese(※2

  • NLPモデルのBERT(※1)を用いた日本語固有表現抽出モデル。文字列から名前を判別するために使用

■プログラムの(各インターフェース)情報

動作環境

https://www.antenna.co.jp/ptl/spec.html

ライブラリ情報

コマンドラインプログラム

  • バージョン:PDF Tool API V8.0
  • 主要用途:PDFからの文字列の抽出に利用
  • 開発手法・使用ライブラリ:ソースの開発及びライブラリ利用なし
  • コマンドラインプログラムの実行にはPATHへの登録が必要

Python

  • バージョン:Python 3.14.5
  • 主要用途:深層学習モデルを用いた名前抽出処理に使用
  • 開発手法:Viual Studio Codeでコードを入力し、保存。

使用するライブラリ

  • jurabi/bert-ner-japanese
    →抽出した文字列の名前判定に使用するBERTモデル
  • langchain
    →長文を区切り、深層学習モデルが効率的に処理するためのライブラリ
  • その他依存ライブラリ
    上記の実行には以下のインストールが必要。

pip install transformers[torch]
pip install -U langchain langchain-core langchain-community langchain-text-splitters
pip install fugashi
pip install unidic-lite

ライブラリを導入する際、導入先の環境を切り替える「仮想環境(※3)」を利用することもできる。

Java

  • バージョン:openjdk version "17.0.11" 2024-04-16
    本ケースでは[Eclipse Adoptium]が開発した[Eclipse Temurin]を利用。
  • 主要用途:PDF tool APIを用いたPDFの加工に利用。

使用するライブラリ

  • PDF Tool API V8.0(Javaインターフェース)
    →PDF上の文字列抽出・墨消し処理の実行に使用する
  • Jackson
    →Java上でJsonファイルの読み書きをする際に使用する

ライブラリの実装例:上記の実行にはCLASSPATHの設定が必要。
例えば以下の位置に[PDF Tool API V8.0]をデフォルトの設定でインストールし、Jacksonを「C:\lib\」以下のディレクトリに配置した場合は以下のような環境変数の設定が必要です。

CLASSPATH="C:\AHPDFToolLib_80\bin\PdfTkJava80.jar";"C:\lib\jackson-annotations-2.**.jar";"C:\lib\jackson-core-2.21.4.jar";"C:\lib\jackson-databind-2.22.0.jar"

■各種プログラムのソース

サンプルプログラムは以下のzipファイルに同梱されています。

サンプルzip:[RedactNameWithBERTSample.zip]

PDFからの文字列抽出処理

出力文字列からの名前の判別

PDFへの墨消し注釈の挿入

■実行手順・結果

サンプルプログラム及びサンプル実行用PDFを同梱したzipファイルである[RedactNameWithBERTSample.zip] は以下から取得できます。

サンプルzip:[RedactNameWithBERTSample.zip]

〔手順0〕処理対象PDFの準備

墨消しを入れたいPDFを用意する。

今回はzipファイルに付属の、1ページ目に「田中太郎」「山田花子」の記述がある[test.pdf]を例に説明する。

Please enter alt text.

〔手順1〕PDFからの文字列抽出

以下コマンドを実行する。

AHPDFToolCmd80.exe -extractText out.txt -d test.pdf

カレントディレクトリ内の[test.pdf]が読み込まれ、文字を抽出したテキストファイル[out.txt]が出力される。

本例の実行結果:

C:\RedactNameWithBERTSample>AHPDFToolCmd80.exe -extractText out.txt -d test.pdf
use time 0.046000s

[out.txt]の内容:

[page0]
令和7年度 寄附者一覧 アンテナ県ハウス市 広報 令和8年4月1日 令和7年度にハウス市に寄附をしていただいた方の一覧です。 氏名・寄附金額については、公表を承諾いただいた方のみ掲載しております。 氏名 (法人・団体名) 寄 附 金 額 山田 太郎様 20,000 田中 花子様 非公表 匿名希望者 様 55件 合計 57件 1,025,000円

〔手順2〕出力文字列からの名前の判別

以下のPythonプログラムを実行する。

python getNameWithPageAndIndex_bert_langchain.py

同じディレクトリにある[out.txt]を読み込み、
名前を抽出したjsonファイル[extracted_names_with_positions.json]が出力される。

実行前に必要ライブラリをPythonにインストールすること。

本例の実行結果:

C:\RedactNameWithBERTSample>py getNameWithPageAndIndex_bert_langchain.py
Loading weights: 100%|████████████████████████████████████████████████████████████| 199/199 [00:00<00:00, 45901.15it/s]
抽出された名前: [{'name': '山田太郎', 'page': 0, 'index': 1}, {'name': '田中花子', 'page': 0, 'index': 2}]
json output done.

本例で出力した[extracted_names_with_positions.json]の内容

{
 "names": [
  {
   "name": "山田太郎",
   "page": 0,
   "index": 1
  },
  {
   "name": "田中花子",
   "page": 0,
   "index": 2
  }
 ]
}

〔手順3〕jsonファイルを用いたPDFへの墨消し注釈の挿入

以下コマンドでjavaファイルをコンパイルする。

javac pdfTkTest/SearchTextAndRedactFromJSON.java -encoding utf-8

コンパイルが完了したら、以下コマンドで実行する。

java pdfTkTest.SearchTextAndRedactFromJSON test.pdf output_redact.pdf 0

jsonファイルに記載された「名前」でPDF内を文字検索し、墨消し注釈を挿入したPDF[output_redact.pdf]が出力される。

本例の実行結果:

C:\RedactNameWithBERTSample>javac pdfTkTest/SearchTextAndRedactFromJSON.java -encoding utf-8
C:\RedactNameWithBERTSample>java pdfTkTest.SearchTextAndRedactFromJSON test.pdf output_redact.pdf 0
ドキュメント全体から検索します。
検索キーワードを追加:山田太郎
検索キーワードを追加:田中花子
2件のキーワードにRedact注釈を設定しました。
-- 完了 --

出力された[output_redact.pdf]:
赤色を黄色い枠で囲った矩形が挿入された墨消し注釈

Please enter alt text.

〔※付録〕用語解説

(※1)BERT:

Bidirectional Encoder Representations from Transformers の略。Googleが2018年に発表した自然言語処理モデルの形態。学習させたモデルを別の文章を解釈するためにも利用できることが特徴。

(※2)jurabi/bert-ner-japanese:

jurabi社が学習させた日本語用BERT(※1)モデル。東北大学乾研究室の日本語BERTモデルをファインチューニングして作られている。

(※3)Pythonの仮想環境

仮想環境とは、導入ライブラリなどの環境を分離し、仮想化したもの。Pythonでは、仮想環境を用いることで用途に応じて専用の実行環境を作成し、切り替えて使用することができる。

例えば、以下のコマンドで直下ディレクトリに仮想環境[.venv]を作成できる。

python -m venv .venv

作成した仮想環境[.venv]に切り替える場合は、例えばWindowsコマンドラインの場合、以下のコマンドを実行する。

.venv\Scripts\activate.bat

Windows Powershellの場合など、それ以外の詳細は下記を参考にすること。

参考:仮想環境 [Python環境構築ガイド - Python.jp]
https://www.python.jp/install/windows/venv.html