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

Java 如何调整PdfPTable的大小以适应页面?,java,itext,Java,Itext,我正在生成一个文档,就像下面的代码一样,当然表的内容是不同的。我需要做的是确保这个表的大小永远不会超过一页,不管单元格中的内容有多少。有办法吗 导入com.itextpdf.text.Phrase; 导入com.itextpdf.text.Document; 导入com.itextpdf.text.DocumentException; 导入com.itextpdf.text.PageSize; 导入com.itextpdf.text.pdf.PdfPCell; 导入com.itextpdf.te

我正在生成一个文档,就像下面的代码一样,当然表的内容是不同的。我需要做的是确保这个表的大小永远不会超过一页,不管单元格中的内容有多少。有办法吗

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

public void createTemplate()引发DocumentException、FileNotFoundException、IOException{ 字符串TARGET=System.getProperty(“user.home”)+“\temp.pdf”;
文件=新文件(页面大小为A4); PdfWriter writer=PdfWriter.getInstance(文档,新文件输出流(目标)); document.open()

PdfPTable=新的PdfPTable(7);
对于(int i=0;i<105;i++){
短语p=新短语(“某些文本”);
PdfPCell cell=新的PdfPCell();
细胞内微量元素(p);
表2.addCell(cell);
}
table.setTotalWidth(PageSize.A4.getWidth()-10);
表2.setLockedWidth(真);
PdfContentByte canvas=writer.getDirectContent();
PdfTemplate template=canvas.createTemplate(table.getTotalWidth(),table.getTotalHeight());
table.writeSelectedRows(0,-1,0,PageSize.A4.getHeight(),模板);
Image img=Image.getInstance(模板);
img.scaleToFit(PageSize.A4.getWidth(),PageSize.A4.getHeight());
img.setAbsolutePosition(0,PageSize.A4.getHeight());
文件。添加(img);
document.close();
Desktop=Desktop.getDesktop();
文件文件=新文件(目标);
desktop.open(文件);}


编辑:@Bruno Lowagie。模板包装在图像中的提示对我来说恰到好处,我据此更改了代码,但现在得到的只是一个空PDF。我做错了什么,或者这是一种错误的方法吗?

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

    table.setTotalWidth(width);
    table.setLockedWidth(true);
现在,您可以创建一个大小为
矩形(0,0,宽度+边距*2,getTotalHeight()+边距*2)的
文档
,当您使用
writeSelectedRows()
方法添加文档时,该表应该正好适合文档

如果不需要自定义页面大小,则需要创建具有表大小的
PdfTemplate
,并将表添加到此模板对象。然后将模板对象包装在
图像中
,并使用
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();
}
publicstaticvoidmain(字符串[]args)抛出DocumentException、FileNotFoundException、IOException{
String TARGET=“temp.pdf”;
文件=新文件(页面大小为A4);
PdfWriter writer=PdfWriter.getInstance(文档,新文件输出流(目标));
document.open();
PdfPTable=新的PdfPTable(7);
对于(int i=0;i<700;i++){
短语p=新短语(“某些文本”);
PdfPCell cell=新的PdfPCell();
细胞内微量元素(p);
表2.addCell(cell);
}
table.setTotalWidth(PageSize.A4.getWidth());
表2.setLockedWidth(真);
PdfContentByte canvas=writer.getDirectContent();
PdfTemplate template=canvas.createTemplate(table.getTotalWidth(),table.getTotalHeight());
writeSelectedRows(0,-1,0,table.getTotalHeight(),template);
Image img=Image.getInstance(模板);
img.scaleToFit(PageSize.A4.getWidth(),PageSize.A4.getHeight());
img.setAbsolutePosition(0,(PageSize.A4.getHeight()-table.getTotalHeight())/2);
文件。添加(img);
document.close();
}

尝试注释,但我不知道如何在注释中正确插入代码,因此我编辑了问题。乍一看,您没有正确地将表添加到模板中。我会试试你的例子看看哪里出了问题。你有三处定位错误。我已经用一种可以正常工作的方法更新了我的答案。我必须找一些时间来正确阅读你的书,而不是从一章跳到另一章:)非常感谢.table.setTotalWidth(PageSize.A4.getWidth());表2.setLockedWidth(真);为我工作
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();
}