2017-12-30 11 views
1

私はいくつかのテーブルを1ページに収めようとしています。私は潜在的な解決策を実装しました。私の問題は、現在の印刷領域が満たされたときに、次の印刷領域に移動する方法です。 これは今のように出力されます。私は第2領域が部分的に自動的に塗りつぶされるようにフォントサイズを増やしました。 iText7が望んでいるのではなく、私が次の領域を使うように指示する方法はありますか?iText7を使ってpdfに複数のテーブルを印刷する

The image shows 2 areas on a pdf page

私のコードです:

import java.io.File; 
import java.io.FileNotFoundException; 

import com.itextpdf.io.IOException; 
import com.itextpdf.kernel.geom.Rectangle; 
import com.itextpdf.kernel.pdf.PdfDocument; 
import com.itextpdf.kernel.pdf.PdfWriter; 
import com.itextpdf.layout.Document; 
import com.itextpdf.layout.element.Cell; 
import com.itextpdf.layout.element.Paragraph; 
import com.itextpdf.layout.element.Table; 
import com.itextpdf.layout.layout.LayoutArea; 
import com.itextpdf.layout.layout.LayoutResult; 
import com.itextpdf.layout.property.TextAlignment; 
import com.itextpdf.layout.renderer.DocumentRenderer; 

public class ColumnDocumentRendererTest { 
    static PdfDocument pdfDoc; 
    static Document document; 
    Table tble; 
    protected int nextAreaNumber = 0; 

    public static final String DEST = "./target/test/resources/sandbox/tables/horizontzl_alignment.pdf"; 

    public ColumnDocumentRendererTest(Document document2) { 
    // TODO Auto-generated constructor stub 
    } 

    public static void main(String[] args) 
     throws IOException, FileNotFoundException { 

    File file = new File(DEST); 
    file.getParentFile().mkdirs(); 
    new ColumnDocumentRendererTest(document).createPdf(DEST); 
    } 

    public void createPdf(String dest) 
     throws IOException, FileNotFoundException { 
    pdfDoc = new PdfDocument(new PdfWriter(DEST)); 
    document = new Document(pdfDoc); 
    ColumnDocumentRenderer renderer = new ColumnDocumentRenderer(document); 
    document.setRenderer(renderer); 

    //Add paragraph to the document 
    tble = new Table(new float[] { 3f, 3f, 3f, 3f, 3f, 3f, 3f }); 
    /*tble.addCell(new Cell() 
     .add(new Paragraph(tokenizer.nextToken()).setFont(font)));*/ 
    for (int i = 1; i <= 21; i++) { 
     tble.addCell(new Cell().add(new Paragraph(Integer.toString(i)) 
      .setTextAlignment(TextAlignment.RIGHT) 
      .setFontSize((float) 20.5))); 
    } 

    document.add(tble); 
    document.close(); 
    } 
} 
+0

することはでき広告エリアの休憩ではなく、単一のテーブルの内側: 次のコードは、ユースケースを解決します。 1つのテーブルが連続的にレンダリングされ、各エリアに可能な限り多くの行が追加されているものとします。 – mkl

答えて

1

私はこの問題によく説明し、答えを提供しiText7、のドキュメントを読んでいません。 (iText7 documentationを参照してください)

答えは "ドキュメント"ではなく "キャンバス"を使用することが判明しました。

public class TablePrinter { 
    static PdfDocument pdfDoc; 
    Table tble; 
    protected int nextAreaNumber = 0; 

    public TablePrinter() { 

    } 

    public static final String DEST = "./target/test/resources/sandbox/tables/tables_printed.pdf"; 

    public void createPdf(String dest) throws IOException, java.io.IOException { 
    // 
    PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN); 
    PdfFont bold = PdfFontFactory.createFont(FontConstants.TIMES_BOLD); 

    pdfDoc = new PdfDocument(new PdfWriter(dest)); 
    PdfPage page = pdfDoc.addNewPage(); 
    PdfCanvas pdfCanvas = new PdfCanvas(page); 
    Rectangle rectangle = new Rectangle(70, 722, 200, 100); 
    pdfCanvas.rectangle(rectangle); 
    pdfCanvas.stroke(); 
    Canvas canvas = new Canvas(pdfCanvas, pdfDoc, rectangle); 
    Text title = new Text("The Strange Case of Dr. Jekyll and Mr. Hyde") 
     .setFont(bold); 
    Text author = new Text("Robert Louis Stevenson").setFont(font); 
    Paragraph p = new Paragraph().add(title).add(" by ").add(author); 
    canvas.add(p); 

    rectangle = new Rectangle(310, 722, 200, 100); 
    pdfCanvas.rectangle(rectangle); 
    pdfCanvas.stroke(); 
    canvas.close(); 
    canvas = new Canvas(pdfCanvas, pdfDoc, rectangle); 

    tble = new Table(new float[] { 3f, 3f, 3f, 3f, 3f, 3f, 3f }); 
    /*tble.addCell(new Cell() 
     .add(new Paragraph(tokenizer.nextToken()).setFont(font)));*/ 

    int DaysInMonth = 31; 
    for (int i = 1; i <= 35; i++) { 
     if (i <= DaysInMonth) { 
     tble.addCell(new Cell().add(new Paragraph(Integer.toString(i)) 
      .setTextAlignment(TextAlignment.RIGHT) 
      .setFontSize((float) 8.0))); 
     if ((i >= DaysInMonth) && (i % 7 == 0)) 
      break; 
     } else { 
     tble.addCell(new Cell()); 
     if (i % 7 == 0) 
      break; 
     } 
    } 
    p = new Paragraph().add(tble); 
    canvas.add(p); 

    canvas.close(); 
    pdfDoc.close(); 
    // 
    } 

    public void addParagraph(Document document, int count) { 
    Paragraph p; 
    TextAlignment alignment; 
    for (int i = 1; i < count + 1; i++) { 
     p = new Paragraph("entry" + String.valueOf(i)); 
     alignment = (i % 2 != 0) ? TextAlignment.LEFT : TextAlignment.RIGHT; 
     p.setTextAlignment(alignment); 
     document.add(p); 
    } 
    } 

    public static void main(String[] args) 
     throws IOException, java.io.IOException { 

    File file = new File(DEST); 
    file.getParentFile().mkdirs(); 
    new TablePrinter().createPdf(DEST); 
    } 

} 
+0

@mklが彼のコメントに示したように、 'AreaBreak'を追加することもできました。これはおそらく最も簡単な解決策です。もう一つの解決策は、[Chapter 2]の 'MyColumnRenderer'クラス(https://developers.itextpdf.com/content/exxt-7-building-blocks/chapter-2)で行われているように、' DocumentRenderer'を拡張することです。チュートリアル。しかし、これはあなたがあなたの答えでやっていることよりも達成するのがより複雑です。答えに+1します(私がそれをしている間に、私はあなたにも質問を+1しました)。 –

+0

@ BrunoLowagie:あなたのアップ投票と親切なコメントは大変ありがとうございます。 – user1501247

関連する問題