如何调整PdfPTable的大小以适应页面?

时间:2013-02-19 13:12:49

标签: java itext

我正在生成一个文档,如下面的代码所示,除了表格的内容,这些内容各不相同。我需要做的是确保此表的大小不会超过一页,无论单元格中的内容量如何。有办法吗?

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。我做错了什么,或者这是一个错误的做法?

1 个答案:

答案 0 :(得分:10)

如果您希望表格适合页面,您应该在考虑页面大小之前创建表格,并在TableHeight示例中查询表格的高度。请注意,getTotalHeight()方法返回0,除非您定义表的宽度。这可以这样做:

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

现在,您可以创建一个大小为Document的{​​{1}},当您使用Rectangle(0, 0, width + margin * 2, getTotalHeight() + margin * 2)方法添加该表时,该表应完全符合该文档。

如果您不想要自定义页面大小,则需要创建一个具有表大小的writeSelectedRows()并将表添加到此模板对象。然后将模板对象包装在PdfTemplate中,并使用Image调整表格大小。

scaleToFit()