2016-09-25 3 views
1

私はiTextを使い始めました。私は多くの例を見ました。私はそれを把握するのに苦労することが長方形です。ページPDFページの途中で正しい座標を決める方法は?

http://developers.itextpdf.com/examples/form-examples-itext5/multiline-fields

上のRectangleオブジェクトのためのハードコードされた値を持つ多くの例があります。たとえば:

Rectangle rect = new Rectangle(36, 770, 144, 806); 

私の問題は、私は1つの段落を作成し、私はその下に入力可能なテキスト入力ボックス(マルチライン)を追加したいということです。段落の直後にうまく配置できるRectangleオブジェクトを作成するための正確な値を知るにはどうすればよいですか。段落のテキストのサイズは変更できます。だから私はハードコードされた値を仮定することはできません。

ありがとうございます!

答えて

2

iText 5では、document.add()を使用すると、iTextはコンテンツの座標を追跡します。絶対位置にコンテンツを追加することで自分でコントロールすることができます(例えばColumnTextを使用するなど)が難しいです。多くのことを自分で追跡しなければならないためです(たとえば、内容が一番下に来たときにページ区切りを導入する必要がありますページの)。

座標の制御をiTextに任せると、ページイベントを使用してこれらの座標にアクセスできます。

Paragraphの開始点と終了点をonParagraph()onParagraphEnd()メソッドで追跡する例を見てください。このコードサンプルは分かりにくいですが、テキストブロックの周囲に矩形を描きたい場合など、iText 5のParagraphの座標を取得する唯一の方法です。そのページの最後にあるように、iText 7はこの要件を満たすのがずっと簡単です。

iText 5を使用すると、汎用タグを使用して場所を定義する方がずっと簡単です。 GenericFieldsの例を参照してください。ここでは、結果としてフィールドに空のChunkが使用されます。あなたがあなたのケースではAdd PdfPCell to Paragraph

を参照して、結果のスクリーンショットを見たい場合は、私は別の行にまたがるChunkを含むParagraphを作成したい、と私はページのonGenericTag()方法でフィールドを追加したいですイベント。



我々は、次のテキストファイルがあるとします。青い枠を注意

enter image description here

:私たちはこのようになりますPDFに変換するにはどうすればよいjekyll_hyde.txt

をそれはタイトルに追加され、ページ番号は各ページの下部に表示されます。

class MyPageEvents extends PdfPageEventHelper { 

    protected float startpos = -1; 
    protected boolean title = true; 

    public void setTitle(boolean title) { 
     this.title = title; 
    } 

    @Override 
    public void onEndPage(PdfWriter writer, Document document) { 
     Rectangle pagesize = document.getPageSize(); 
     ColumnText.showTextAligned(
      writer.getDirectContent(), 
      Element.ALIGN_CENTER, 
      new Phrase(String.valueOf(writer.getPageNumber())), 
      (pagesize.getLeft() + pagesize.getRight())/2, 
      pagesize.getBottom() + 15, 
      0); 
     if (startpos != -1) 
      onParagraphEnd(writer, document, 
       pagesize.getBottom(document.bottomMargin())); 
     startpos = pagesize.getTop(document.topMargin()); 
    } 

    @Override 
    public void onParagraph(PdfWriter writer, Document document, 
     float paragraphPosition) { 
     startpos = paragraphPosition; 
    } 

    @Override 
    public void onParagraphEnd(PdfWriter writer, Document document, 
     float paragraphPosition) { 
     if (!title) return; 
     PdfContentByte canvas = writer.getDirectContentUnder(); 
     Rectangle pagesize = document.getPageSize(); 
     canvas.saveState(); 
     canvas.setColorStroke(BaseColor.BLUE); 
     canvas.rectangle(
      pagesize.getLeft(document.leftMargin()), 
      paragraphPosition - 3, 
      pagesize.getWidth() - document.leftMargin() - document.rightMargin(), 
      startpos - paragraphPosition); 
     canvas.stroke(); 
     canvas.restoreState(); 
    } 
} 

我々はPDFにテキストファイルを変換し、PdfWriterにページイベントを導入するには、次のコードを使用することができます:

public void createPdf(String dest) 
throws DocumentException, IOException { 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    MyPageEvents events = new MyPageEvents(); 
    writer.setPageEvent(events); 
    document.open(); 
    BufferedReader br = new BufferedReader(new FileReader(TEXT)); 
    String line; 
    Paragraph p; 
    Font normal = new Font(FontFamily.TIMES_ROMAN, 12); 
    Font bold = new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD); 
    boolean title = true; 
    while ((line = br.readLine()) != null) { 
     p = new Paragraph(line, title ? bold : normal); 
     p.setAlignment(Element.ALIGN_JUSTIFIED); 
     events.setTitle(title); 
     document.add(p); 
     title = line.isEmpty(); 
    } 
    document.close(); 
} 

ソースiTextの5では、これらの要素は、ページのイベントを使用して追加されます:developers.itextpdf.com

+0

私はあなたがお勧めするものを見ていきます! – curious1

+0

ブルーノ、ありがとう。私はあなたのリンクを見て、あなたが言ったことを作るのが難しいと感じている "あなたの場合は、別の行にまたがるチャンクを含む段落を作成し、ページイベントのonGenericTag()メソッドでフィールドを追加したい"はい、段落の後ろに複数行入力ボックスを入れたいと思います。そのような例がオンラインにありますか?ベスト。 – curious1

+1

'GenericFields'の例は、' Paragraph'の中にフィールド*を追加したいときにどのように処理されるかを示しています。 'Chunk'が完全な' Paragraph'に及ぶようにその例を適応させてください。それは難しいことではありません。 –

関連する問題