首页 > 编程语言 >JAVA生成行程单PDF

JAVA生成行程单PDF

时间:2023-04-13 22:39:08浏览次数:43  
标签:JAVA String 行程 new cell param table PDF public

JAVA生成行程单PDF

一、pom依赖

首先引入PDF需要的pom依赖

         <!-- pdf-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
            <optional>true</optional>
        </dependency>

二、PDF操作工具类及行程单实体类

创建PDF操作工具类及行程单实体类,调用 PDFUtil.createPDFFile()方法创建行程单。

 /**
 * PDF操作工具类
 */
public class PDFUtil {
    private static Logger logger = LoggerFactory.getLogger(PDFUtil.class);
    public static final String PDF_FILE_SUFFIX = ".pdf";
    public static Font headFont;
    public static Font keyFont;
    // 标题
    public static Font titleFont;
    // 设置字体大小
    public static Font textFont;
    public static final int MAX_WIDTH = 520;
    static {
        //中文格式
        BaseFont bfChinese;
        try {
            // 设置中文显示
            bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            headFont = new Font(bfChinese, 10, java.awt.Font.BOLD);
            keyFont = new Font(bfChinese, 8, java.awt.Font.BOLD);
            textFont = new Font(bfChinese, 8, Font.NORMAL);
            titleFont = new Font(bfChinese, 16, Font.NORMAL);
        } catch (Exception e) {
            logger.error("创建pdf格式失败,异常={}", e);
            throw new RuntimeException(e);
        }
    }
    /**
     * 为表格添加一个内容
     *
     * @param value 值
     * @param font  字体
     * @param align 对齐方式
     * @return 添加的文本框
     */
    public static PdfPCell createCell(String value, Font font, int align) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        font.setColor(BaseColor.WHITE);
        cell.setPhrase(new Phrase(value, font));
        cell.setBackgroundColor(BaseColor.GRAY);
        return cell;
    }
    /**
     * 为表格添加一个内容
     *
     * @param value 值
     * @param font  字体
     * @return 添加的文本框
     */
    public static PdfPCell createCell(String value, Font font) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 为表格添加一个内容
     *
     * @param value   值
     * @param font    字体
     * @param align   对齐方式
     * @param colspan 占多少列
     * @return 添加的文本框
     */
    public static PdfPCell createCell(String value, Font font, int align, int colspan) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 为表格添加一个内容
     *
     * @param value     值
     * @param font      字体
     * @param align     对齐方式
     * @param colspan   占多少列
     * @param boderFlag 是否有有边框
     * @return 添加的文本框
     */
    public static PdfPCell createCell(String value, Font font, int align, int colspan,
                                      boolean boderFlag) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);
        cell.setPhrase(new Phrase(value, font));
        cell.setPadding(3.0f);
        if (!boderFlag) {
            cell.setBorder(0);
            cell.setPaddingTop(4.0f);
            cell.setPaddingBottom(8.0f);
        }
        return cell;
    }
    /**
     * 创建一个表格对象
     *
     * @param colNumber 表格的列数
     * @return 生成的表格对象
     */
    public static PdfPTable createTable(int colNumber) {
        PdfPTable table = new PdfPTable(colNumber);
        table.setTotalWidth(MAX_WIDTH);
        table.setLockedWidth(true);
        table.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.getDefaultCell().setBorder(1);
        return table;
    }
    public PdfPTable createTable(float[] widths) {
        PdfPTable table = new PdfPTable(widths);
        try {
            table.setTotalWidth(MAX_WIDTH);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }
    public static PdfPTable createBlankTable() {
        PdfPTable table = new PdfPTable(1);
        table.getDefaultCell().setBorder(0);
        table.addCell(createCell("", keyFont));
        table.setSpacingAfter(20.0f);
        table.setSpacingBefore(20.0f);
        return table;
    }
    /**
     * 提供外界调用的接口,生成以head为表头,list为数据的pdf
     *
     * @param fileName  文件名
     * @param titleName 表单名
     * @param headName  数据表头
     * @param headField 对应类的属性名
     * @param list      数据
     */
    public static <T> File generatePDFs(String fileName, String titleName, String[] headName, String[] headField,
                                        List<T> list) {
        // 建立一个Document对象
        Document document = new Document();
        // 设置页面大小
        document.setPageSize(PageSize.A4);
        File tempFile = null;
        try {
            tempFile = File.createTempFile(fileName, PDF_FILE_SUFFIX);
            PdfWriter.getInstance(document, new FileOutputStream(tempFile));
            document.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Class classType = list.get(0).getClass();
        int colNum = headName.length;
        PdfPTable table = createTable(colNum);
        // 添加标题
        table.addCell(createCell(titleName, titleFont, Element.ALIGN_CENTER, colNum, false));
        //设置表头
        for (int i = 0; i < colNum; i++) {
            table.addCell(createCell(headName[i], keyFont, Element.ALIGN_CENTER));
        }
        for (int i = 0; i < list.size(); i++) {
            T t = list.get(i);
            for (int j = 0; j < colNum; j++) {
                //获得get方法,getName,getAge等
                String getMethodName = "get" + headField[j].substring(0, 1).toUpperCase() + headField[j].substring(1);
                try {
                    //通过反射获得相应的get方法,用于获得相应的属性值
                    Method method = classType.getMethod(getMethodName, new Class[]{});
                    logger.debug(getMethodName + ":" + method.invoke(t, new Class[]{}) + ",");
                    //添加数据
                    table.addCell(createCell(method.invoke(t, new Class[]{}).toString(), textFont));
                } catch (Exception e) {
                    logger.error("属性设值错误:入参={},异常={}", JSON.toJSONString(t), e);
                    throw new RuntimeException(e);
                }
            }
        }
        try {
            //将表格添加到文档中
            document.add(table);
        } catch (Exception e) {
            logger.error("");
            throw new RuntimeException(e);
        }
        //关闭流
        document.close();
        return tempFile;
    }
    /**
     * 构建行程单PDF文件
     * @param date 构建日期
     * @param phone 手机号
     * @param baseTripInfos 行程信息
     * @param outputStream 输出流
     */
    public static void createPDFFile(Date date, String phone, List<BaseTripInfo> baseTripInfos, OutputStream outputStream) {
        String[] header = new String[]{"序号", "出站时间", "入站站点", "出站站点", "金额(元)"};
        int[] width = new int[]{20, 45, 35, 35, 35};
        Document document = null;
        try {
            // 建立一个Document对象
            document = new Document();
            // 设置页面大小
            document.setPageSize(PageSize.A4);
            PdfWriter.getInstance(document, outputStream);
            document.open();
            // 设置列以及列宽度
            PdfPTable table = PDFUtil.createTable(header.length);
            table.setWidths(width);
            // 添加标题以及空行
            table.addCell(PDFUtil.createCell("广州地铁—行程单", PDFUtil.titleFont, Element.ALIGN_CENTER, header.length, false));
            table.addCell(PDFUtil.createCell(" ", PDFUtil.titleFont, Element.ALIGN_CENTER, header.length, false));
            // 设置申请日期以及行程起止日期
            table.addCell(PDFUtil.createCell("申请时间:" + cn.hutool.core.date.DateUtil.format(date, "yyyy-MM-dd"), PDFUtil.textFont, Element.ALIGN_LEFT, 2, false));
            table.addCell(PDFUtil.createCell("行程人手机号:" + phone, PDFUtil.textFont, Element.ALIGN_LEFT, 2, false));
            // 计算该行程单总金额
            double totalAmount = 0;
            for (BaseTripInfo baseTripInfo : baseTripInfos) {
                totalAmount += Double.parseDouble(baseTripInfo.getPrice());
            }
            table.addCell(PDFUtil.createCell("共" + baseTripInfos.size() + "笔行程, 合计 " + NumberUtil.round(totalAmount, 2).toString() + "元",
                    PDFUtil.textFont, Element.ALIGN_LEFT, header.length, false));
            // 设置表头
            for (String headName : header) {
                table.addCell(PDFUtil.createCell(headName, PDFUtil.keyFont, Element.ALIGN_CENTER));
            }
            for (int i = 0; i < baseTripInfos.size(); i++) {
                // 序号
                table.addCell(createTextCell(String.valueOf(i + 1)));
                // 出站时间
                table.addCell(createTextCell(baseTripInfos.get(i).getExitDate() == null ? "" :
                        baseTripInfos.get(i).getExitDate()));
                // 进站站点
                table.addCell(createTextCell(baseTripInfos.get(i).getEnterStation() == null ? "" :
                        baseTripInfos.get(i).getEnterStation()));
                // 出站站点
                table.addCell(createTextCell(baseTripInfos.get(i).getExitStation() == null ? "" :
                        baseTripInfos.get(i).getExitStation()));
                // 扣费金额
                double price = Double.parseDouble(baseTripInfos.get(i).getPrice());
                table.addCell(createTextCell(NumberUtil.round(price, 2).toString()));
            }
            //将表格添加到文档中
            document.add(table);
        } catch (DocumentException e) {
            logger.error("Document添加PdfWriter实例失败", e);
        } finally {
            //关闭流
            if (document != null) {
                document.close();
            }
        }
    }
    private static PdfPCell createTextCell(String value) {
        return PDFUtil.createCell(value, PDFUtil.textFont);
    }
}



/**
 * 行程单信息
 */
public class BaseTripInfo {
    /**
     * 行程ID
     */
    private String tripId;
    /**
     * 入站站点
     */
    private String enterStation;
    /**
     * 入站时间
     */
    private String enterDate;
    /**
     * 出站站点
     */
    private String exitStation;
    /**
     * 出站时间
     */
    private String exitDate;
    /**
     * 金额
     */
    private String price;
    /**
     * 设备ID
     */
    private String deviceId;
    public String getTripId() {
        return tripId;
    }
    public void setTripId(String tripId) {
        this.tripId = tripId;
    }
    public String getEnterStation() {
        return enterStation;
    }
    public void setEnterStation(String enterStation) {
        this.enterStation = enterStation;
    }
    public String getEnterDate() {
        return enterDate;
    }
    public void setEnterDate(String enterDate) {
        this.enterDate = enterDate;
    }
    public String getExitStation() {
        return exitStation;
    }
    public void setExitStation(String exitStation) {
        this.exitStation = exitStation;
    }
    public String getExitDate() {
        return exitDate;
    }
    public void setExitDate(String exitDate) {
        this.exitDate = exitDate;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getDeviceId() {
        return deviceId;
    }
    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId;
    }
    @Override
    public String toString() {
        return "BaseTripInfo{" +
                "tripId='" + tripId + '\'' +
                ", enterStation='" + enterStation + '\'' +
                ", enterDate='" + enterDate + '\'' +
                ", exitStation='" + exitStation + '\'' +
                ", exitDate='" + exitDate + '\'' +
                ", price='" + price + '\'' +
                ", deviceId='" + deviceId + '\'' +
                '}';
    }
}

标签:JAVA,String,行程,new,cell,param,table,PDF,public
From: https://blog.51cto.com/u_12052810/6188442

相关文章

  • java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容
    长字符串起因项目里面有一长串的加密字符串(最长的万多个字符),需要拼接作为参数发送给第三方。如果我们使用枚举定义的话,idea编译的时候就会出现编译报错Error:java:常量字符串过长解决想法网上还有一个说法,说是编译器问题,修改idea工具的编译为eclipse即可......
  • JavaScript 变量、标识符和四则运算
    JavaScript基础第二天变量什么是变量?变量由四个部分组成:1.var:声明变量的关键字2.变量名字1.变量的名字可以包含:字母,数字2.不能以数字开头3.不能使用关键字保留字比如var、if、for、列:web、_001、_number3.等于号=在js中它叫做赋值号4.值,赋值号后面的叫做值(变......
  • java捡基础
    ++与--写在前后有什么区别?++或--写在变量前后有区别?*1.如果不参与运算的话,它们是没有区别。*2.如果参与了运算,区别就是很大了。*参与运算时两者的区别:累加的结果要不要参与本次的运算,(使用累加之后值运算,还是使用累加之前的值进行运算......
  • 使用java实现音乐播放
    使用java实现音乐播放的具体代码调用有参构造器,构造器中传入需要播放的音乐路径,文件需要是.wav格式调用start方法播放音乐,设置为从头开始循环播放暂停调用pause方法暂停,暂停保存当前播放进度的毫秒值继续播放调用recommence方法,会读取刚才保存的音乐播放进度的毫秒值调......
  • JAVAWEB-项目搭建准备工作八步骤-2023-04-13
    第一步:生成一个javamavenweb项目第二步:配置TOMCAT第三步:测试项目是否可以跑起来第四步:导入maven各个jar包+增加build解决资源导出问题<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://ww......
  • Java面试题
    面试题面向过程和面向对象的区别面向过程和面向对象的主要区别在于思想方式和实现方法。面向过程重视步骤和函数,通过分解问题并设计函数来解决问题;面向对象则更注重对象和类之间的关系,将程序中的各种元素组织成一个有机整体,在实现上更加灵活和可扩展。同时,面向对象的程序具......
  • java数据类型
    标志符标志符就是类名、方法(函数)名、变(常)量名、包名等的名字。Java规定,标识符是由字母、下划线(“”)或美元符“$”)开头,后面跟0个或多个字母、下划线(“”)、美元符(“$”)或数字组成的符号序列。根据此定义,下列单词都是合法的标识符:icountnumdayScollLock$a789a89J......
  • java -- 线程
    线程与进程进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。线程:是进程中的一个执行单元,负责当前进程中程序的执......
  • Java POI 拆分excel单元格并填充内容
    publicvoidtest(Sheetsheet){intnumMergedRegions=sheet.getNumMergedRegions();for(intz=0;z<numMergedRegions;z++){CellRangeAddressmerge=sheet.getMergedRegion(z);//System.out.println("Numbe......
  • 【Java】wait、await、sleep的区别和联系
     (200条消息)Java之wait、await、sleep的区别和联系_javawait和await区别_wotu__的博客-CSDN博客 一、wait()notify()notifyAll()调用wait()使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程运行时使得这个条件满足时,其他线程会调用notify()或者notifyAll()来唤......