2017-01-19 19 views
-2

iText5では、 "public float calculateHeights(boolean firsttime)"が必要なときにPdfPTableの高さを取得できます。iText7では、iText5のcalculateHeightsメソッドのような方法がありますか?

iText7では、(特に親要素にテーブルを追加する前に)現在のテーブルの高さの値をどのように取得できますか?

私はすでに "table.getHeight()"メソッドをテストしましたが、nullを返します。 また、テーブルレンダリングオブジェクトでこの値を取得できることがわかりましたが、テーブルが親要素に追加されているときにレンダリングをトリガする必要があるため、時間が必要ではありません。

「y軸」値を決定するために、計算にこの値が必要な場合があります。

+0

あなたは幅が不明の場合は高さが計算できないことを知っている、あなたはありますか?幅の狭いテーブルは、幅の広いテーブルよりも高さが必要です。幅を設定したことを証明するコードを表示できますか? –

+0

こんにちは、ブライアン、あなたの返信を見て非常に幸せ。 – Schoner

+0

私はあなたの意味を知っていますが、iText5では、これを心配する必要はありません。メソッドを呼び出すだけです。 以下は単純な例です。テーブルの幅を設定し、1つの文字列を追加しますが、それでも高さの値は取得できません。 テーブルテーブル=新しいテーブル(1); table.setWidth(300); table.addCell( "1"); //結果:height = null System.out.println( "height =" + table.getHeight()); – Schoner

答えて

2

、その位置/サイズに関する要素との情報は、あなたがPdfPTable要素にcalculateWidthsを呼び出すことが許され、一緒に少し混合しました。

iText7では、この機能が分離されているため、レンダリング/レイアウト要素に対してさまざまな柔軟性が提供されます。

したがって、Tableインスタンスの例であるモデル要素は、その位置またはサイズについて何も知らない。 table.getHeighttableには既にHEIGHTのプロパティが設定されていないため、nullとなります。

テーブルの高さを計算するには、レンダリング機能を使用する必要があります。

モデル要素の場合、このモデル要素とすべての子要素を表すレンダラーのサブツリーを取得できます。layoutは任意の領域にレンダリングされます。テーブルの高さを実際に知るためには、要素の内容全体を配置するのに十分であると思われる領域を作成したいと思うでしょう。

PdfDocument pdfDoc = ... 
Document doc = ... 

Table table = new Table(2) 
      .addCell(new Cell().add(new Paragraph("cell 1, 1"))) 
      .addCell(new Cell().add(new Paragraph("cell 1, 2"))); 
LayoutResult result = table.createRendererSubTree().setParent(doc.getRenderer()).layout(
      new LayoutContext(new LayoutArea(1, new Rectangle(0, 0, 400, 1e4f)))); 

System.out.println(result.getOccupiedArea().getBBox().getHeight()); 

上記のコードは私のため22.982422Oを印刷するが、結果は、要素の構成および特性に応じて変えることができます。

私は、コードの二つの重要な部分を指摘したいと思います:

  1. は、私たちは、これが全体のテーブルを配置するのに十分であろうことを考えると、LayoutAreaの高さとして1e4fを渡します。テーブルをその高さに配置することができない場合、結果はこの指定された高さを決して超えず、したがってあなたのユースケース(テーブルの全高さを知る)は正しくありません。テーブル全体の配置には十分な高さを渡してください。

  2. .setParent(doc.getRenderer())ここでは重要な部分があり、継承するプロパティを取得するために使用されます。 table要素にも多くのプロパティを設定していないことに注意してください。この情報は、この要素が占める領域を知る上で不可欠です。したがって、この情報はlayoutの間に親チェーンから継承されます。あなたは、ドキュメントのフォントを変更することでこれをテストすることができます:document.setFont(newFont);、フォントサイズ:document.setFontSize(24);得られた高さ変化を見て

+0

多くのおかげで、アレクセイ... – Schoner

1

レンダラフレームワークがiText7で書かれているため、レイアウトオブジェクトの高さを親ドキュメントに追加する前に、レイアウトオブジェクトの高さを計算する方法はありません。レイアウトオブジェクトの高さは、オブジェクトがDocumentオブジェクトに追加されたときに発生します。

