1. 画不多说先上成功后导出的pdf文件

Spring Boot doc文件怎么返回流 springboot返回pdf文件流_导出pdf

     2.maven依赖

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.4</version>
        </dependency>

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

    3.工具类方法,注明一下,由于业务需要,当数据超过一页时,换下一页,头部的模板还是要一样的,所以我以27行为一页切割。

/**
     *
     *  创建周检pdf
     * @param products
     */
    public static void disposeWeekPDF (List<Tool> products, HttpServletResponse response) {
        Document document = new Document(PageSize.A4);
        try {
            //下面字体为windows自带的字体 在linux下可能会失效
            Font font = new Font(BaseFont.createFont("C://Windows//Fonts//simfang.ttf", BaseFont.IDENTITY_H,
                    BaseFont.NOT_EMBEDDED));
//            String filename = "d://erp//aaa.pdf";
//            PdfWriter.getInstance(document, new FileOutputStream(filename));//可为直接本地文件路径
            ByteArrayOutputStream ba = new ByteArrayOutputStream();
            PdfWriter.getInstance(document, response.getOutputStream());
            document.open();

            createWeekPDFTitle(document);
            document.add(Chunk.NEWLINE);
            PdfPTable table = new PdfPTable(7);//生成一个 7列的表格
            createWeekTable(table,font);

            PdfPCell cell;
            int size = 20;
            int count = 1;
            int listSize = products.size();

            for(int i = 0; i< listSize;i++) {
                /**
                 *  一页只有26行数据
                 * 当为同一个部门,并且行数大于27时换一页,相当于每27行换一页
                 * 当为不同部门时,换一页
                 */
                int num = count /27;
                if (num ==1) {

                    //换下一页前必须把表格内容添加到文档中
                    document.add(table);
                    document.add(Chunk.NEWLINE);
                    document.add(new Paragraph("工具室、仪表负责人________                                          鉴定员_________",font));
                    Paragraph date =  new Paragraph("                                                                     年   月   日",font);
                    document.add(date);

                    //换下一页
                    document.newPage();

                    createWeekPDFTitle(document);
                    document.add(Chunk.NEWLINE);
                    table = new PdfPTable(7);//生成一个 7列的表格
                    createWeekTable(table,font);
                    count =1;
                }


                cell = new PdfPCell(new Phrase(Integer.valueOf(i+1).toString(),font));
                cell.setFixedHeight(size); //设置高度
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(products.get(i).getCode(),font));
                cell.setFixedHeight(size);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(products.get(i).getName()+"",font));
                cell.setFixedHeight(size);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(products.get(i).getMeasureRange()+"",font));
                cell.setFixedHeight(size);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(products.get(i).getModel()+"",font));
                cell.setFixedHeight(size);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(products.get(i).getFactoryCode()+"",font));
                cell.setFixedHeight(size);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase(products.get(i).getOriginalCode()+"",font));
                cell.setFixedHeight(size);
                table.addCell(cell);

                count ++;
            }

            //当最后一页,或者第一页数据不足26条时,创建空单元格,补齐
            //需要补齐的数量
            int fillNum = 0;
            if (listSize < 26) {
                fillNum = 26 - listSize-1;
            }else if (listSize > 26) {
                fillNum = listSize % 26 ;
                fillNum = 26 - fillNum - 3;
            }

            if (fillNum > 0) {
                for (int i = 0; i< fillNum;i++) {
                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);

                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);

                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);

                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);

                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);


                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);

                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);

                    cell = new PdfPCell(new Phrase("",font));//产品编号
                    cell.setFixedHeight(size); //设置高度
                    table.addCell(cell);

                }
            }

            System.out.println(listSize);
            System.out.println(fillNum);

            document.add(table);
            document.add(Chunk.NEWLINE);
            document.add(new Paragraph("工具室、仪表负责人________                                          鉴定员_________",font));
            Paragraph date =  new Paragraph("                                                                     年   月   日",font);
            document.add(date);


        }catch (Exception e) {
            e.printStackTrace();
        }  finally {
            document.close();
        }

    }


    /**
     * 生成周检pdf头部内容
     */
    public static void createWeekPDFTitle(Document document ){
        //下面的结果没有生效 中文文字没出来
        try {
            BaseFont bf =  BaseFont.createFont("C://Windows//Fonts//simfang.ttf", BaseFont.IDENTITY_H,
                    BaseFont.NOT_EMBEDDED);

            Font font = new Font(bf);

            //标题字体
            Font titleFont = new Font(bf, 25F, 0);
            document.add(new Paragraph("QR-4.16.1-01-02-211",font));

            Font FontProve = new Font(bf, 15F, 0);
            Paragraph p = new Paragraph("2021 年 9 月 量具仪表周期检定通知单",titleFont);
            p.setAlignment(Element.ALIGN_CENTER);
            document.add(p);

            //定义带下划线字体
            Font underline = new Font(bf, 15, Font.UNDERLINE);
            Chunk chunk = new Chunk("技术部 ");
            chunk.setFont(underline);

            Paragraph officeName = new Paragraph(" ",FontProve);
            officeName.add(chunk);
            officeName.add("你部受控之量具、仪表将到周期检定日期。请接到通知后_____天内将如下量具、仪表送往计量室进行检定为盼。");
            document.add(officeName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 生成周检pdf表格首行文字
     * @param table
     * @param font
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    public static PdfPTable createWeekTable(PdfPTable table,Font font) throws IOException, DocumentException {

        int headerwidths[] = { 10, 10, 10, 10,10, 10, 10}; // percentage
        table.setWidths(headerwidths);
        table.setWidthPercentage(100);
        table.getDefaultCell().setPadding(3);
        table.getDefaultCell().setBorderWidth(3);
        table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

        table.addCell(new PdfPCell(new Phrase("序号",font)));
        table.addCell(new PdfPCell(new Phrase("器具编码",font)));
        table.addCell(new PdfPCell(new Phrase("器具名称",font)));
        table.addCell(new PdfPCell(new Phrase("测量范围",font)));
        table.addCell(new PdfPCell(new Phrase("器具型号",font)));
        table.addCell(new PdfPCell(new Phrase("出厂编号",font)));
        table.addCell(new PdfPCell(new Phrase("原编码",font)));
        return table;
    }

        4.services类方法调用,其中toolList的数据,就是数据库查询出来的,我就不放代码出来了

try{
			// 设置response方式,使执行此controller时候自动出现下载页面,而非直接使用excel打开
			String date = parseDateToStr(YYYY_MM_DD_HH_MM_SS_T,new Date());
			String fileName ="计量器具周检"+ date+".pdf";
			response.setCharacterEncoding("UTF-8");
			response.setContentType("application/pdf");
			//打开浏览器窗口预览文件
			response.setHeader("Content-Disposition","filename=" + new String(fileName.getBytes(), "iso8859-1"));
			//直接下载
			//response.setHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes(), "iso8859-1"));

            ToolPDFUtils.disposeWeekPDF(toolList,response);
		}catch (Exception e){
			e.printStackTrace();
		}

      5.controller方法

/**
	 *  打印 本月计量器具周检
	 * @param tool
	 * @param request
	 * @param response
	 * @param model
	 */
	@ResponseBody
	@RequestMapping(value = "weekTookPrintPDF")
	public void weekTookPrintPDF (Tool tool, HttpServletRequest request, HttpServletResponse response, Model model) {
		 toolService.weekTookPrintPDF(tool, response);

	}

       6.前端js,url为这个controller的路径,触发打印按钮后,浏览器会打开一个新的标签,显示该pdf的文件

window.open(url);

     方法没有引用模板,而是直接生成文件的,网上看了很多都是先引用模板,在往模板里面写数据,考虑到后期不好维护所以直接写代码了。