iText ライブラリを使用して PDF ドキュメントからテキストを読み込んでいます。ただし、一部の PDF ドキュメントには、テキストに加えて画像が埋め込まれている場合があります。
PDFドキュメントに画像が含まれているかどうかを判断するために、iTextなどを使用する方法があるかどうか疑問に思っていますか?
iText ライブラリを使用して PDF ドキュメントからテキストを読み込んでいます。ただし、一部の PDF ドキュメントには、テキストに加えて画像が埋め込まれている場合があります。
PDFドキュメントに画像が含まれているかどうかを判断するために、iTextなどを使用する方法があるかどうか疑問に思っていますか?
PDF ライブラリを使用して、正確で 100% 信頼できるチェックを行うことができます。
ただし、PDF をテキストとして読み取り、そのように処理するだけで、おそらくかなり信頼性の高いチェックを行うことができます。まず、最初に PDF ヘッダーを探して、それが PDF であることを確認する必要があります。
%PDF...
次に、フレーズを探してスキャンします。
/XObject
このタグをヒットすると、ストリーム内を前後に移動して << および >> 辞書境界までチェックし、完全な XObject 辞書を引き出す必要があります。<< と >> がネストされている可能性があるため、'obj' に戻ってチェックし、'stream' エントリに転送することをお勧めします。とにかく、あなたはこのように見えるものになってしまうでしょう。
<<
/Type /XObject /Subtype /Image /Name /I1
/Width 800 /Height 128
/BitsPerComponent 1 /ImageMask true
/Filter [/FlateDecode]
/Length 2302 >>
ここで確認する必要があるのは、この /Subtype エントリと /Image が空白で区切られていることです。そこを打てばイメージが湧きます。
では、このアプローチの限界は何でしょうか?
ドキュメントに画像を埋め込むことはできますが、使用することはできません。その結果、偽陽性が発生します。これはかなり可能性が低いと思いますが。そうするのは非常に非効率的であり、本当に卑劣なプロデューサーだけがそれを行うでしょう.
上記の Hugo が述べたように、画像はページ コンテンツ ストリームに埋め込むことができます。それは偽陰性になります。ただし、これらはかなりまれです。これは、決して良いアイデアではなく、広く使用されていない仕様のビットの 1 つです。単一のプロデューサーからのドキュメントがある場合 (よくあることですが)、これを行うかどうかはすぐに明らかになります。しかし、それはかなり珍しいことだと思います。推測では、野生の PDF の 1% 以上にこの構造が含まれているとは想像できません。
これらの XObject タグは、直接オブジェクトではなく参照として埋め込むことができます。しかし、私はあなたがそれを完全に割り引くことができると思います. 合法ですが、それは絶対に奇妙です。私はあなたがそれを見ることはないと思います。
正しい方法では、PDF 内のすべてのコンテンツ ストリームをスキャンして解析します。これは、私が取り組んでいる ABCpdf で行っていることですが、より多くの作業とより多くの処理能力が必要です。大きなドキュメントでは数秒かかる場合があります。
99% の信頼性で十分かどうかを考えてみてください。:-)
PDF の画像は、FormXObjects または BI-EI コマンドを使用してコンテンツに埋め込まれた画像のいずれかです。そのため、ページの Resources 辞書を解析し、その Xobjects を再帰的に調べて、画像も含まれているかどうかを確認する必要があります (同じ Resources 辞書)。また、すべてのコンテンツ ストリームを解析し、埋め込み画像が存在するかどうかを確認する必要があります。追加の画像はパターンで定義できます->独自の画像存在チェッカーを実装する場合は、これが方法です。最初に仕様を読み、時間の費用を見積もってください。最終的には、3d パーティのライブラリはそれほど高価ではないかもしれません。