由于时间问题,写的不是很好,但是实现了项目所需的功能,以后有时间会逐渐改进。
一、maven所需要的jar

<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>

<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.13.2</version>
</dependency>

二、实现所需工具类
1.时间工具类

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期工具类
 */
public class DateUtils {

    public static final String SPIT_TAG=",";

    public static Date getDate(String time){
        Date date = new Date(Long.parseLong(time));
        return date;
    }

    public static String getTimeString(Long expiryData){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long currentTimeMillis = System.currentTimeMillis();
        long lastTime=currentTimeMillis-expiryData*3600*24*1000;
        String formatDateTime = sdf.format(new Date(lastTime));
        return formatDateTime;

    }

    public static String getTimeStringByLongTime(Long time){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formatDateTime = sdf.format(time);
        return formatDateTime;
    }

    public static String getTimeStringToDay(Long expiryData){
        SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd");
        String formatDateTime = sdf.format(expiryData);
        return formatDateTime;

    }

}

2.PDF工具
该工具类有个改进的地方就是在合并行和合并列单独分开了,在使用的时候可以直接使用合并行和列即:getRowAndColSpan()方法

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import org.springframework.stereotype.Component;

@Component
public class PDFutil {

    /**
     * 设置标题
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param cols 合并几列
     * @param rows 合并几行
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getTitle(PdfPTable table, Font textFont, String value, Integer cols, Integer rows, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setColspan(cols);
        cell.setRowspan(rows);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.setBorderColor(BaseColor.WHITE);// 设置方向后会失效
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 设置单元格
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getPdfCell(PdfPTable table, Font textFont, String value, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1); // -1:未定义,0:左,1:中,2:右,3:合适的,4:上,5:中,6:下,7:底线
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 合并行(合并行(上下合并)时,设置为垂直居中)
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param rows 合并几行
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getRowSpan(PdfPTable table, Font textFont, String value, Integer rows, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setRowspan(rows);
        if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 合并列(合并列(左右合并)时,设置为水平居中)
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param cols 合并几列
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getColSpan(PdfPTable table, Font textFont, String value, Integer cols, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setColspan(cols);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 合并行和列
     * @param table PTable表格
     * @param textFont 字体样式
     * @param value 添加的内容
     * @param cols 合并几列
     * @param rows 合并几行
     * @param middleType 居中类型 0:不居中, 1:水平居中 2:垂直居中
     * @return PTable表格
     */
    public PdfPTable getRowAndColSpan(PdfPTable table, Font textFont, String value,
                                      Integer cols, Integer rows, Integer middleType){
        PdfPCell cell = new PdfPCell();
        Paragraph p = new Paragraph(value, textFont);
        cell.setColspan(cols);
        cell.setRowspan(rows);
        if(middleType == 1){
            p.setAlignment(1);
            getHorizontalCenter(cell);
        }else if(middleType == 2){
            p.setAlignment(1);
            getVerticalCenter(cell);
        }
        cell.addElement(p);
        table.addCell(cell);
        return table;
    }

    /**
     * 水平居中
     * @param cell PdfPCell单元格
     * @return PdfPCell单元格
     */
    public PdfPCell getHorizontalCenter(PdfPCell cell){
        cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);// 水平居中
        return cell;
    }

    /**
     * 垂直居中
     * @param cell PdfPCell单元格
     * @return PdfPCell单元格
     */
    public PdfPCell getVerticalCenter(PdfPCell cell){
        cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
        cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
        cell.setPaddingTop(-2f);//把字垂直居中
        cell.setPaddingBottom(8f);//把字垂直居中
        return cell;
    }
}

三、Controller类

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.ys.pdf.PdfEvent;
import com.ys.utils.DateUtils;
import com.ys.utils.PDFutil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RequestMapping("/exportPDF")
@Controller
public class CateringManagement {

    @Resource
    private PDFutil pdFutil;

