2013-02-19 5 views
3

다음 코드와 같이 테이블의 내용을 변경하는 경우를 제외하고 문서를 생성 중입니다. 내가해야할 일은이 테이블이 셀의 내용량에 관계없이 절대 크기가 한 페이지를 초과하지 않도록하는 것입니다. 그것을 할 수있는 방법이 있습니까? 페이지에 맞게 PdfPTable의 크기를 조정하는 방법은 무엇입니까?

import com.itextpdf.text.Phrase; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.pdf.PdfPCell; 
import com.itextpdf.text.pdf.PdfPTable; 
import java.awt.Desktop; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException;

public void createTemplate() throws DocumentException, FileNotFoundException, IOException{ String TARGET = System.getProperty("user.home")+"\temp.pdf";
Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(TARGET)); document.open();

PdfPTable table = new PdfPTable(7); for (int i = 0; i < 105; i++) { Phrase p = new Phrase("some text"); PdfPCell cell = new PdfPCell(); cell.addElement(p); table.addCell(cell); } table.setTotalWidth(PageSize.A4.getWidth()-10); table.setLockedWidth(true); PdfContentByte canvas = writer.getDirectContent(); PdfTemplate template = canvas.createTemplate(table.getTotalWidth(),table.getTotalHeight()); table.writeSelectedRows(0, -1, 0, PageSize.A4.getHeight(), template); Image img = Image.getInstance(template); img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight()); img.setAbsolutePosition(0, PageSize.A4.getHeight()); document.add(img); document.close(); Desktop desktop = Desktop.getDesktop(); File file = new File(TARGET); desktop.open(file); }

편집 : @Bruno Lowagie. 이미지에 포장 된 템플릿의 힌트가 내게 들리 네요. 코드를 바꿨지 만 지금은 빈 PDF입니다. 나는 잘못된 것을하고 있습니까? 아니면 이것이 잘못된 접근입니까?

답변

8

테이블을 페이지에 맞게 만들려면 페이지 크기를 고려하기 전에 테이블을 만들고 TableHeight 예 에서처럼 높이를 테이블에 요청해야합니다. getTotalHeight() 메서드는 테이블의 너비를 정의하지 않으면 0을 반환합니다.

table.setTotalWidth(width); 
    table.setLockedWidth(true); 

지금 당신이 크기 Rectangle(0, 0, width + margin * 2, getTotalHeight() + margin * 2)Document을 만들 수 있으며, 당신이 writeSelectedRows() 방법을 추가 할 때 테이블이 정확히 문서에 맞게해야한다 : 이것은 다음과 같이 수행 할 수 있습니다.

사용자 정의 페이지 크기를 원하지 않으면 테이블 크기로 PdfTemplate을 작성하고 테이블을이 템플리트 오브젝트에 추가해야합니다. 그런 다음 Image에 템플릿 객체를 래핑하고 scaleToFit()을 사용하여 테이블의 크기를 줄입니다.

public static void main(String[] args) throws DocumentException, FileNotFoundException, IOException { 
    String TARGET = "temp.pdf"; 
    Document document = new Document(PageSize.A4); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(TARGET)); 
    document.open(); 


    PdfPTable table = new PdfPTable(7);   

    for (int i = 0; i < 700; i++) { 
     Phrase p = new Phrase("some text"); 
     PdfPCell cell = new PdfPCell(); 
     cell.addElement(p); 
     table.addCell(cell);    
    } 

    table.setTotalWidth(PageSize.A4.getWidth()); 
    table.setLockedWidth(true); 
    PdfContentByte canvas = writer.getDirectContent(); 
    PdfTemplate template = canvas.createTemplate(table.getTotalWidth(), table.getTotalHeight()); 
    table.writeSelectedRows(0, -1, 0, table.getTotalHeight(), template); 
    Image img = Image.getInstance(template); 
    img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight()); 
    img.setAbsolutePosition(0, (PageSize.A4.getHeight() - table.getTotalHeight())/2); 
    document.add(img); 
    document.close(); 
} 
+0

댓글을 달았지만 댓글에 코드를 올바르게 삽입하는 방법을 찾지 못해서 질문을 편집했습니다. –

+0

첫눈에 테이블을 템플릿에 올바르게 추가하지 않습니다. 나는 잘못을 이해하기 위해 당신의 모범을 보일 것입니다. –

+0

위치 오류는 세 곳에서 발생했습니다. 원하는대로 작동하는 방법으로 내 대답을 업데이트했습니다. –

관련 문제