Java 如何调整PdfPTable的大小以适应页面?
我正在生成一个文档,就像下面的代码一样,当然表的内容是不同的。我需要做的是确保这个表的大小永远不会超过一页,不管单元格中的内容有多少。有办法吗 导入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”;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
文件=新文件(页面大小为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();
}