1

前もって感謝します。

背景:

PDFドキュメントの特定のセクションからデータを抽出するコンソールアプリケーションに取り組んでいます。これを行うには、最初にその pdf を操作する文字列に変換する必要があります。これを行うために、私は iTextSharp に目を向けました。PDFはページごとに2列でレイアウトされているので、SimpleTextExtractionStratgey()を使用しています(iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();を試しましたが、ページレイアウトには効果がありませんでした)。

テキストに変換されるコンテンツの説明:

私が問題を抱えていると思われるページには、ページの横に「ヘッダー」が掲載されています。ヘッダーのあるページは、ドキュメント全体に断続的に散らばっています。

ページ レイアウトのイメージ: http://postimg.org/image/b7i25v0g1/

問題:

ページの列を調べ終わると、そのサイド ヘッダーに移動するようです。次に、サイド ヘッダーのある次のページにジャンプし、それをテキストに変換してから、最初のヘッダーが検出されたページの上部から再開します。

次のようなテキストになります。

ページ 1 コンテンツ

最初のヘッダー

2 番目のヘッダー

ページ 1 コンテンツ

ページ 2 コンテンツ

これがpdfです:http://www.filedropper.com/dd35-completeadventurer

私は iTextSharp と結婚していません。この形式のドキュメントをテキストに変換する信頼できる方法が必要なだけです。回避策または代替方法をいただければ幸いです。

    static public string ToTxt(string @filePath)
    {
        string strText = string.Empty;
        try
        {
            PdfReader reader = new PdfReader(filePath);

            for (int page = 1; page <= reader.NumberOfPages; page++)
            {

                Widgets.ProgressBar(page);

                //Convert PDF to Text
                ITextExtractionStrategy its = new SimpleTextExtractionStrategy(); //iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
                String s = PdfTextExtractor.GetTextFromPage(reader, page, its);
                strText = strText + s;
            }
            reader.Close();
            Console.WriteLine("File Extracted");
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception: " + e.Message);
        }
        finally
        {
            Console.Clear();
        }
        return strText;
     }
4

2 に答える 2

1

コメントで既に推測されているように、重複したテキストは既に PDF コンテンツに存在しています!

詳細

ドキュメント内で向かい合っているページのペアのページ コンテンツは、見開き全体のコンテンツであるたびに同じであることが多く、個々のページには それぞれ左半分または右半分のみが表示されます。

たとえば、2 つのページ 6 と 7 を考えてみましょう。それらの内容は同じです。

6ページと7ページの見開き

同一のMediaBoxの領域を埋めます。CropBox (およびArtBoxBleedBox、およびTrimBox ) をそれぞれ左半分または右半分に設定するだけで、期待されるコンテンツのみが 6 ページに表示されます。

6ページ

そして7ページ:

7ページ

iText(Sharp) パーサー フレームワークも、SimpleTextExtractionStrategyこれらのボックスに自動的に制限することもありません。コンテンツ内の任意の場所に描画されたすべてのテキストを抽出します。したがって、重複したテキスト。

抽出結果の重複テキストの防止

テキストの重複の原因がわかれば、それを防ぐ方法は複数あります。

  1. 他のすべての PDF ページのコンテンツのみを抽出してみることができます。残念ながら、上記はすべてのページに当てはまるわけではありません。少なくとも最初のページ (タイトル ページ、コンテンツなど) は、上記で説明したスキームを使用して作成されていません。さらに、本には、スキームに従っていないアートワーク ページもいくつかあります。 . したがって、このオプションでは、例外的なページのかなりの管理が必要になります。

  2. 各ページのコンテンツを抽出できますが、以前に処理されたページのコンテンツをいくつかの変数に保持できます。前のページのコンテンツと等しくない場合にのみ、新しく抽出されたコンテンツを結果に追加します。

  3. iText(Sharp) パーサー フィルターを使用できます。ストラテジーによって処理されるテキスト チャンクを、現在のページのクロップ ボックス内に描画されたもののみに制限すると、ページ外のコンテンツによるテキストの重複を防ぐことができます。地域によるフィルタリングの例は、ExtractPageContentArea.java / ExtractPageContentArea.cs にあります。

于 2015-07-28T08:55:20.327 に答える