    @GetMapping("/cateringmanagement")
    public void exportPDF(){
        try {
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletResponse response = requestAttributes.getResponse();

            String pdfName = "基本信息("+ DateUtils.getTimeStringToDay(System.currentTimeMillis()) +")";

            // 设置页面编码格式
            response.setContentType("application/vnd.ms-pdf");
            response.setContentType("text/plain;charaset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String((pdfName).getBytes(), "ISO-8859-1") + ".pdf");

            // 1).定义A4纸
            Document document = new Document(PageSize.A4, 48, 48, 60, 65);
            // 2).建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中
            ServletOutputStream os = response.getOutputStream();
            PdfWriter contentWriter = PdfWriter.getInstance(document, os);

            // 创建页面事件
            PdfEvent event = new PdfEvent();
            contentWriter.setPageEvent(event);

            // 3).写入数据之前要打开文档
            document.open();
            // 设置字体
            String fontPath = "E:\\pdf\\simsun.ttf"; // 宋体
            BaseFont bfCN = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            // 正文的字体
            Font headFont = new Font(bfCN, 12f);
            Font textFont = new Font(bfCN, 10f);

            //建立一个17列的表格
            PdfPTable table = new PdfPTable(17);
            table = pdFutil.getTitle(table,headFont,"基本信息",17,2,2);

            table = getFoodInspection(table,textFont);

            table = getDayConsumption(table,textFont);

            table = getFoodAcceptance(table,textFont);
            document.add(table);
            document.close();
            os.close();

        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * @param table PTable表格
     * @param textFont 字体样式
     * @return PTable表格
     */
    private PdfPTable getFoodInspection(PdfPTable table,Font textFont){
        table = pdFutil.getRowSpan(table,textFont,"这里是一部分",7,2);
        table = pdFutil.getPdfCell(table,textFont,"时间",2);
        table = pdFutil.getColSpan(table,textFont,"说明",2,2);
        table = pdFutil.getColSpan(table,textFont,"类型",12,2);
        table = pdFutil.getPdfCell(table,textFont,"签名",2);

        table = pdFutil.getRowSpan(table,textFont,"早",2,2);
        table = pdFutil.getRowAndColSpan(table,textFont," ",2,2,2);
        table = pdFutil.getColSpan(table,textFont," ",12,0);
        table = pdFutil.getPdfCell(table,textFont," ",1);

        table = pdFutil.getColSpan(table,textFont," ",12,0);
        table = pdFutil.getPdfCell(table,textFont," ",1);

        table = pdFutil.getRowSpan(table,textFont,"中",2,2);
        table = pdFutil.getRowAndColSpan(table,textFont," ",2,2,2);
        table = pdFutil.getColSpan(table,textFont," ",12,0);
        table = pdFutil.getPdfCell(table,textFont," ",1);

        table = pdFutil.getColSpan(table,textFont," ",12,0);
        table = pdFutil.getPdfCell(table,textFont," ",1);

        table = pdFutil.getRowSpan(table,textFont,"晚",2,2);
        table = pdFutil.getRowAndColSpan(table,textFont," ",2,2,2);
        table = pdFutil.getColSpan(table,textFont," ",12,0);
        table = pdFutil.getPdfCell(table,textFont," ",1);

        table = pdFutil.getColSpan(table,textFont," ",12,0);
        table = pdFutil.getPdfCell(table,textFont," ",1);
        return table;
    }

    /**
     * @param table PTable表格
     * @param textFont 字体样式
     * @return PTable表格
     */
    private PdfPTable getDayConsumption(PdfPTable table,Font textFont){
        table = pdFutil.getRowSpan(table,textFont,"类型",2,2);
        table = pdFutil.getColSpan(table,textFont,"领导签名",3,1);
        table = pdFutil.getColSpan(table,textFont,"员工签名",13,1);

        String [] titleName = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16"};
        for(int i=0; i<titleName.length; i++){
            table = pdFutil.getPdfCell(table,textFont,titleName[i],1);
        }

        table = pdFutil.getPdfCell(table,textFont,"早",1);
        String [] morning = new String[16];
        for(int i=0; i<morning.length; i++){
            table = pdFutil.getPdfCell(table,textFont," ",1);
        }

        table = pdFutil.getPdfCell(table,textFont,"中",1);
        String [] midday = new String[16];
        for(int i=0; i<midday.length; i++){
            table = pdFutil.getPdfCell(table,textFont," ",1);
        }

        table = pdFutil.getPdfCell(table,textFont,"晚",1);
        String [] evening = new String[16];
        for(int i=0; i<evening.length; i++){
            table = pdFutil.getPdfCell(table,textFont," ",1);
        }

        table = pdFutil.getPdfCell(table,textFont,"100",1);
        String [] total = new String[16];
        for(int i=0; i<total.length; i++){
            table = pdFutil.getPdfCell(table,textFont," ",1);
        }

        table = pdFutil.getColSpan(table,textFont,"1000",4,1);
        String [] average = new String[13];
        for(int i=0; i<average.length; i++){
            table = pdFutil.getPdfCell(table,textFont," ",1);
        }

        return table;
    }

    /**
     * @param table PTable表格
     * @param textFont 字体样式
     * @return PTable表格
     */
    private PdfPTable getFoodAcceptance(PdfPTable table,Font textFont){
        table = pdFutil.getColSpan(table,textFont,"最后一部分",17,1);

        String [] classify = {"1","11","111","1111"};
        table = getLoopAssignment(classify,table,textFont);
        table = pdFutil.getColSpan(table,textFont,"3",3,1);
        table = getLoopAssignment(classify,table,textFont);
        table = pdFutil.getColSpan(table,textFont,"4",4,1);

        for(int i=0; i<7; i++){
            String [] specification = new String[3];
            table = pdFutil.getColSpan(table,textFont," ",2,1);
            table = getFootSpecification(specification,table,textFont);
            table = pdFutil.getColSpan(table,textFont," ",3,1);
            table = pdFutil.getColSpan(table,textFont," ",2,1);
            table = getFootSpecification(specification,table,textFont);
            table = pdFutil.getColSpan(table,textFont," ",4,1);
        }

        return table;
    }

    /**
     * @param classify 标题数组
     * @param table PTable表格
     * @param textFont 字体样式
     * @return PTable表格
     */
    private PdfPTable getLoopAssignment(String [] classify, PdfPTable table,Font textFont){
        for(int i=0; i<classify.length; i++){
            if(classify[i].equals("1")){
                table = pdFutil.getColSpan(table,textFont,"1",2,1);
            }else{
                table = pdFutil.getPdfCell(table,textFont,classify[i],1);
            }
        }
        return table;
    }

    /**
     * @param specification 数据数组
     * @param table PTable表格
     * @param textFont 字体样式
     * @return PTable表格
     */
    private PdfPTable getFootSpecification(String [] specification, PdfPTable table,Font textFont){
        for(int i=0; i<specification.length; i++){
            table = pdFutil.getPdfCell(table,textFont,specification[i],1);
        }
        return table;
    }

}

四、字体

这里使用的字体为宋体,需要从外部引入


五、效果显示

在浏览器请求接口实现下载

javapoi导出pdf java导出pdf工具类_垂直居中


javapoi导出pdf java导出pdf工具类_垂直居中_02


javapoi导出pdf java导出pdf工具类_垂直居中_03