You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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坐标(控制列的上边界)

你之前的代码里犯了几个关键错误:

  1. 表格的参数写反了:ct.setSimpleColumn(100, 700, 500, 500)里,lly=700比ury=500大,这相当于把列的上下边界颠倒了,内容根本无法正常显示
  2. 重复使用同一个ColumnText实例却没重置,容易导致之前的参数残留干扰后续布局
  3. 坐标没有贴合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:49:40