跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 跨境学堂 > java导出pdf(纯代码实现)

java导出pdf(纯代码实现)

时间:2024-04-09 16:40:25 来源:网络cs 作者:付梓 栏目:跨境学堂 阅读:

标签: 实现 
阅读本书更多章节>>>>

java导出pdf
在项目开发中,产品的需求越来越奇葩啦,开始文件下载都是下载为excel的,做着做着需求竟然变了,要求能导出pdf。导出pdf倒也不是特别大的问题关键就是麻烦。
导出pdf我知道的一共有3中方法:
方法一:利用模板导出,但是首先编辑模板的工具不好找,现有的国外的工具要收费,所以放弃了这个。
方法二:利用HTML页面导出,奈何自己不会写HTML,前端忙没时间帮忙写。本着求人不如靠己的想法就选择了第三种比较麻烦的方法,自己用table画。
方法三:自己用纯代码画格式(可调字体大小,颜色,对复杂没有规则的数据都可以)
首先必须导入的依赖有

<!--导出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>

然后就是一顿代码输出
先把效果贴上
在这里插入图片描述
然后是代码部分

@ApiOperation(value = "导出")    @PostMapping("/download")    @SneakyThrows(Exception.class)    public void download(@RequestBody @Valid FumigationDTO fumigationDTO, HttpServletResponse response, HttpServletRequest request) {        // 防止日志记录获取session异常        request.getSession();        // 设置编码格式        response.setContentType("application/pdf;charset=UTF-8");        response.setCharacterEncoding("utf-8");        String fileName = URLEncoder.encode("下载的PDF名称", "UTF-8");        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf");        fumigationService.download(fumigationDTO, response);    }

业务层

@Override    public void download(FumigationDTO fumigationDTO, HttpServletResponse response) throws IOException {    //要下载的数据查询数据部分我去掉了有需要自己根据业务取        FumigationDowloadVO fumigationDowloadVO = new FumigationDowloadVO();                // 定义全局的字体静态变量        Font titlefont;        Font headfont;        Font keyfont = null;        Font textfont = null;        Font content = null;        // 最大宽度        try {            // 不同字体(这里定义为同一种字体:包含不同字号、不同style)            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);            titlefont = new Font(bfChinese, 16, Font.BOLD);            headfont = new Font(bfChinese, 14, Font.BOLD);            keyfont = new Font(bfChinese, 10, Font.BOLD);            textfont = new Font(bfChinese, 15, Font.NORMAL);            content = new Font(bfChinese, 10, Font.NORMAL);        } catch (Exception e) {            e.printStackTrace();        }        BaseFont bf;        Font font = null;        try {            //创建字体            bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H",                    BaseFont.NOT_EMBEDDED);            //使用字体并给出颜色            font = new Font(bf,20,Font.BOLD,BaseColor.BLACK);        } catch (Exception e) {            e.printStackTrace();        }        Document document = new Document(new RectangleReadOnly(842F, 595F));        //设置页边距  60:左边距,60:右边距,72:上边距,72:下边距        document.setMargins(60, 60, 72, 72);        try {            PdfWriter writer = PdfWriter.getInstance(document,response.getOutputStream());            //添加页码            writer.setPageEvent(new PdfPageUtil());            //打开生成的pdf文件            document.open();            //设置内容            Paragraph paragraph = new Paragraph("熏蒸备案回执",font);            paragraph.setAlignment(1);            //引用字体            document.add(paragraph);            // 设置表格的列宽和列数            float[] widths = {25f,25f,25f,25f,25f,25f};            PdfPTable table = new PdfPTable(widths);            table.setSpacingBefore(20f);            // 设置表格宽度为100%            table.setWidthPercentage(100.0F);            table.setHeaderRows(1);            table.getDefaultCell().setHorizontalAlignment(1);            PdfPCell cell = null;            //第一行            cell = new PdfPCell(new Paragraph("熏蒸备案编码",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            cell.setFixedHeight(30);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getXzbm()));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph("熏蒸备案时间",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString4(fumigationDowloadVO.getSqxzrq())));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph("申请备案单位",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getDwmc(),content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            //第二行            cell = new PdfPCell(new Paragraph("熏蒸作业库点",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            cell.setFixedHeight(30);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getKdmc(),content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph("负责人",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getFzr(),content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph("联系电话",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getFzrdh(),content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            //第三行            cell = new PdfPCell(new Paragraph("单据状态",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            cell.setFixedHeight(30);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(shzt(fumigationDowloadVO.getShzt()),content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph("审核时间",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString5(fumigationDowloadVO.getShsj()),content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(" ",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            cell = new PdfPCell(new Paragraph(" ",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table.addCell(cell);            // 设置表格的列宽和列数            float[] widths2 = {25f,25f,25f,25f,25f,25f};            PdfPTable table2 = new PdfPTable(widths2);            table2.setSpacingBefore(20f);            // 设置表格宽度为100%            table2.setWidthPercentage(100.0F);            table2.setHeaderRows(1);            table2.getDefaultCell().setHorizontalAlignment(1);            //人员列表-第四行            cell = new PdfPCell(new Paragraph("姓名",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            cell.setFixedHeight(20);            table2.addCell(cell);            cell = new PdfPCell(new Paragraph("职务",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table2.addCell(cell);            cell = new PdfPCell(new Paragraph("职业资格",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table2.addCell(cell);            cell = new PdfPCell(new Paragraph("身体状况",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table2.addCell(cell);            cell = new PdfPCell(new Paragraph("熏蒸任务分工",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table2.addCell(cell);            cell = new PdfPCell(new Paragraph("是否外包",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table2.addCell(cell);            //人员列表数据-第五行            if(fumigationDowloadVO.getProples().size() > 0){                for (RecordFumigationPeople prople : fumigationDowloadVO.getProples()) {                    PdfPCell cell1 = new PdfPCell(new Paragraph(prople.getXm(), content));                    PdfPCell cell2 = new PdfPCell(new Paragraph(prople.getZw(), content));                    PdfPCell cell3 = new PdfPCell(new Paragraph(prople.getZyzg(), content));                    PdfPCell cell4 = new PdfPCell(new Paragraph(prople.getStzk(), content));                    PdfPCell cell5 = new PdfPCell(new Paragraph(prople.getXzrwfg(), content));                    PdfPCell cell6 = new PdfPCell(new Paragraph(prople.getSfwb(), content));                    //单元格对齐方式                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell1.setFixedHeight(20);                    //单元格垂直对齐方式                    cell2.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell3.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell4.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell5.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell6.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell6.setVerticalAlignment(Element.ALIGN_MIDDLE);                    table2.addCell(cell1);                    table2.addCell(cell2);                    table2.addCell(cell3);                    table2.addCell(cell4);                    table2.addCell(cell5);                    table2.addCell(cell6);                }            }            // 设置表格的列宽和列数            float[] widths3 = {25f,25f,25f,25f,25f};            PdfPTable table3 = new PdfPTable(widths3);            table3.setSpacingBefore(20f);            // 设置表格宽度为100%            table3.setWidthPercentage(100.0F);            table3.setHeaderRows(1);            table3.getDefaultCell().setHorizontalAlignment(1);            //实施储粮信息            cell = new PdfPCell(new Paragraph("仓房",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            cell.setFixedHeight(20);            table3.addCell(cell);            cell = new PdfPCell(new Paragraph("货位",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table3.addCell(cell);            cell = new PdfPCell(new Paragraph("粮食品种",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table3.addCell(cell);            cell = new PdfPCell(new Paragraph("计划熏蒸开始时间",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table3.addCell(cell);            cell = new PdfPCell(new Paragraph("计划熏蒸结束时间",content));            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell.setHorizontalAlignment(Element.ALIGN_CENTER);            table3.addCell(cell);            if(fumigationDowloadVO.getDtls().size() > 0){                for (RecordFumigationDtlVO dtl : fumigationDowloadVO.getDtls()) {                    PdfPCell cell1 = new PdfPCell(new Paragraph(dtl.getCfmc(), content));                    PdfPCell cell2 = new PdfPCell(new Paragraph(dtl.getHwmc(), content));                    PdfPCell cell3 = new PdfPCell(new Paragraph(dtl.getLspzmc(), content));                    PdfPCell cell4 = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString4(dtl.getJhxzksrq()), content));                    PdfPCell cell5 = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString4(dtl.getJhxzjsrq()), content));                    //设置居中                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell1.setFixedHeight(20);                    cell2.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell3.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell4.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);                    cell5.setHorizontalAlignment(Element.ALIGN_CENTER);                    cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);                    table3.addCell(cell1);                    table3.addCell(cell2);                    table3.addCell(cell3);                    table3.addCell(cell4);                    table3.addCell(cell5);                }            }            document.add(new Paragraph("\n"));            document.add(new Paragraph("▋ 基本信息",content));            document.add(new Paragraph("\n"));            document.add(table);            document.add(new Paragraph("\n"));            document.add(new Paragraph("▋ 基本信息",content));            document.add(new Paragraph("\n"));            document.add(table2);            document.add(new Paragraph("\n"));            document.add(new Paragraph("▋ 熏蒸作业储粮粮情",content));            document.add(new Paragraph("\n"));            document.add(table3);//关闭文档            document.close();        } catch (DocumentException e) {            e.printStackTrace();            log.error("导出pdf失败:{}",e);        }    }

(二)2023-08-24 更新导出PDF无表格

效果:内容全部为代码实现
在这里插入图片描述
贴上代码:

@SneakyThrows    @PostMapping("/rectification/notice/export")    @ApiOperation("xxxx通知导出")    public void registrationNoticeExport(@RequestBody InspectionPlanDtlListDTO reqParam, HttpServletRequest request, HttpServletResponse response) {        request.getSession();        if (StringUtils.isBlank(reqParam.getId())) {            throw new CustomException("id不能为空");        }        String year = String.valueOf(Calendar.getInstance().get(Calendar.YEAR));        ExpertSignInExportVO vo = inspectionProblemService.registrationNoticeExport(reqParam.getId());        if(NoticeCoeEnum.getIdList().contains(vo.getId())){            vo.setDate("2023年08月18日");        }else {            vo.setDate(DateUtil.date().toString(DatePattern.CHINESE_DATE_PATTERN));        }        // 检查单位        List<InspectionPlanUnitVO> planUnitList = inspectionPlanUnitRelationMapper.selectByPlanId(vo.getPlanId());        vo.setInspectionCompany(planUnitList.stream().map(InspectionPlanUnitVO::getUnitName).collect(Collectors.joining("、")));        vo.setYear(year);        Field[] fields = vo.getClass().getDeclaredFields();        HashMap<String, String> dataMap = new HashMap<>(fields.length);        for (Field field : fields) {            field.setAccessible(true);            dataMap.put("${" + field.getName() + "}", String.valueOf(field.get(vo)));        }        if (StringUtils.isNotBlank(vo.getInspectionTeamLeader()) || StringUtils.isNotBlank(vo.getInspectorPhone())) {            dataMap.put("${inspectionTeamLeaderInfo}", String.format("(联系人:%s;联系电话:%s)",                    vo.getInspectionTeamLeader(), StringUtils.isNotBlank(vo.getOfficePhone()) ? vo.getOfficePhone() : vo.getInspectorPhone()));        }        dataMap.put("${attachmentNameStr}", "    " + String.join("\n    ", vo.getAttachmentNameList()));        //导出pdf        PdfUtil.setResponseContentType(response, vo.getInspectedEnterprise() + vo.getPlanName() + "检查整改通知" + year);//        PdfUtil.fillWordTemplate("template/rectification_notice.pdf", dataMap, response);        PdfUtil.downloadPdf(dataMap,response);//            String fileName = vo.getInspectedEnterprise() + vo.getPlanName() + "检查整改通知" + year;//          //导出excel//        WordUtil.setResponseContentType(response, fileName);//        WordUtil.fillWordTemplate("template/rectification_notice.docx", dataMap, response.getOutputStream(),Boolean.TRUE);    }

导出pdf工具

public static void setResponseContentType(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {        response.setContentType("application/pdf");        response.setCharacterEncoding("utf-8");        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8") + ".pdf");        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");    }public static void downloadPdf(Map<String,String> dataMap, HttpServletResponse response){        // 定义全局的字体静态变量        Font titlefont;        Font headfont;        Font keyfont = null;        Font textfont = null;        Font content = null;        Font space = null;        Font space1 = null;        Font space2 = null;        Font space3 = null;        // 最大宽度        try {            // 不同字体(这里定义为同一种字体:包含不同字号、不同style)            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);            titlefont = new Font(bfChinese, 16, Font.BOLD);            headfont = new Font(bfChinese, 14, Font.BOLD);            keyfont = new Font(bfChinese, 22, Font.BOLD);            textfont = new Font(bfChinese, 15, Font.NORMAL);            content = new Font(bfChinese, 16, Font.NORMAL);            space = new Font(bfChinese, 5, Font.NORMAL);            space1 = new Font(bfChinese, 20, Font.NORMAL);            space2 = new Font(bfChinese, 20, Font.NORMAL);            space3 = new Font(bfChinese, 3, Font.NORMAL);        } catch (Exception e) {            e.printStackTrace();        }        BaseFont bf;        Font font = null;        try {            //创建字体            bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H",                    BaseFont.NOT_EMBEDDED);            //使用字体并给出颜色            font = new Font(bf,36,Font.BOLD, BaseColor.RED);        } catch (Exception e) {            e.printStackTrace();        }        Document document = new Document(new Rectangle(com.itextpdf.text.PageSize.A4));        try {            com.itextpdf.text.pdf.PdfWriter.getInstance(document, response.getOutputStream());            //打开PDF文件            document.open();            //设置内容            Paragraph paragraph = new Paragraph("深圳市粮食和物资储备保障中心", font);            //居中设置            paragraph.setAlignment(Element.ALIGN_CENTER);            document.add(paragraph);            //页眉横线            document.add(new Paragraph("\n", space2));            LineSeparator line = new LineSeparator(3f, 100, BaseColor.RED, Element.ALIGN_CENTER, 0f);            document.add(line);            document.add(new Paragraph("\n", space3));            LineSeparator lineStart = new LineSeparator(1f, 100, BaseColor.RED, Element.ALIGN_CENTER, 0f);            document.add(lineStart);            document.add(new Paragraph("\n", space));            String text = "深储整改〔 " + dataMap.get("${year}") + "〕" + dataMap.get("${sort}") + "号";            Paragraph paragraph0 = new Paragraph(text, content);            paragraph0.setAlignment(Element.ALIGN_RIGHT);            document.add(paragraph0);            document.add(new Paragraph("\n"));            Paragraph paragraph1 = new Paragraph(dataMap.get("${inspectionCompany}") + "关于", keyfont);            paragraph1.setAlignment(Element.ALIGN_CENTER);            document.add(paragraph1);            document.add(new Paragraph("\n", space));            String concent = dataMap.get("${planName}") + "发现问题整改的通知";            Paragraph paragraph2 = new Paragraph(concent, keyfont);            paragraph2.setAlignment(Element.ALIGN_CENTER);            document.add(paragraph2);            document.add(new Paragraph("\n"));            Paragraph paragraph3 = new Paragraph(dataMap.get("${qymc}") + ":", content);            paragraph3.setAlignment(Element.ALIGN_LEFT);            document.add(paragraph3);            document.add(new Paragraph("\n", space));            String concent1 = "             现将" + dataMap.get("${kdmc}") + dataMap.get("${planName}")                    + "检查发现问题及整改要求转给你司,请严格按期限要求进行整改,并将整改落实情况(含佐证材料及附件)通过深圳市粮食和物资储备信息管理平台反馈我中心。";            Paragraph paragraph4 = new Paragraph(concent1, content);            //设置首行缩进            paragraph4.setIndentationRight(2);            document.add(paragraph4);            document.add(new Paragraph("\n", space));            Paragraph paragraph5 = new Paragraph("              特此通知。", content);            paragraph5.setIndentationRight(2);//右缩进2格            document.add(paragraph5);            document.add(new Paragraph("\n", space1));            document.add(new Paragraph("\n", space1));            //附件            Paragraph paragraph6 = new Paragraph("              附件:", content);            paragraph6.setIndentationRight(2);//右缩进2格            document.add(paragraph6);            document.add(new Paragraph("\n", space));            Paragraph paragraph7 = new Paragraph(dataMap.get("${attachmentNameStr}"), content);            document.add(paragraph7);            document.add(new Paragraph("\n", space1));            document.add(new Paragraph("\n", space1));            document.add(new Paragraph("\n", space1));            //日期            Paragraph paragraph8 = new Paragraph(dataMap.get("${date}"), content);            //向右            paragraph8.setAlignment(Element.ALIGN_RIGHT);            document.add(paragraph8);            document.add(new Paragraph("\n", space1));            //落款            Paragraph paragraph9 = new Paragraph(dataMap.get("${inspectionTeamLeaderInfo}"), content);            paragraph9.setAlignment(Element.ALIGN_CENTER);            document.add(paragraph9);            //页尾横线            document.add(new Paragraph("\n", space2));            document.add(new Paragraph("\n", space2));            LineSeparator lineEnd = new LineSeparator(3f, 100, BaseColor.RED, Element.ALIGN_CENTER, 0f);            document.add(lineEnd);            document.add(new Paragraph("\n", space3));            LineSeparator lineEnd1 = new LineSeparator(1f, 100, BaseColor.RED, Element.ALIGN_CENTER, 0f);            document.add(lineEnd1);            //关闭文档            document.close();        } catch (Exception e) {            e.printStackTrace();            log.error("导出pdf失败:{}", e);        }    }

更新于2023-12-15,更新内容:导出PDF增加页码和设置页边距
以下为效果图:
在这里插入图片描述

package com.sydata.zt.common.pdf;import com.itextpdf.text.*;import com.itextpdf.text.pdf.*;import java.io.IOException;/** * @Author xx * @Date 2023/12/15 10:05 * @Description: 导出pdf添加页数 * @Version 1.0 */public class PdfPageUtil extends PdfPageEventHelper {    /**     * 页眉     */    //public String header = "itext测试页眉";    /**     * 文档字体大小,页脚页眉最好和文本大小一致     */    public int presentFontSize = 15;    /**     * 文档页面大小,最好前面传入,否则默认为A4纸张     */    public Rectangle pageSize = PageSize.A4;    // 模板    public PdfTemplate total;    // 基础字体对象    public BaseFont bf = null;    // 利用基础字体生成的字体对象,一般用于生成中文文字    public Font fontDetail = null;    /**     *     *  无参构造方法.     *     */    public PdfPageUtil() {    }    /**     *     *  构造方法.     *     * @param     *     * @param presentFontSize     *            数据体字体大小     * @param pageSize     *            页面文档大小,A4,A5,A6横转翻转等Rectangle对象     */    public PdfPageUtil( int presentFontSize, Rectangle pageSize) {        this.presentFontSize = presentFontSize;        this.pageSize = pageSize;    }    public void setPresentFontSize(int presentFontSize) {        this.presentFontSize = presentFontSize;    }    /**     *     * 文档打开时创建模板     */    @Override    public void onOpenDocument(PdfWriter writer, Document document) {    // 共 页 的矩形的长宽高        total = writer.getDirectContent().createTemplate(50, 50);    }    /**     *     *关闭每页的时候,写入页眉,写入'第几页共'这几个字。     */    @Override    public void onEndPage(PdfWriter writer, Document document) {        this.addPage(writer, document);    }    //加分页    public void addPage(PdfWriter writer, Document document){        //设置分页页眉页脚字体        try {            if (bf == null) {                bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);            }            if (fontDetail == null) {                fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体            }        } catch (DocumentException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        // 1.写入页眉//        ColumnText.showTextAligned(writer.getDirectContent(),//                Element.ALIGN_LEFT, new Phrase(header, fontDetail),//                document.left(), document.top() + 20, 0);        // 2.写入前半部分的 第 X页/共        int pageS = writer.getPageNumber();        //String foot1 = "第 " + pageS + " 页 /共";        String foot1 = pageS  +"/";        Phrase footer = new Phrase(foot1, fontDetail);        // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len        float len = bf.getWidthPoint(foot1, presentFontSize);        // 4.拿到当前的PdfContentByte        PdfContentByte cb = writer.getDirectContent();        // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F        ColumnText                .showTextAligned(                        cb,                        Element.ALIGN_CENTER,                        footer,                        (document.rightMargin() + document.right()                                + document.leftMargin() - document.left() - len) / 2.0F ,                        document.bottom() - 10, 0);        cb.addTemplate(total, (document.rightMargin() + document.right()                        + document.leftMargin() - document.left()) / 2.0F ,                document.bottom() - 10); // 调节模版显示的位置    }//    //加水印//    public void addWatermark(PdfWriter writer){//        // 水印图片//        Image image;//        try {//            image = Image.getInstance("./web/images/001.jpg");//            PdfContentByte content = writer.getDirectContentUnder();//            content.beginText();//            // 开始写入水印//            for(int k=0;k<5;k++){//                for (int j = 0; j <4; j++) {//                    image.setAbsolutePosition(150*j,170*k);//                    content.addImage(image);//                }//            }//            content.endText();//        } catch (IOException | DocumentException e) {//            // TODO Auto-generated catch block//            e.printStackTrace();//        }//    }    /**     *     * 关闭文档时,替换模板,完成整个页眉页脚组件     */    @Override    public void onCloseDocument(PdfWriter writer, Document document) {        // 关闭文档的时候,将模板替换成实际的 Y 值        total.beginText();        // 生成的模版的字体、颜色        total.setFontAndSize(bf, presentFontSize);        //页脚内容拼接  如  第1页/共2页        //String foot2 = " " + (writer.getPageNumber()) + " 页";        //页脚内容拼接  如  第1页/共2页        String foot2 = String.valueOf(writer.getPageNumber());        // 模版显示的内容        total.showText(foot2);        total.endText();        total.closePath();    }}

然后就可以了直接导出pdf。

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/xuetang/2024-04-09/156115.html,文章来源:网络cs,作者:付梓,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论