2017-09-12 11 views
0

iTextで既存のPDFを操作して各段落の末尾にダッシュを追加する必要があります。このような何か:iText - 既存のPDFを操作する - ダッシュを各段落の末尾に追加する

Tab leaders

私は、タブリーダーとWordでこれになるだろう。

これは、既存の文書でiTextを使用することは可能ですか?

ご協力いただければ幸いです。

ありがとうございます!明確化

iTextのバージョンの

編集は5.5.xですが、私は、タスクが新しいバージョンと容易になるだろうならば、我々はそれをアップグレードすることができますね。

ダッシュを必要としない段落がありますが、元のPDFを何らかの形で管理しています。それは別のシステムから組み立てられ、リーダーを必要とする段落にマーカーを追加することができます(つまり、段落の末尾に "〜tab〜"のようなテキストを追加できます)。

この種の編集を必要とする文書には、ヘッダーとフッターがあり、テキストと1つの列には揃えがありません。特定の文書のための一層の明確化

ダッシュを終了しなければならないところ、私も(設定により)を設定することができます(すなわち。10pxの時)のための

編集。このように操作する必要のあるすべての文書タイプ(およびその構造)はわかっています。

+0

画像には、すべての段落の幅が同じで、左右に整列されています。さらに、1つのテキスト列があり、段落、ヘッダー、フッター、マージン材、画像がありません。それはあなたの仕事のために当然のことと言えるでしょうか?使用しているiTextのフレーバーについて言及していません。5.5.xバージョンか7.0.xバージョンですか? – mkl

+0

あなたが言うことができます* "特定のドキュメントのダッシュを終了する必要がある場所(つまり10px)を設定する" * - ページ境界から10pxを意味しますか?あるいは、各ダッシュが10px後に終了することを意味しますか? (ところで、ピクセルはPDFの自然な単位ではありません) – mkl

+0

はい、ページの境界線に基づいてダッシュを終了する場所を指定できます。 –

答えて

2

これは非常に難しいです。 PDF文書は、WYSIWYG形式ではなく、指示のコンテナと考えるべきです。だから、行がどこにあるかを知ることは(段落だけでなく)非常に難しい。

ハイレベルの計画:

  1. イベントのリストを確認するためにそれらを
  2. ソートTextRenderInfoイベントを格納し、TextRenderInfoイベントのために外を見る
  3. を解析されたPDFからのイベントを処理するために使用IEventListenerが論理的です読書の順序。
  4. 、彼らが同じ行に表示され、(例えばTextRenderInfoで指定されたフォントで3つのスペースの距離)離れて一定の距離未満であれば今、あなたはライン
  5. マージを持っている必要があり
  6. あなたのリスト内の項目をマージラインが互いに接近して垂直に近接して現れ、それらが水平に重なっている場合、どのくらい近くにあるべきか、そしてそれらが重なり合うかは、あなたが把握しなければならないものであり、ページごとに異なり、ドキュメントごとに異なる場合があります。
  7. 今すぐ段落があるはずです
  8. 各段落の境界ボックスを解きます。またはより正確には、凸包です。ギフトラッピングアルゴリズムと呼ばれるこのための良いアルゴリズムがあります。
  9. これで、凸包を検査して線を挿入することができます。これは簡単なステップです。

マーカーを挿入できる場合は、iText7を使用して簡単に行うことができます。 iText7にはIEventListenerの実装が用意されており、PDF文書内の正規表現を探すことができます。正規表現が見つかった場所を返します。マーカーが常に何らかの正規表現を満たしていることを確認できる場合は、マーカーを探して座標を取得し、計算された位置に線を挿入することができます。

もちろん、マーカーテキストを削除する必要があります。 そのためには、pdfSweepを使用することができます。

+0

アイデアありがとう。私は示唆したようにしようとします。私が行が必要な段落の最後に "〜tab〜"のようなテキストマーカーを追加すると簡単になりますか(質問を編集してください) –

+0

変更された情報を含むように私の答えを更新しました。 –

関連する問題