2011-10-19 10 views
5

私はABCpdfを使用して、特にDoc.GetText( "Text")を呼び出すことによって、いくつかのPDFファイルのテキストコンテンツを抽出しています。 (これは、ページごとに1回、ループで呼び出されます)。通常はうまくいきますが、一部のPDFファイルでは、結果のテキストは空白文字のないテキスト(例:PDFをテキストに変換するときに、ABCpdfが複数の単語を同時にマッシュすることを防ぐことはできますか(例:mashingwordstogether)?

これは、単語間のスペースを除いています。

私は、Apacheティカ(PDFBoxでボンネットの下に電力を供給)を使用して、まったく同じPDFファイルからテキストを抽出しようとした場合にどのような興味深いのは、私は言葉の間期待するすべてのスペースを取得する傾向がされています。つまり、上記の文章は、Tikaによって

となります。この文には単語間にスペースは含まれません。

全体的に、彼らは別のミスを犯すのを恐れているような2つのツールが行動 - 世界で最悪のもののようなABCpdfの行為は1つが属していないスペースを挿入することであろう、ティカは、のような役割を果たしながら、世界で最悪のことは、人が所属する場所を挿入することに失敗することです。

この点について、ABCpdfをTikaのように機能させるための設定はありますか?

答えて

4

短い答え:あなたがTEXTTSPAN要素のためのXMLを解析し、実際のスペースとして扱われるべきレイアウトの間隔があるかどうかを判断する、Doc.GetText("SVG")を経由して、テキストの個々のトークンを取得することができます。あなたがPDFBoxから見ている動作は、おそらくその前提を作ることです。また、Adobe AcrobatでもPDFBoxのように間隔の取れたテキストをクリップボード経由で返すことができます。

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

ここでは、PDF仕様では出力媒体に配置する場所を記述しているため、ABCpdfは正しいことを行っています。 ABCpdfが両方のスタイルで解釈するPDFファイルを作成することはできますが、オリジナルの文章はほとんど同じです。

これを実証するために、Adobe InDesignのドキュメントのスナップショットを示します。これは、サンプル文の両方の場合に一致するテキストレイアウトを示しています。

Snapshot From Adobe InDesign of a Specially Constructed PDF with Layout Spaces versus Text Spaces

最初の行は、実際のスペースで構成されていないことを注意、代わりに、単語は、個々のテキスト領域内に手で置かれ、約適切に離間文に見えるように並んました。 2番目の行には、単一のテキスト領域内の単語間に実際のテキストスペースを持つ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:例のためのスペースと属性削除、空白の変更)

<?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> 
0

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

ABCpdfバージョン9はすべて自動的にこれを行います。

私はABCpdf .NETソフトウェアコンポーネントを使用していますので、私の回答にはABCpdfに基づいた概念が含まれています。それは私が知っているものです。 :-)

+0

古いバージョンでは、ページ上の位置を無視してテキスト要素(つまりBT/ET、私が前提)を歩いて、BT/ET内で見つかったときにのみスペースを追加します。ポジションを考慮した「ビジュアル」分析を使用していますか?なぜ私は最初のアプローチでは、テキスト要素ごとに各端の間にスペースを追加しないのか分かりません。 PDFの中には、各単語*ではなく*文字*ごとに別々のテキスト要素がありますが、「文章」ではなく「セクション」の出力を避けたいのですか?私が古い仕組みがどういう仕組みか分かっていれば、私は新しい道を買うだろう! :) – Chris

関連する問題