iText setSimpleColumn参数llx/lly/urx/ury理解及发票PDF布局问题
解决iText ColumnText布局异常问题
我来帮你搞定这个iText布局的坑!首先得把setSimpleColumn的四个参数彻底搞明白,这是你当前问题的核心:
在iText的PDF坐标系里,页面左下角是原点(0,0),所以setSimpleColumn(llx, lly, urx, ury)的四个参数含义是:
llx: 列的左下角X坐标(控制列的左边界)lly: 列的左下角Y坐标(控制列的下边界)urx: 列的右上角X坐标(控制列的右边界)ury: 列的右上角Y坐标(控制列的上边界)
你之前的代码里犯了几个关键错误:
- 表格的参数写反了:
ct.setSimpleColumn(100, 700, 500, 500)里,lly=700比ury=500大,这相当于把列的上下边界颠倒了,内容根本无法正常显示 - 重复使用同一个
ColumnText实例却没重置,容易导致之前的参数残留干扰后续布局 - 坐标没有贴合A4页面的实际尺寸(A4默认是595×842用户单位),导致内容位置不符合预期
下面是修改后的代码,完全匹配你想要的布局(公司信息左上、发票信息右上、表格在下方):
public class CreateInvoicePdf { public static final String DEST="C:\\Users\\sanju\\Desktop\\resul.pdf"; public static void main(String args[]) throws FileNotFoundException, DocumentException { File file = new File (DEST); file.getParentFile().mkdirs(); new CreateInvoicePdf().createPdf(DEST); } public void createPdf(String dest) throws FileNotFoundException, DocumentException { Document d = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(d, new FileOutputStream(dest)); d.open(); PdfContentByte can = writer.getDirectContent(); // 公司详情 - 页面左上角区域 Paragraph companyDetails = new Paragraph("CLIMAX EXCLUSIVE\nShop No. G1 G2 Mohan Bazar\nCentral Market Ashok Vihar\nNew Delhi-110052"); ColumnText ctCompany = new ColumnText(can); // 左边界36(默认边距),下边界750,右边界300,上边界800(靠近页面顶部) ctCompany.setSimpleColumn(36, 750, 300, 800); ctCompany.addElement(companyDetails); ctCompany.go(); // 发票详情 - 页面右上角区域 Paragraph invoiceDetails = new Paragraph("Invoice No : 1234\nDate : 10/05/2018\nPay : CASH"); ColumnText ctInvoice = new ColumnText(can); // 左边界350,下边界750,右边界559(A4宽度595-36边距),上边界800 ctInvoice.setSimpleColumn(350, 750, 559, 800); ctInvoice.addElement(invoiceDetails); ctInvoice.go(); // 商品表格 - 公司/发票信息下方 PdfPTable itemTable = new PdfPTable(9); itemTable.addCell("1"); itemTable.addCell("Shirt"); itemTable.addCell("1999"); itemTable.addCell("1"); itemTable.addCell("1999"); itemTable.addCell("12"); itemTable.addCell("1500"); itemTable.addCell("250"); itemTable.addCell("250"); ColumnText ctTable = new ColumnText(can); // 左边界36,下边界400,右边界559,上边界730(在上方内容的下方) ctTable.setSimpleColumn(36, 400, 559, 730); ctTable.addElement(itemTable); ctTable.go(); d.close(); writer.close(); } }
关键调整说明:
- 每个区域单独创建
ColumnText实例,避免参数冲突 - 所有坐标都基于A4页面的实际尺寸和默认边距(36用户单位)设置,确保内容位置符合预期
- 表格的上下边界参数正确设置(
ury=730>lly=400),保证内容能正常渲染
内容的提问来源于stack exchange,提问作者sanjulgupta
相关产品推荐
相关产品推荐

