2

PDF lib を使用して PDF の隠しスペースを削除したい。

PDFで「Gregor」という単語を抽出すると「Gregor」と出てきますが、どうしても「Gregor」のようにしたいです。

これにはどのような理由が考えられますか? または、これらの「隠しスペース」をどのように回避できますか?

4

3 に答える 3

6

何年も前、私はAdobeでAcrobatバージョン1.0以降を使用していました。当時、私は検索、強調表示、コピー&ペーストを行うためのツールを作成しました。私はあなたがおそらくあなたが見ているものを見ている理由とあなたがおそらくまたSOLである理由を説明しようとしますあなたがPDFlibをハックしたいのでなければ)。

PDFでは、ページのコンテンツは、PostScriptに似たRPN言語のプログラムで表されます。チューリング完全ではないという点で異なります。ループ、妥当な関数定義、再帰などが欠けているため、厄介な停止問題を回避できます。典型的なページコンテンツプログラムは次のようになります。

255 0 0 sc 72 72 m 144 72 l 144 144 l 72 144 l f

つまり、色を赤(255 0 0)に設定し、(72、72)に移動し、線を(144、72)に接続し、最後にパスを塗りつぶします。これにより、ページ下部の右上1インチに左下隅が配置された、一辺が1インチの赤い正方形が作成されます。

さて、あなたがテキストを扱っているとき、それはもう少し複雑です。テキストを描画する演算子は、Tj、'、 "、TJの4つです。これらは、演算子を適用する前と後のどちらでも、テキストの配置にどのように影響するかが大きく異なります。それでも、健全な世界では、ドキュメントに何かがあることが期待されます。コンテンツストリームでは次のようになります。

BT 72 288 Td (Gregor) Tj ET

つまり、テキストを開始し、テキストの位置を(72、288)に移動し、テキスト「Gregor」を配置して、テキストを終了します。

おそらく、そうではありません。代わりに、ドキュメントはおそらく次のようになります。

BT 72 288 Td (Gre) Tj --stuff-- 88 288 Td (gor) Tj ET

ここで、-stuff--は0個以上の他のPDF演算子です。PDFはページ記述言語であり、テキストファイル形式ではありません。したがって、PDFは、ページを作成するためのコンテンツストリームのレイアウト方法を指示しません。実際、同等/同一のページを生成する方法は無数にあります。

したがって、PDFドキュメントからテキストを抽出することを目的としたコードのチャンクの作成者は、「単語とは何ですか?」という質問に非常に明確に答えるのに少し時間がかかるはずです。それが最初にうまく答えられない場合、あなたはどんな種類の合理的なテキスト抽出も決してありません。具体的にはわかりませんが、pdflibの単語の定義は、「テキスト配置演算子からの空白で区切られた部分文字列」であると強く疑っています。この定義により、おそらく80%の道のりが得られます。多分もっと多いですが、それほど多くはありません。実装するのはほとんど簡単な定義ですが、単語が単一のテキスト配置演算子で配置されていない場合は失敗します。ちなみに、テキストが読み上げ順序の近くに配置されていないPDFページもあります。たとえば、troff(少なくとも以前は)はすべてのプレーンテキストを最初にレイアウトします。

次に、別の方法で問題について考える必要があります。単語を、物理的な空間で互いに近く、サイズが似ているグリフの順序付けられたシーケンスであると定義するとどうなりますか?次に、定義が前の定義の成功事例を完全に包含し、前の「単語とは何か」の定義に固有​​の前の失敗の膨大な数を正しく含むことがわかります。また、コードでのその定義の実際の実装は大幅に多いことがわかりますより困難。最初の定義は約1時間で実行できますが、「何が近いのか」という質問に答える必要があるため、この定義は実際に正しくなるまでに数週間または数か月の時間のようなものです。と「サイズは何が似ていますか?」そして、その間、テキストエンコーディング、合字、任意のハイフン、曲線に沿って配置されたテキストなどの他のことを考慮する必要があります(Acrobatがマップ内の単語を見つけることができたときの私がどれほど幸せだったかはわかりません)。

したがって、これから導き出すべき結論は、PDFからテキストを抽出することは簡単ではなく、簡単に記述されたコードから多数の失敗を予期する必要があるということです。

于 2011-07-05T13:37:46.513 に答える
1

PDFを1行ずつ読み、「Gregor」を「Gregor」に置き換えます。

于 2011-07-05T10:52:27.753 に答える
0

PdfTextStream をご覧になることを強くお勧めします。彼らは plinth の投稿に記載されている大変な作業を行いました。

http://www.snowtide.com/

それらは、最も自然な (人間の読者が単語に期待するもの) 単語の定義を持つことを目指しています。

于 2011-09-29T14:17:11.540 に答える