0

私のC#コードでは、pdfからテキストを抽出しています.2つの方法があります。ただし、1 つの方法は 1 つのタイプの PDF ドキュメントで機能し、もう 1 つの方法は別のタイプの PDF ドキュメントで機能します。

方法 1 が失敗すると、テキストは取得されますが、空白はありません。方法 2 が失敗すると、\r\n のみが取得されます。

方法 1 ( http://www.codeproject.com/Articles/14170/Extract-Text-from-PDF-in-C-100-NETのクラス)

PDFParser pdf_parser = new PDFParser();
currentText = pdf_parser.ExtractTextFromPDFBytes(pdfReader.GetPageContent(page)) + " ";

方法 2

StringWriter output = new StringWriter();
for (int i = 1; i <= reader.NumberOfPages; i++)
    output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));
currentText = output.ToString();

常に機能するように両方の機能を組み合わせる方法はありますか?

4

1 に答える 1

4

方法 1について: その codeproject 記事の PdfParser は、特別な状況でのみ機能します。

これは、すべてのテキスト コンテンツが直接のページ コンテンツ ストリームに含まれていることを前提としています。実際、これらのストリームには、それ自体がテキストを含むリソースへの参照が含まれる場合があります。これは特に n-up ドキュメントの場合によく見られますが、どのドキュメントでも発生する可能性があります。

さらに、いくつかの Latin1 のような文字エンコーディングを想定しています。これは、ヨーロッパ言語のテキストの場合によくあることですが (ごくまれに!)、多くのアジア言語の場合、これが意味のある結果になることはめったにありません。

さらに、すべてのカーニング ギャップをスペース文字として解釈します。

方法2について:以前の質問へのコメントで述べたように、PDFからテキストを抽出して文字をデコードする方法は?同様の問題に対するこの回答を見たいと思うかもしれません。

基本的に、このような空白文字が欠落している理由は、レンダリングされた PDF に表示される空白が、PDF のページ コンテンツ記述の空白文字に必ずしも対応していないためです。代わりに、1 つの単語をレンダリングした後、次の単語をレンダリングする前に現在の位置をわずかに右に移動する操作が PDF でよく見られます。

残念ながら、隣接するグリフの外観を向上させるためにも同じメカニズムが使用されます。一部の文字の組み合わせでは、外観と読みやすさを向上させるために、デフォルトよりもグリフを互いに近づけたり、離したりして印刷する必要があります。これは、上記と同じ操作を使用して PDF で行われます。

したがって、そのような状況の PDF パーサーは、ヒューリスティックを使用して、そのようなシフトがスペース文字を暗示するためのものなのか、それとも単に文字グループの見栄えを良くするためのものなのかを判断する必要があります。また、ヒューリスティックは失敗する可能性があります。

参照されている回答は、これらのヒューリスティックを微調整する方法を示しており、それに応じて質問の元の投稿者は、PDF を正常に解析するための適切な解決策を見つけました。

問題の最終的な解決策が必要な場合は、その問題を観察したサンプル PDF を提供することをお勧めします。

于 2012-12-21T00:17:17.110 に答える