给pfd文档填写数据,并生成一组表格,添加到最后一页

         之前的pdf填写数据,签名的,又填新需求,要求在最后一页生成一个表格(数据是数据库的数据,查询出来之后生成一个表格并添加到pdf之后)。

       模板添加数据,签名的的东西上一篇已说过,再此不再多说,有需要请看上一篇内容。此篇文章主要说如何生成表格。

       上网搜了一圈,看到一个说是在pdf填好数据后,在新的pdf上,再获取,添加表格,生成最终的pdf。实验一番,此法可行。

我是业务需求,将已写好的数据的pdf转为byte[],你们看自己需要,可换为文件地址。可获取到,就行。

    /**
     * 生成最终版本的pdf
     * @param  a 已写入数据的pdf 的byte[],(可为路径)
     * @param finalPath 最终版本的pdf生成路径
     * @param paramRequest
     * @throws Exception
     */
    private static String     generateFinalPdf2(byte[] a, String finalPath , ParamRequest paramRequest) throws Exception {
        String base64SPdf = "";
        FileOutputStream fos = new FileOutputStream(finalPath);
        //fos.write(fos);
        PdfReader reader = new PdfReader(a);// 读取pdf模板
        Rectangle pageSize = reader.getPageSize(1);
        Document document = new Document(pageSize);
        
        PdfWriter writer = PdfWriter.getInstance(document, fos);
        document.open();
        PdfContentByte cbUnder = writer.getDirectContentUnder();

//pdf共4页,获取第一页,添加到document
        PdfImportedPage pageTemplate = writer.getImportedPage(reader,1);
        cbUnder.addTemplate(pageTemplate, 0, 0);
        document.newPage();

//获取第二页,添加到document
        PdfImportedPage pageTemplate1 = writer.getImportedPage(reader,2);
        cbUnder.addTemplate(pageTemplate1, 0, 0);
        document.newPage();

//获取第三页,添加到document
        PdfImportedPage pageTemplate2 = writer.getImportedPage(reader,3);
        cbUnder.addTemplate(pageTemplate2, 0, 0);
        document.newPage();

//获取第四页,添加到document
        PdfImportedPage pageTemplate3 = writer.getImportedPage(reader,4);
        cbUnder.addTemplate(pageTemplate3, 0, 0);
        

//新创建一页来存放后面生成的表格
        document.newPage();
      
            Paragraph paragraph = generatePdfATATable(paramRequest);//此处为生成的表格及内容方法
            
            document.add(paragraph);
            
        
        document.close();
        reader.close();
    
        
        //以下是将最终的pdf转为 base64
        File pdfFile = new File(finalPath);
        InputStream  is;
        ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
        is = new FileInputStream(pdfFile);
        byte[] b = new byte[is.available()];
        is.read(b);
    
        
        base64SPdf=Base64.encodeBase64String(b);
        is.close();
        bout.close();
        
        return base64SPdf;
    }

    /**
     * 生成pdf表格
     * @return
     * @see
     */
    private static Paragraph generatePdfATATable(ParamRequest paramRequest ) throws Exception {
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font fontChinese = new Font(bfChinese, 10.5F, Font.NORMAL);// 五号
        Paragraph ret = new Paragraph("附表1: 还款计划表(元)", fontChinese);
        PdfPTable tableBox = new PdfPTable(3);
        tableBox.setWidths(new float[] { 0.3f, 0.4f, 0.3f });// 每个单元格占多宽
        tableBox.setWidthPercentage(80f);
       
        // 获取ATA分类的结果集
        List<ParamRequest > ataList = paramRequest .getRepaylist();
        // 创建表格格式及内容
        tableBox.addCell(getCell(new Phrase("还款计划表(元)", fontChinese), false, 3, 1));
        tableBox.addCell(getCell(new Phrase("期数", fontChinese), false, 1, 1));
        tableBox.addCell(getCell(new Phrase("划款时间", fontChinese), false, 1, 1));
        tableBox.addCell(getCell(new Phrase("划款金额", fontChinese), false, 1, 1));
      
            // 遍历查询出的结果
            for (int i=0;i<ataList.size();i++) {
                tableBox.addCell(getCell(new Phrase("第"+(i+1)+"期", fontChinese), false, 1, 1));
                tableBox.addCell(getCell(new Phrase(String.valueOf(ataList.get(i).getRepayDate()), fontChinese), false, 1, 1));
                tableBox.addCell(getCell(new Phrase(String.valueOf(ataList.get(i).getRepayNum()), fontChinese), false, 1, 1));
            }
    
        
        ret.add(tableBox);
        return ret;

    }

 

/*每个cell的格式,合并单元格情况*/

private static PdfPCell getCell(Phrase phrase, boolean yellowFlag, int colSpan, int rowSpan) {
        PdfPCell cells = new PdfPCell(phrase);
        cells.setUseAscender(true);
        cells.setMinimumHeight(20f);
        cells.setHorizontalAlignment(1);
        cells.setVerticalAlignment(5);
        cells.setColspan(colSpan);
        cells.setRowspan(rowSpan);
        cells.setNoWrap(false);
        return cells;
    }

 

最终效果图:

给pfd文档填写数据,并生成一组表格,添加到最后一页