Google Cloud Vision APIを使ってPDFからテキスト検出

本投稿は TECOTEC Advent Calendar 2021 の24日目の記事です。

はじめに

こんにちは、決済認証システム開発事業部の鍛治と申します。
現在プロジェクトでGoogleVisionAPIを使った光学文字検出機能(OCR)の開発に携わっています。 VisionAPIとはGoogleの提供する機械学習モデルを用いて画像から顔検出やテキスト情報を取得できる機能です 。
本記事ではPDFからのテキスト検出をPHPでやってみたのでご紹介します。

概要

以下のような名刺のPDFファイル内のテキストを読み取ってJSON形式で出力させてみるところまでをやってみます。
実行環境はLaravelを想定しています。

test.png

パッケージインストール

GCSおよびVsionAPIに必要なパッケージをインストールしておきます。
composer require google/cloud-storage
composer require google/cloud-vision

出力先の指定

PDFファイルを検出する場合は対象のファイルをGoogle Cloud Storage(GCS)バケット上に配置しておく必要があります。 検出結果のJSONファイルもGCSに配置されるため配置先をそれぞれ指定します。

        //PDF配置先
        $path = 'gs://ocr_test/pdf/test.pdf';
        //解析結果JSONファイル配置先
        $output = 'gs://ocr_test/json/';

リクエストデータ用意

出力先や読み取り対象のファイル形式などをリクエストに渡します。 PDFの検出をする際はasyncBatchAnnotateFilesメソッドを使用します。 一度に処理するファイル数や対象のファイルのページ数が少ない場合はBatchAnnotateFilesで代用することも可能です。

        //OCR実行
        $feature = new Feature();
        $feature = $feature->settype(Type::DOCUMENT_TEXT_DETECTION);

        $gcsSource = new GcsSource();
        $gcsSource = $gcsSource->setUri($path);

        $mimeType = 'application/pdf';
        $inputConfig = (new InputConfig())
            ->setGcsSource($gcsSource)
            ->setMimeType($mimeType);

        $gcsDestination = (new GcsDestination())
            ->setUri($output);

        $batchSize = 1;
        $outputConfig = (new OutputConfig())
            ->setGcsDestination($gcsDestination)
            ->setBatchSize($batchSize);

        $request = (new AsyncAnnotateFileRequest())
            ->setFeatures([$feature])
            ->setInputConfig($inputConfig)
            ->setOutputConfig($outputConfig);
        $requests = [$request];

        $imageAnnotator = new ImageAnnotatorClient();
        $operation = $imageAnnotator->asyncBatchAnnotateFiles($requests);
        $operation->pollUntilComplete();

解析結果の処理

GCS上のJSONをプログラム上で扱う場合には下記の要領で取得を行います。 secondBatch以降を繰り返すことで一度に複数ファイルを処理することも可能です。

        //解析結果取得
        preg_match('/^gs:\/\/([a-zA-Z0-9\._\-]+)\/?(\S+)?$/', $output, $match);
        $bucketName = $match[1];
        $prefix = isset($match[2]) ? $match[2] : '';

        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
        $options = ['prefix' => $prefix];
        $objects = $bucket->objects($options);

        $objects->next();
        $firstObject = $objects->current();

        $jsonString = $firstObject->downloadAsString();
        $firstBatch = new AnnotateFileResponse();
        $firstBatch->mergeFromJsonString($jsonString);

検出結果の確認

出力されたJSONを確認してみます。

てこ タロウ
Teko Tarou
テコテック株式会社
決済認証システム開発事業部
東京都港区青山
1-2-3
03-1234-5678
Test.mail@ecotec.co.kp

今回のPDFは機械文字しか含まれていなかったため完璧に読み取ることができました。 手書き文字やスキャンなどで文字がかすれている場合はうまく読み取れない場合もあるようです。 また、名刺にデザインが入っていたりする場合は図形が文字として認識されてしまう場合もありました。

おわりに

VisionAPIのテキスト検出は今回のような名刺管理や請求書の処理などで活躍する技術です。 出力されたJSONには画像上の座標も含まれているため、そちらも利用することで取得したテキストにラベル付けをすることも可能です。
GoogleVisionAPIは無料で90日間のトライアルを利用できるのでぜひこの機会にお試しあれ!

www.tecotec.co.jp