1. 導入
PDFの表データを高精度にExcel化するツールの安定稼働に成功した当プロジェクトですが、現場の実務を想定すると新たなニーズが浮かび上がってきました。「手元にある紙の領収書や日報を、わざわざスキャナーでPDF化するのは手間だ。スマホで撮影した写真をそのままアップロードしたい」という要望です。今回は、システムの入力口を拡張し、画像ファイル(JPG/PNG)を直接AIに解析させるためのアップデートと、それに伴うセキュリティ強化の実装について解説します。
2. Vision APIの真の力とプロセス最適化
もともと、私たちが利用しているAnthropicの「Vision API」は、その名の通り「画像」を読み取って解釈することに特化したAIです。これまでのシステムでは、アップロードされたPDFを pypdfium2 というライブラリを用いて、バックグラウンドでわざわざ「1ページずつ画像(PNG)に変換」してからAIに渡していました。
つまり、最初から画像(JPG/PNG)がアップロードされれば、システムとしては「PDFから画像への変換」という重い処理を丸ごとスキップできるのです。これはユーザーの手間を減らすだけでなく、サーバーの処理負荷軽減とレスポンス速度の向上という、一石二鳥のアーキテクチャ最適化を意味します。
3. フロントエンド改修と「マジックバイト」による堅牢なファイル判定
実装にあたり、システムの表と裏の両面に手を加えました。
まずフロントエンド(HTML/JS)では、アップロードフォーム()の accept 属性に .jpg, .jpeg, .png を追加し、ユーザーインターフェース上の案内テキストを「PDFまたは画像」へと変更しました。
次にバックエンド(Python)では、送られてきたファイルが「PDF」なのか「画像」なのかを正確に分岐させる処理を追加しました。ここで重要になるのがセキュリティです。悪意のあるユーザーが、危険な実行ファイルの拡張子だけを「.jpg」に偽装してアップロードしてくる可能性(ディレクトリトラバーサルなどのリスク)があります。 そのため、単なるブラウザからの申告(MIMEタイプや拡張子)を鵜呑みにせず、ファイルの先頭にある「マジックバイト(ファイルの実際のデータ構造を示す署名)」を直接読み取り、本物のPDF・JPG・PNGであるかを判定する仕組みを導入しました。本物の画像と判定された場合のみ、バイナリデータをそのままBase64エンコードし、Vision APIへと直行させます。
4. まとめ
今回のアップデートにより、PCからのPDFアップロードだけでなく、スマートフォンのブラウザからカメラを直接起動し、撮影したレシートや帳票を一発でExcel化するという強力なモビリティを獲得しました。また、マジックバイトによるファイル検証を導入したことで、システムの利便性を高めつつ、情報漏洩やサーバー攻撃に対する堅牢性(セキュリティ)も同時に向上させることができました。
【編集後記】 業務システムにおいて「入力の手間を1ステップ減らす」ことは、利用者の定着率に直結します。いくら裏側で高度なAIが動いていても、利用するまでに「スキャンする」「PCに転送する」という手間があれば、現場のツールとしては失格です。スマホという誰もが持つデバイスのカメラを、最強のデータ入力インターフェースに変えられたことは、DX推進において大きな前進でした。残る課題は「複数ページにまたがる写真データ」の扱いです。