しかし、Documentを再レイアウトすると、以前に追加した要素の内容を変更することができます。これを使用すると、新しい要素を追加するときに表のレンダリングをシミュレートし、高さを保持することができます。 table.getHeight()はheightプロパティを取得しており、そのプロパティは現在、テーブルレンダリングプロセスのどこにも設定されていないため、動作しません。

以下の例では、レンダラーツリーを反復処理し、各テーブルがドキュメント内で占める領域を印刷して、計算された高さを取得する方法を示す便利なメソッドを作成しました。

この例では、ドキュメントにいくつかのテーブルを追加し、占有領域を表示し、各テーブルにいくつかのセルを追加し、占有領域を表示します(前に追加された要素レイアウト)し、最後に手動で再レイアウトをトリガして最終的な占有領域を表示します。 iText5で

public class DelayedLayout { 
    public static String DEST = "target/output/StackOverflow/DelayedLayout/delayed.pdf"; 

    public static void main(String[] args)throws IOException, FileNotFoundException{ 
     File file = new File(DEST); 
     file.getParentFile().mkdirs(); 
     new DelayedLayout().createPdf(DEST); 
    } 

    public void createPdf(String dest) throws IOException, FileNotFoundException{ 
     PdfWriter writer = new PdfWriter(dest); 
     PdfDocument pdfDoc = new PdfDocument(writer); 
     boolean immediateFlush = false; 
     boolean relayout = true; 
     //Set immediate layout to false, so the document doesn't immediatly write render-results to its outputstream 
     Document doc = new Document(pdfDoc, PageSize.A4,immediateFlush); 
     Table tOne = createSimpleTable(); 
     for(int i= 0; i< 5; i++) { 
      //Add a table and some whitespace 
      doc.add(tOne); 

      doc.add(new Paragraph("")); 

     } 
     System.out.println("\nInitial layout results"); 
     printOccupiedAreasOfTableRenderers(doc.getRenderer()); 
     System.out.println("\nAdding extra cells to the table"); 
     addToTable(tOne); 
     printOccupiedAreasOfTableRenderers(doc.getRenderer()); 
     System.out.println("\nForcing the document to redo the layout"); 
     if(relayout)doc.relayout(); 
     printOccupiedAreasOfTableRenderers(doc.getRenderer()); 
     doc.close(); 
    } 

    /** 
    * Create a very simple table 
    * @return simple table 
    */ 
    private Table createSimpleTable(){ 
     int nrOfCols = 3; 
     int nrOfRows = 5; 

     Table res = new Table(nrOfCols); 
     for(int i= 0; i<nrOfRows;i++){ 
      for(int j = 0; j<nrOfCols;j++){ 
       Cell c = new Cell(); 
       c.add(new Paragraph("["+i+", "+j+"]")); 
       res.addCell(c); 
      } 
     } 

     return res; 
    } 

    /** 
    * Add some extra cells to an exisiting table 
    * @param tab table to add cells to 
    */ 
    private void addToTable(Table tab){ 
     int nrOfRows = 5; 
     int nrOfCols = tab.getNumberOfColumns(); 
     for(int i=0; i<nrOfRows*nrOfCols;i++){ 
      Cell c = new Cell(); 
      c.add(new Paragraph("Extra cell"+ i)); 
      tab.addCell(c); 
     } 

    } 

    /** 
    * Recursively iterate over the renderer tree, writing the occupied area to the console 
    * @param currentNode current renderer-node to check 
    */ 
    private void printOccupiedAreasOfTableRenderers(IRenderer currentNode){ 
     if(currentNode.getClass().equals(TableRenderer.class)){ 
      System.out.println("Table renderer with occupied area: " + currentNode.getOccupiedArea()); 
     } 
     for (IRenderer child:currentNode.getChildRenderers()) { 
      printOccupiedAreasOfTableRenderers(child); 
     } 
    } 
+0

多くのおかげで、サミュエル... – Schoner

関連する問題