itext使用小结

这篇博客总结了使用Itext库生成PDF文档和表格的方法,包括设置字体、创建PDF流、建立多列表格以及填充单元格的详细步骤,提供了一个复杂的表格代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Itext生成table小结

17.07.28日写

需要的jar包

    <!-- itextpdfJar包 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.2.1</version>
    </dependency>
    <!-- 解决中文显示问题的Jar包 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>

生成一个PDF文档

//创建PDF文档
Document document = new Document();
//创建 PdfWriter instance.
//PdfWriter.getInstance(document, new FileOutputStream(“D:\” + “createSamplePDF.pdf”)); //该方法写入到磁盘
response.setHeader(“Content-disposition”, “attachment; filename=jx.pdf”);
response.setContentType(“application/pdf”);
PdfWriter.getInstance(document, response.getOutputStream()); //变成一个下载流
//打开Document.
document.open();
//设置中文字体
BaseFont baseFont = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”,BaseFont.NOT_EMBEDDED);
Font font = new Font(baseFont);
//加入第一行content.
//document.add(new Paragraph(new String(“你好世界!”.getBytes(),”GBK”) ,font));
document.add(new Paragraph(“你好世界!”,font));

创建一个table和其中的cell

/**
* 开始第二张表格
*/
PdfPTable table2=new PdfPTable(42); //设置表格所占列数
PdfPCell [][] cell2=new PdfPCell[20][10];//cell数组
/**
* 第一行
*/
cell2[1][1]=createCell(“课程性质”,2,25);
cell2[1][2]=createCell(“小计”,1,6);
cell2[1][3]=createCell(“小计”,1,6);
cell2[1][4]=createCell(“备注”,1,5);
/**
* 第二行
*/
cell2[2][2]=createCell(“学时”,1,3);
cell2[2][3]=createCell(“比例”,1,3);
cell2[2][4]=createCell(“学分”,1,3);
cell2[2][5]=createCell(“比例”,1,3);
cell2[2][6]=createCell(” “,1,5);

        for(int i=0;i<20;i++){
            for(int j=0;j<10;j++){
                if(cell2[i][j]!=null){
                    table2.addCell(cell2[i][j]);
                }
            }
        }

        table2.setWidthPercentage(60); //设置表格宽度(百分比)
        table2.setHorizontalAlignment(0);//设置表格居左
        table.setSpacingAfter(15f);  //设置表格后间距
        document.add(table2);
        /**
 * 创建一个单元格的cell
 * @param cellName
 * @return
 * @throws DocumentException
 * @throws IOException
 */
public PdfPCell createCell(String cellName) throws DocumentException, IOException{
    BaseFont title1 = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
    // 设置字体
    Font mainFont = new Font(title1,7,Font.NORMAL);
    float f = 0.5f;
    float lineHeight = 18f;
    PdfPCell cell = new PdfPCell(new Phrase(cellName, mainFont));
    cell.setUseBorderPadding(true);
    cell.setBorderWidth(f);
    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
    return cell;
}
/**
 * 创建占据多个单元格的cell
 * @param cellName
 * @param row
 * @param col
 * @return
 * @throws DocumentException
 * @throws IOException
 */
public PdfPCell createCell(String cellName,Integer row,Integer col) throws DocumentException, IOException{
    BaseFont title1 = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
    Font titleFont = new Font(title1, 25, Font.NORMAL);
    // 设置字体
    Font mainFont = new Font(title1,7, Font.NORMAL);
    float f = 0.5f;
    float lineHeight = 18f;
    PdfPCell cell = new PdfPCell(new Phrase(cellName, mainFont));
    cell.setUseBorderPadding(true);
    cell.setBorderWidth(f);
    cell.setHorizontalAlignment(Element.ALIGN_CENTER);//设置左右居中
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//设置上下居中
    //设置cell占据的行列数
    if(row!=null){
        cell.setRowspan(row);//设置cell占据行数
    }
    if(col!=null){
        cell.setColspan(col);//设置cell占据列数
    }
    return cell;
}

常用方法

        table.setWidthPercentage(100);      //表格宽度定义100%
        table.setSpacingAfter(15f);         //设置表格后间距

复杂表格生成的代码示例

