5

ABCpdf を使用して、特に Doc.GetText("Text") を呼び出して、一部の PDF ファイルのテキスト コンテンツを抽出しています。(ページごとに 1 回、ループで呼び出します。) これは通常はうまく機能しますが、一部の PDF ファイルでは、結果のテキストが空白文字のないテキストで構成されます。

この文には単語間にスペースがありません。

興味深いのは、Apache Tika (内部では PDFBox を使用) を使用してまったく同じ PDF からテキストを抽出しようとすると、単語間に予想されるすべてのスペースが表示される傾向があることです。つまり、上記の文は Tika によって次のようにレンダリングされます。

この文には単語間にスペースがありません。

全体として、2 つのツールは異なる間違いを犯すことを恐れているように振る舞います。スペースが属している場所にスペースを挿入するのに失敗することがあります。

この点で、ABCpdf を Tika のように動作させる設定はありますか?

4

2 に答える 2

4

簡単な回答:と要素Doc.GetText("SVG")の XML を解析し、実際のスペースとして扱われるべきレイアウト スペースがあるかどうかを判断することで、テキストの個々のトークンを取得できます。PDFBox から見られる動作は、おそらくその仮定をしようとする試みです。また、Adobe Acrobat でさえ、PDFBox が行うように、クリップボードを介して空白のテキストを返すことができます。TEXTTSPAN

長い回答:これは、PDF 内のテキストの本来の意図ではない可能性があるため、より多くの問題を引き起こす可能性があります。

ABCpdf はここで正しいことを行っています。PDF 仕様は、出力メディアのどこに配置する必要があるかのみを記述しているためです。元の文がほとんど同じように見えても、ABCpdf が両方のスタイルで解釈する PDF ファイルを作成できます。

これを示すために、サンプル文の両方のケースに一致するテキスト レイアウトを示す Adob​​e InDesign のドキュメントのスナップショットを次に示します。

レイアウト スペースとテキスト スペースを使用して特別に作成された PDF の Adob​​e InDesign のスナップショット

最初の行は実際のスペースで構成されていないことに注意してください。代わりに、単語は個々のテキスト領域に手作業で配置され、ほぼ適切な間隔の文のように並べられています。2 番目の行には、1 つのテキスト領域内に単語間に実際のテキスト スペースがある 1 つの文があります。

PDF にエクスポートしてから ABCpdf で読み込むとDoc.GetText("TEXT")、次のものが返されます。

ThisSentenceDoesn'tHaveAnySpacesBetweenWords.  
This Sentence Doesn't Have Any Spaces Between Words.

したがって、レイアウト スペースを検出する場合は、SVG 出力を使用して、テキストのトークンを手動で処理する必要があります。Doc.GetText("SVG")は、ABCpdf がページ上で見たテキストやその他の描画エンティティを返します。また、レイアウト ベースの間隔の場合の処理​​方法を決定できます。

次のような出力が表示されます。

<?xml version="1.0" standalone="no"?>
<svg width="612" height="792" x="0" y="0" version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<text xml:space="preserve" x="36" y="46.1924" font-size="14" font-family="ArialMT" textLength="26.446" transform="translate(36, 46.1924) translate(-36, -46.1924)">This</text>
<text xml:space="preserve" x="66.002" y="46.1924" font-size="14" font-family="ArialMT" textLength="59.15" transform="translate(66.002, 46.1924) translate(-66.002, -46.1924)">Sentence</text>
<text xml:space="preserve" x="129.604" y="46.1924" font-size="14" font-family="ArialMT" textLength="47.46" transform="translate(129.604, 46.1924) translate(-129.604, -46.1924)">Doesn&#8217;t</text>
<text xml:space="preserve" x="181.208" y="46.1924" font-size="14" font-family="ArialMT" textLength="32.676" transform="translate(181.208, 46.1924) translate(-181.208, -46.1924)">Have</text>
<text xml:space="preserve" x="219.61" y="46.1924" font-size="14" font-family="ArialMT" textLength="24.122" transform="translate(219.61, 46.1924) translate(-219.61, -46.1924)">Any</text>
<text xml:space="preserve" x="249.612" y="46.1924" font-size="14" font-family="ArialMT" textLength="46.69" transform="translate(249.612, 46.1924) translate(-249.612, -46.1924)">Spaces</text>
<text xml:space="preserve" x="301.216" y="46.1924" font-size="14" font-family="ArialMT" textLength="54.474" transform="translate(301.216, 46.1924) translate(-301.216, -46.1924)">Between</text>
<text xml:space="preserve" x="360.016" y="46.1924" font-size="14" font-family="ArialMT" transform="translate(360.016, 46.1924) translate(-360.016, -46.1924)"><tspan textLength="13.216">W</tspan><tspan dx="-0.252" textLength="31.122">ords.</tspan></text>
<text xml:space="preserve" x="36.014" y="141.9944" font-size="14" font-family="ArialMT" transform="translate(36.014, 141.9944) translate(-36.014, -141.9944)">
<tspan textLength="181.3">This Sentence Doesn&#8217;t Have </tspan><tspan dx="-0.756" textLength="150.178">Any Spaces Between W</tspan><tspan dx="-0.252" textLength="31.122">ords.</tspan></text>
</svg>

また、基本的な構造から、問題を引き起こした元の意図が明らかになることに注意してください。(xml:space と属性を削除、例のために空白を変更)

<?xml version="1.0" standalone="no"?>
<svg>
  <text>This</text>
  <text>Sentence</text>
  <text>Doesn&#8217;t</text>
  <text>Have</text>
  <text>Any</text>
  <text>Spaces</text>
  <text>Between</text>
  <text><tspan>W</tspan><tspan>ords.</tspan></text>
  <text>
    <tspan>This Sentence Doesn&#8217;t Have </tspan>
    <tspan>Any Spaces Between W</tspan>
    <tspan>ords.</tspan>
  </text>
</svg>
于 2011-11-03T23:43:19.763 に答える
0

この質問と回答は、ABCpdf の古いリリースに基づいています。

ABCpdf バージョン 9 では、これがすべて自動的に行われます。

私は ABCpdf .NET ソフトウェア コンポーネントに取り組んでいるので、返信には ABCpdf に基づく概念が含まれている可能性があります。それは私が知っていることです。:-)

于 2013-06-03T11:15:55.287 に答える