java代码生成pdf表格和内容 前端采用pdf.js进行在线预览读取

1、公司要求生成pdf文件,内容中间需要一个表格,表格要根据数据列表的长度动态变长

直接上代码,需要的复制+百度

引入包

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>


    代码

    /**
     * 生成最终版本的pdf
     * @param newPath       已写入数据的pdf模板路径
     * @param finalPath     最终版本的pdf生成路径
     * @param listNum 
     * @param baselineData2
     */
    public static byte[] generateFinalPdf(List<String[]> list, String[] titleArr,
            float[] widths, List<String[]> listNum,Map<String, Object> params) throws Exception {

        /** 实例化文档对象 */
        Document document = new Document();
        /** 创建 PdfWriter 对象 */
        //创建临时文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        //临时路径
        String path = uuid+".pdf";
        FileOutputStream outputStream = new FileOutputStream(path);
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);// 文件的输出路径+文件的实际名称
        document.open();
        // document.newPage();//新创建一页来存放后面生成的表格
        BaseFont bfCN = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        // 表格的字体
        Font headFont = new Font(bfCN, 11f, Font.BOLD, BaseColor.BLACK);
        Font textFont = new Font(bfCN, 9f, Font.NORMAL, BaseColor.BLACK);
        //正文的字体
        Font headTxtFont = new Font(bfCN, 16f, Font.BOLD, BaseColor.BLACK);//标题
        Font TxtFont = new Font(bfCN, 11f, Font.NORMAL, BaseColor.BLACK);//正文
        
        Font Fwhite = FontFactory.getFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Fwhite.setColor(BaseColor.WHITE);
        
        /** 向文档中添加内容,创建段落对象 */
        Paragraph titleParagraph = new Paragraph();
        Chunk chunk = new Chunk("应收账款转让通知书",headTxtFont);
        titleParagraph.setAlignment(Element.ALIGN_CENTER);
        titleParagraph.add(chunk);
        document.add(titleParagraph);
       
        
        document.add(blankRow31);
        // 建立一个titleArr长度列的表格
        PdfPTable table = new PdfPTable(titleArr.length);

        // 计算'合并列'的合并相关集合
        List<Integer> indexs;
        // 每个'合并列'的初始下标集合
        List<Integer> spanStartIndex;
        // 每个'合并列'的合并数量集合
        List<Integer> spanNumList;
        // 取出'合并列'的所有数据计算
        List<String> ListIn = new ArrayList<>();
        for (String[] aList : list) {
            ListIn.add(aList[1]);
        }
        spanNumList = getSpanNumList(ListIn);
        spanStartIndex = getStartIndexList(ListIn, spanNumList);
        indexs = getIndexs(list, spanNumList, spanStartIndex);

        addTitle(table, titleArr, headFont);

        // 加表格内容
        addContent(table, list, textFont, spanNumList, spanStartIndex, indexs, document);
        PdfContentByte canvas = writer.getDirectContent();
        table.setTotalWidth(1000f);
        table.setWidths(widths);
        /**
         * rowStart 0 起始行 rowEnd -1 表示全部行 xPos 表格横坐标- 从左向右开始计算 yPos 表格纵坐标- 从下向上开始计算
         * canvas 画布
         */
        document.add(table);
        
        //添加总计
        PdfPTable tableNum = new PdfPTable(2);
        addNum(tableNum, listNum, textFont);
        tableNum.setTotalWidth(1000f);
        tableNum.setWidths(new float[] {200,400});
        document.add(tableNum);
        
        document.add(blankRow31);
        
        //添加表格之后内容
        Paragraph bodyParagraph2 = new Paragraph();
        Chunk chunk5 = new Chunk("你的文本",TxtFont);
        bodyParagraph2.setIndentationLeft(50);
        bodyParagraph2.setIndentationRight(50);
        bodyParagraph2.setSpacingAfter(5);  
        bodyParagraph2.setFirstLineIndent(20);
        bodyParagraph2.add(chunk5);
        document.add(bodyParagraph2);
        Paragraph conPerParagraph9 = new Paragraph();
        Chunk Hchunk9 = new Chunk("conssignDate" ,TxtFont);
        conPerParagraph9.setIndentationLeft(320);
        conPerParagraph9.add(Hchunk9);
        document.add(conPerParagraph9);
        
        System.out.println("===============PDF导出成功=============");
        document.close();
        //临时文件转byte数组
        byte[] file2Bytes = File2Byte.file2Bytes(path);
        //删除临时文件
        boolean deleteFile = File2Byte.deleteFile(path);
        return file2Bytes;

    }

