2017-12-30 17 views
1

한 페이지에 여러 테이블을 맞추려고합니다. 나는 잠재적 인 해결책을 구현했다. 문제는 필자가 원할 때 다음 인쇄 영역으로 이동하는 방법이다. 오히려 현재 인쇄 영역이 채워질 때 문제가된다. 출력 내용은 다음과 같습니다. 두 번째 영역이 부분적으로 자동 채워 지도록 글꼴 크기를 늘 렸습니다. 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

하나의 테이블에는 표시 할 수 없지만 영역 나누기는 광고 할 수 있습니다. 가능한 한 많은 행을 추가하는 각 영역이있는 단일 테이블을 연속적으로 렌더링한다고 가정합니다. – 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] (https://developers.itextpdf.com/content/itext-7-building-blocks/chapter-2)의'MyColumnRenderer' 클래스에서와 같이'DocumentRenderer'를 확장하는 것입니다. 튜토리얼. 그러나 그것은 당신이 당신의 대답에서하고있는 것보다 성취하기가 더 복잡합니다. 그래서 대답을 +1하십시오 (그리고 나는 그 질문에 +1을했습니다). –

+0

@ BrunoLowagie : 귀하의 상향 투표 및 친절한 의견을 보내 주시면 감사하겠습니다. – user1501247