(私は主に、.NetライブラリiTextSharpではなくJavaライブラリiTextを使用しています。したがって、ここでは一部のJavaイズムを無視してください。すべて、簡単に翻訳できるはずです。)
iText(Sharp)を使用してページのコンテンツを抽出するには、パーサーパッケージのクラスを使用して、前処理を行った後RenderListener
、選択したページにフィードします。
テキストのみに関心があるコンテキストでは、最も一般的には、ページから集約されたテキストを取得するための単一のメソッドTextExtractionStrategy
から派生し、追加するaを使用します。RenderListener
getResultantText
iTextでのテキスト解析の当初の目的はこのユースケースを実装することであったため、既存のRenderListener
サンプルのほとんどはTextExtractionStrategy
実装であり、テキストのみを使用可能にします。
したがって、あなたはRenderListener
すでにあなたがキリスト教徒にしたように見えるあなた自身のものを実行しなければならないでしょうTextWithPositionExtractionStategy
。
SimpleTextExtractionStrategy
(ページコンテンツ演算子の構造に関するいくつかの仮定で実装されている)とLocationTextExtractionStrategy
(同じ仮定ではないがやや複雑な)の両方があるのと同じように、いくつかを作成する実装から始めたいと思うかもしれません仮定。
したがって、の場合と同様に、SimpleTextExtractionStrategy
最初の単純な実装では、リスナーに転送されたテキストレンダリングイベントが1行ずつ、同じ行に左から右に到着することを期待しています。このようにして、水平方向のギャップまたは点を見つけるとすぐに、現在の単語が終了したことがわかり、それを処理できます。
テキスト抽出戦略とは対照的に、結果を収集するためにメンバーは必要ありませんが、StringBuffer
代わりに「位置のある単語」構造のリストが必要です。TextRenderInfo
さらに、このページですでに収集したが最終的に処理できなかったイベントを保持するために、いくつかのメンバー変数が必要です(いくつかの個別のイベントで単語を取得できます)。
あなた(つまりあなたのrenderText
メソッド)が新しいTextRenderInfo
オブジェクトを求められたらすぐに、次のように操作する必要があります(擬似コード):
if (unprocessedTextRenderInfos not empty)
{
if (isNewLine // Check this like the simple text extraction strategy checks for hardReturn
|| isGapFromPrevious) // Check this like the simple text extraction strategy checks whether to insert a space
{
process(unprocessedTextRenderInfos);
unprocessedTextRenderInfos.clear();
}
}
split new TextRenderInfo using its getCharacterRenderInfos() method;
while (characterRenderInfos contain word end)
{
add characterRenderInfos up to excluding the white space/punctuation to unprocessedTextRenderInfos;
process(unprocessedTextRenderInfos);
unprocessedTextRenderInfos.clear();
remove used render infos from characterRenderInfos;
}
add remaining characterRenderInfos to unprocessedTextRenderInfos;
で、process(unprocessedTextRenderInfos)
unprocessedTextRenderInfosから必要な情報を抽出します。個々のテキストコンテンツを単語に連結し、必要な座標を取得します。開始座標が必要な場合は、未処理のTextRenderInfoの最初の座標から取得します。さらにデータが必要な場合は、他のTextRenderInfoのデータも使用します。これらのデータを使用して、「単語と位置」構造を入力し、結果リストに追加します。
ページ処理が終了したら、もう一度process(unprocessedTextRenderInfos)とunprocessedTextRenderInfos.clear()を呼び出す必要があります。または、メソッドでそれを行うこともできますendTextBlock
。
これを行うと、ページのコンテンツ構造に関して同じ仮定を持たない、もう少し複雑なバリアントを実装する準備ができていると感じるかもしれません。;)