//生成表格方法

    private static void addContent(PdfPTable table, List<String[]> list, Font textFont, List<Integer> spanNumList,
            List<Integer> spanStartIndex, List<Integer> indexs, Document document) throws DocumentException {
            // 表格数据内容
           for (int i = 0; i < list.size(); i++) {
               
            String[] str = list.get(i);
            // 第1列
            Paragraph paragraph01 = new Paragraph(str[0], textFont);
            paragraph01.setAlignment(1);
            PdfPCell cell = new PdfPCell();
            cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
            cell.setPaddingTop(-2f);// 把字垂直居中
            cell.setPaddingBottom(8f);// 把字垂直居中
            cell.addElement(paragraph01);
            table.addCell(cell);

          //以此类推进行下一列
        }
    }

    /**
     * 设置恰当位置的setRowSpan属性
     * 
     * @param indexs         不加单元格的索引集合
     * @param spanStartIndex 要加的单元格开始索引集合
     * @param spanNumList    要加的单元格合并的值集合
     * @param table          table
     * @param cell           cell
     * @param i              索引
     */
    private static void setRowsSpan(List<Integer> indexs, List<Integer> spanStartIndex, List<Integer> spanNumList,
            PdfPTable table, PdfPCell cell, int i) {
        if (indexs != null) {
            Boolean isAllNotEqual = true;
            for (Integer index : indexs) {
                if (i == index) {
                    isAllNotEqual = false;
                }
            }

            // 没有不加的下标
            if (isAllNotEqual) {
                // 判断在哪里设置span值
                if (spanStartIndex != null) {
                    Boolean isSpan = false;
                    int copyJ = 0;
                    for (int j = 0; j < spanStartIndex.size(); j++) {
                        if (i == spanStartIndex.get(j)) {
                            isSpan = true;
                            copyJ = j;
                            break;
                        }
                    }
                    if (isSpan) {
                        int spanNum = spanNumList.get(copyJ);
                        cell.setRowspan(spanNum);
                    }
                }
                table.addCell(cell);
            }
        } else {
            table.addCell(cell);
        }
    }

    private static void addTitle(PdfPTable table, String[] titleArr, Font headFont) {
        for (String aTitleArr : titleArr) {
            Paragraph p = new Paragraph(aTitleArr, headFont);
            PdfPCell cell = new PdfPCell();
            p.setAlignment(1);
            cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
            cell.setPaddingTop(-2f);// 把字垂直居中
            cell.setPaddingBottom(8f);// 把字垂直居中
            cell.addElement(p);
            table.addCell(cell);
        }
    }
    private static void addNum(PdfPTable table,List<String[]> list, Font textFont) {
            
         for (int i = 0; i < list.size(); i++) {
               
                String[] str = list.get(i);
                
                if(i == 1) {
                    // 第1列
                    Paragraph paragraph03 = new Paragraph(str[0], textFont);
                    paragraph03.setAlignment(1);
                    PdfPCell cell2 = new PdfPCell();
                    cell2.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
                    cell2.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
                    cell2.setPaddingTop(-2f);// 把字垂直居中
                    cell2.setPaddingBottom(5f);// 把字垂直居中
                    cell2.setFixedHeight(30);
                    cell2.addElement(paragraph03);
                    table.addCell(cell2);
                    // 第2列
                    Paragraph paragraph04 = new Paragraph(str[1], textFont);
                    paragraph04.setAlignment(1);
                    PdfPCell cell3 = new PdfPCell();
                    cell3.setPaddingTop(-2f);// 把字垂直居中
                    cell3.setPaddingBottom(5f);// 把字垂直居中
                    cell2.setFixedHeight(30);
                    cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell3.addElement(paragraph04);
                    table.addCell(cell3);
                }else {
                    // 第1列
                    Paragraph paragraph01 = new Paragraph(str[0], textFont);
                    paragraph01.setAlignment(1);
                    PdfPCell cell = new PdfPCell();
                    cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
                    cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// 然并卵
                    cell.setPaddingTop(-2f);// 把字垂直居中
                    cell.setPaddingBottom(5f);// 把字垂直居中
                    cell.addElement(paragraph01);
                    table.addCell(cell);
                    // 第2列
                    Paragraph paragraph02 = new Paragraph(str[1], textFont);
                    paragraph02.setAlignment(1);
                    PdfPCell cell1 = new PdfPCell();
                    cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
                    cell1.setPaddingTop(-2f);// 把字垂直居中
                    cell1.setPaddingBottom(5f);// 把字垂直居中
                    cell1.addElement(paragraph02);
                    table.addCell(cell1);
                }
         }
    }

    /**
     * 获取某列要合并的单元格数量
     * 
     * @param list
     * @return
     */
    private static List<Integer> getSpanNumList(List<String> list) {

        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        if (list.size() > 0) {
            for (int i = 0; i < list.size(); i = i + 1) {
                map.put(list.get(i), i);
            }
        }

        // 修改对应key值的value
        Set<String> s = map.keySet();// 获取KEY集合
        List<String> strings = new ArrayList<>(s);
        int spanNum = 0;
        for (String string : strings) {
            int tmpSpanNum = map.get(string) - spanNum + 1;
            map.put(string, tmpSpanNum);
            spanNum += tmpSpanNum;
        }

        List<Integer> res = new ArrayList<>();
        for (String string : strings) {
            res.add(map.get(string));
        }
        return res;
    }

    /**
     * 获取某列要合并的单元格初始下标
     * 
     * @param list
     * @param resSpanNumList
     * @return
     */
    private static List<Integer> getStartIndexList(List<String> list, List<Integer> resSpanNumList) {

        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        if (list.size() > 0) {
            for (int i = 0; i < list.size(); i = i + 1) {
                map.put(list.get(i), i);
            }
        }

        Set<String> keys = map.keySet();// 获取KEY集合
        List<String> stringKeys = new ArrayList<>(keys);

        List<Integer> res = new ArrayList<>();
        if (stringKeys.size() == resSpanNumList.size()) {
            for (int i = 0; i < stringKeys.size(); i++) {
                res.add(map.get(stringKeys.get(i)) - resSpanNumList.get(i) + 1);
            }
        }
        return res;
    }

    /**
     * 不加某字段的索引集合
     * 
     * @param list
     * @param resSpanNumList
     * @param resStartIndexList
     * @return
     */
    private static List<Integer> getIndexs(List<String[]> list, List<Integer> resSpanNumList,
            List<Integer> resStartIndexList) {
        List<Integer> indexs = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < resStartIndexList.size(); j++) {
                if (i == resStartIndexList.get(j)) {
                    for (int k = i + 1; k < i + resSpanNumList.get(j); k++) {
                        indexs.add(k);
                    }
                }
            }
        }
        return indexs;
    }
}

 


版权声明:本文为qq_38769513原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。