// 标题字体
        BaseFont title1 = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
        Font titleFont = new Font(title1, 25, Font.NORMAL);
        // 设置字体
        Font mainFont = new Font(title1, 10, Font.NORMAL);
        float f = 0.5f;
        Document doc = null;
        float lineHeight = 18f;
        PdfPCell[][] cell = new PdfPCell[100][20];
        //int colNum = 1;
        //int rowNum = 1;

        doc = new Document(PageSize.A3);//设置文档大小为A3纸
        //PdfWriter.getInstance(doc, new FileOutputStream("test1.pdf"));
        response.setHeader("Content-disposition", "attachment; filename=jx.pdf");
        response.setContentType("application/pdf");
        PdfWriter.getInstance(doc, response.getOutputStream());
        doc.open();
        Paragraph p1 = new Paragraph("教学计划表\n\n", titleFont);
        p1.setAlignment(1);
        doc.add(p1);
        /**
         * 插入表格
         */

        /**
         * 第一行
         */
        PdfPTable table = new PdfPTable(53);
        //表格宽度100%
        table.setWidthPercentage(100); 
        PdfPCell cell1 = createCell("铁道机车专业教学计划表",1,53);
        table.addCell(cell1);

        /**
         * 第二行
         */
        /*PdfPCell cell2_1 = createCell("月");
        table.addCell(cell2_1);
        String [] mouthList={"九月","十月","十一月","十二月","一月","二月","三月","四月","五月","六月","七月","八月"};
        Integer [] mouthLegth={5,4,4,4,5,4,4,4,5,4,5,4};
        for(int i=0;i<mouthList.length;i++){
            PdfPCell celltemp = createCell(mouthList[i],1,mouthLegth[i]);
            table.addCell(celltemp);
        }*/

        PdfPCell cell2_1 = createCell("学期",1,1);
        PdfPCell cell2_2 = createCell("上学期",1,26);
        PdfPCell cell2_3 = createCell("下学期",1,26);
        table.addCell(cell2_1);
        table.addCell(cell2_2);
        table.addCell(cell2_3);

        PdfPCell cell3_1 = createCell("周");
        table.addCell(cell3_1);
        for(int i=0;i<52;i++){
            int j;
            if(i<=25)
                j=i+1;
            else
                j=i-25;

            PdfPCell celltemp = createCell(String.valueOf(j));
            table.addCell(celltemp);
        }

        /**
         * 第四,五,六行
         */
        String[] hanzi={"一","二","三","四"};
        for(int i=0;i<3;i++){
            PdfPCell temp = createCell(hanzi[i]);
            table.addCell(temp);
            for(int j=0;j<52;j++){
                PdfPCell celltemp = createCell("上课");
                table.addCell(celltemp);
            }
        }
        /**
         * 第七行
         */
        PdfPCell cell7_1 = new PdfPCell(new Phrase("军训:JX  军训:JX 军训:JX  军训:JX  军训:JX  军训:JX  军训:JX  军训:JX  军训:JX \n  军训:JX  军训:JX  军训:JX  军训:JX  军训:JX  ",mainFont));
        cell7_1.setRowspan(10);
        cell7_1.setColspan(53);

        table.addCell(cell7_1);

        /**
         * 第八行
         */
        PdfPCell [] pdfPCells=new PdfPCell[18];

        pdfPCells [0]=createCell("序号",1,2);
        pdfPCells [1]=createCell("课程模块",1,5);
        pdfPCells [2]=createCell("课程代码",1,3);
        pdfPCells [3]=createCell("课程名称",1,15);
        pdfPCells [4]=createCell("核心课程",1,3);
        pdfPCells [5]=createCell("学分",1,3);
        pdfPCells [6]=createCell("总学时",1,3);
        pdfPCells [7]=createCell("理论",1,2);
        pdfPCells [8]=createCell("实践",1,2);
        pdfPCells [9]=createCell("一");
        pdfPCells [10]=createCell("二");
        pdfPCells [11]=createCell("三");
        pdfPCells [12]=createCell("四");
        pdfPCells [13]=createCell("五");
        pdfPCells [14]=createCell("六");
        pdfPCells [15]=createCell("上课周数",1,3);
        pdfPCells [16]=createCell("开课部门",1,3);
        pdfPCells [17]=createCell("备注",1,4);

        for(int i=0;i<18;i++){
            table.addCell(pdfPCells[i]);
        }

        //公共基础课模拟数据
        List<Map<String,Object>> ggjck=new ArrayList<Map<String,Object>>();
        for(int i=0;i<5;i++){
            Map<String,Object> km=new HashMap<String,Object>();
            km.put("kcdm","10001");
            km.put("kcmc","雪中悍刀行");
            km.put("hxkc","是");
            km.put("xf","3.0");
            km.put("zxs","30");
            km.put("ll","理论");
            km.put("sj","实践");
            km.put("yi","1");
            km.put("er","2");
            km.put("san","3");
            km.put("si","4");
            km.put("wu","5");
            km.put("liu","6");
            km.put("skzs","10/13");
            km.put("kkbm","理学院");
            km.put("bz","重要课程");
            ggjck.add(km);
        }

        //专业基础课模拟数据
        List<Map<String,Object>> zyjck=new ArrayList<Map<String,Object>>();
        for(int i=0;i<5;i++){
            Map<String,Object> km=new HashMap<String,Object>();
            km.put("kcdm","10001");
            km.put("kcmc","锦衣夜行");
            km.put("hxkc","是");
            km.put("xf","3.0");
            km.put("zxs","30");
            km.put("ll","理论");
            km.put("sj","实践");
            km.put("yi","1");
            km.put("er","2");
            km.put("san","3");
            km.put("si","4");
            km.put("wu","5");
            km.put("liu","6");
            km.put("skzs","10/13");
            km.put("kkbm","文学院");
            km.put("bz","重要课程");
            zyjck.add(km);
        }

        //公共选修课模拟数据
        List<Map<String,Object>> ggxxk=new ArrayList<Map<String,Object>>();
        for(int i=0;i<5;i++){
            Map<String,Object> km=new HashMap<String,Object>();
            km.put("kcdm","10001");
            km.put("kcmc","回到明朝当王爷");
            km.put("hxkc","是");
            km.put("xf","3.0");
            km.put("zxs","30");
            km.put("ll","理论");
            km.put("sj","实践");
            km.put("yi","1");
            km.put("er","2");
            km.put("san","3");
            km.put("si","4");
            km.put("wu","5");
            km.put("liu","6");
            km.put("skzs","10/13");
            km.put("kkbm","文学院");
            km.put("bz","重要课程");
            ggxxk.add(km);
        }

        //专业选修课模拟数据
        List<Map<String,Object>> zyxxk=new ArrayList<Map<String,Object>>();
        for(int i=0;i<5;i++){
            Map<String,Object> km=new HashMap<String,Object>();
            km.put("kcdm","10001");
            km.put("kcmc","诛仙");
            km.put("hxkc","是");
            km.put("xf","3.0");
            km.put("zxs","30");
            km.put("ll","理论");
            km.put("sj","实践");
            km.put("yi","1");
            km.put("er","2");
            km.put("san","3");
            km.put("si","4");
            km.put("wu","5");
            km.put("liu","6");
            km.put("skzs","10/13");
            km.put("kkbm","文学院");
            km.put("bz","重要课程");
            zyxxk.add(km);
        }

        //模拟小计
        Map<String,Object> xjMap=new HashMap<String,Object>();
        xjMap.put("xf", 55);
        xjMap.put("zxs",562);
        xjMap.put("ll",349);
        xjMap.put("sj",213);

        //第二级模块
        Map<String,Object >secondLevelModule1=new HashMap<String,Object>();
        secondLevelModule1.put("xj",xjMap);
        secondLevelModule1.put("courseList", ggjck);

        Map<String,Object >secondLevelModule2=new HashMap<String,Object>();
        secondLevelModule2.put("xj",xjMap);
        secondLevelModule2.put("courseList", zyjck);

        Map<String,Object >secondLevelModule3=new HashMap<String,Object>();
        secondLevelModule3.put("xj",xjMap);
        secondLevelModule3.put("courseList", ggxxk);

        Map<String,Object >secondLevelModule4=new HashMap<String,Object>();
        secondLevelModule4.put("xj",xjMap);
        secondLevelModule4.put("courseList", zyxxk);


        //第一级模块
        Map<String,Object> moduleMap1=new HashMap<String,Object>();
        moduleMap1.put("secondModuleName","公共基础课程");
        moduleMap1.put("moduleInfo",secondLevelModule1);

        Map<String,Object> moduleMap2=new HashMap<String,Object>();
        moduleMap2.put("secondModuleName","专业基础课程");
        moduleMap2.put("moduleInfo",secondLevelModule2);

        Map<String,Object> moduleMap3=new HashMap<String,Object>();
        moduleMap3.put("secondModuleName","公共选修课程");
        moduleMap3.put("moduleInfo",secondLevelModule3);

        Map<String,Object> moduleMap4=new HashMap<String,Object>();
        moduleMap4.put("secondModuleName","专业选修课程");
        moduleMap4.put("moduleInfo",secondLevelModule4);

        Map<String,Object> firstLevelModule1=new HashMap<String,Object>();
        List<Map<String,Object>> secondLevelList1=new ArrayList<Map<String,Object>>();
        secondLevelList1.add(moduleMap1);
        secondLevelList1.add(moduleMap2);
        firstLevelModule1.put("firstModuleName","必修课");
        firstLevelModule1.put("secondLevelModuleList",secondLevelList1);

        Map<String,Object> firstLevelModule2=new HashMap<String,Object>();
        List<Map<String,Object>> secondLevelList2=new ArrayList<Map<String,Object>>();
        secondLevelList2.add(moduleMap3);
        secondLevelList2.add(moduleMap4);
        firstLevelModule2.put("firstModuleName","选修课");
        firstLevelModule2.put("secondLevelModuleList",secondLevelList2);

        List<Map<String,Object>> moduleList=new ArrayList<Map<String,Object>>();
        moduleList.add(firstLevelModule1);
        moduleList.add(firstLevelModule2);

        Map<String,Object> finallyModuleMap=new HashMap<String, Object>();
        finallyModuleMap.put("moduleList", moduleList);

        //System.out.println(finallyModuleMap.toString());
        Object object = JSONObject.toJSON(finallyModuleMap);
        System.out.println(object.toString());

        //尝试循环加入数据
        //得到一级模块的行数
        int firstModuleNum=moduleList.size();//一级模块个数
        int [] firstModuleRow=new int [10];//一级模块所占行数数组

        int secondModuleNum=0;//二级模块个数
        int [][]secondModuleRow=new int[10][10];//二级模块所占行数

        for(int i=0;i<moduleList.size();i++){
            int firstModuleRowTemp=0;
            for(int j=0;j<((ArrayList)moduleList.get(i).get("secondLevelModuleList")).size();j++){
                secondModuleNum++;//二级模块+1

                Map tempMap = (HashMap)(((ArrayList)moduleList.get(i).get("secondLevelModuleList")).get(j));//
                int secondModuleRowTemp=((ArrayList)(((HashMap)(tempMap.get("moduleInfo"))).get("courseList"))).size();
                secondModuleRow[i][j]=secondModuleRowTemp+1;   //得到二级模块所占行数

                firstModuleRowTemp+=(secondModuleRowTemp+1);  //一级模块所占行数为二级模块之和
            }
            firstModuleRow[i]=firstModuleRowTemp;
        }

        System.out.println("firstModuleNum   "+firstModuleNum);
        System.out.println("secondModuleNum  "+secondModuleNum);
        System.out.println(firstModuleRow[0]+"   "+firstModuleRow[1]);
        System.out.println(secondModuleRow[0][0]+"   "+secondModuleRow[0][1]+"   "+secondModuleRow[1][0]+"   "+secondModuleRow[1][1]);



        //生成cell数组
        int rowNum=9;//开始行数
        int colNum=1;//开始列数
        int addRowNum=0;//循环增加的行数
        for(int i=0;i<moduleList.size();i++){  //循环一级模块
            //cell[rowNum][1] =createCell(String.valueOf(colNum));//序号cell
            String firstModuleName=moduleList.get(i).get("firstModuleName").toString();//一级模块名称
            cell[rowNum+addRowNum][2]=createCell(firstModuleName,firstModuleRow[i],2);//一级模块名称cell

            List<Map<String,Object>> secondLevelModuleListTemp=new ArrayList<Map<String,Object>>(); //二级模块
            secondLevelModuleListTemp=(ArrayList)(((HashMap)moduleList.get(i)).get("secondLevelModuleList"));

            for(int j=0;j<secondLevelModuleListTemp.size();j++){   //循环二级模块
                Map<String,Object> secondLevelModuleMapTemp=secondLevelModuleListTemp.get(j); 
                String secondModuleName=secondLevelModuleMapTemp.get("secondModuleName").toString(); //二级模块名称
                cell[rowNum+addRowNum][3]=createCell(secondModuleName,secondModuleRow[i][j],3);//二级模块名称cell

                List<Map<String,Object>> courseListTemp=new ArrayList<Map<String,Object>>(); //课程列表
                Map<String,Object> xjTemp=new HashMap<String,Object>(); //小结

                courseListTemp=(ArrayList)(((HashMap)secondLevelModuleMapTemp.get("moduleInfo")).get("courseList"));
                xjTemp=(HashMap)(((HashMap)secondLevelModuleMapTemp.get("moduleInfo")).get("xj"));

                for(int k=0;k<=courseListTemp.size();k++){  //循环课程信息和小结信息
                    if(k<courseListTemp.size()){  //循环课程信息
                        Map<String,Object> courseMap=new HashMap<String, Object>();  //单一课程具体信息
                        courseMap=courseListTemp.get(k);

                        cell[rowNum+addRowNum][1] =createCell(String.valueOf(k+1),1,2);//序号cell
                        cell[rowNum+addRowNum][4] =createCell(courseMap.get("kcdm").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][5] =createCell(courseMap.get("kcmc").toString(),1,15);//课程代码cell
                        cell[rowNum+addRowNum][6] =createCell(courseMap.get("hxkc").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][7] =createCell(courseMap.get("xf").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][8] =createCell(courseMap.get("zxs").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][9] =createCell(courseMap.get("ll").toString(),1,2);//课程代码cell
                        cell[rowNum+addRowNum][10] =createCell(courseMap.get("sj").toString(),1,2);//课程代码cell
                        cell[rowNum+addRowNum][11] =createCell(courseMap.get("yi").toString());//课程代码cell
                        cell[rowNum+addRowNum][12] =createCell(courseMap.get("er").toString());//课程代码cell
                        cell[rowNum+addRowNum][13] =createCell(courseMap.get("san").toString());//课程代码cell
                        cell[rowNum+addRowNum][14] =createCell(courseMap.get("si").toString());//课程代码cell
                        cell[rowNum+addRowNum][15] =createCell(courseMap.get("wu").toString());//课程代码cell
                        cell[rowNum+addRowNum][16] =createCell(courseMap.get("liu").toString());//课程代码cell
                        cell[rowNum+addRowNum][17] =createCell(courseMap.get("skzs").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][18] =createCell(courseMap.get("kkbm").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][19] =createCell(courseMap.get("bz").toString(),1,4);//课程代码cell

                        addRowNum++;//行数计数器增加
                    }else if(k==courseListTemp.size()){//增加小结信息

                        cell[rowNum+addRowNum][1] =createCell(" ",1,2);//序号cell
                        cell[rowNum+addRowNum][4] =createCell(" ",1,3);//课程代码cell
                        cell[rowNum+addRowNum][5] =createCell("小结",1,15);//课程代码cell
                        cell[rowNum+addRowNum][6] =createCell("是",1,3);//课程代码cell
                        cell[rowNum+addRowNum][7] =createCell(xjTemp.get("xf").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][8] =createCell(xjTemp.get("zxs").toString(),1,3);//课程代码cell
                        cell[rowNum+addRowNum][9] =createCell(xjTemp.get("ll").toString(),1,2);//课程代码cell
                        cell[rowNum+addRowNum][10] =createCell(xjTemp.get("sj").toString(),1,2);//课程代码cell
                        cell[rowNum+addRowNum][11] =createCell(" ");//课程代码cell
                        cell[rowNum+addRowNum][12] =createCell(" ");//课程代码cell
                        cell[rowNum+addRowNum][13] =createCell(" ");//课程代码cell
                        cell[rowNum+addRowNum][14] =createCell(" ");//课程代码cell
                        cell[rowNum+addRowNum][15] =createCell(" ");//课程代码cell
                        cell[rowNum+addRowNum][16] =createCell(" ");//课程代码cell
                        cell[rowNum+addRowNum][17] =createCell(" ",1,3);//课程代码cell
                        cell[rowNum+addRowNum][18] =createCell(" ",1,3);//课程代码cell
                        cell[rowNum+addRowNum][19] =createCell(" ",1,4);//课程代码cell
                        addRowNum++;//行数计数器增加
                    }

                }



            }
        }

        //table循环加入cell
        for(int i=0;i<100;i++){
            for(int j=0;j<20;j++){
                if(cell[i][j]!=null){ //当cell不为空的时候进行添加
                    table.addCell(cell[i][j]);
                }
            }
        }
        doc.add(table);

生成table样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值