使用Itext导出PDF

简介: 使用Itext导出PDF

导入依赖

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

主要代码

public ResponseEntity<byte[]> exportPDF(String ids, HttpServletResponse response) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // 定义全局的字体静态变量
        Font content = null;
        BaseFont bf;
        Font font = null;
        Font totalAmountFont = null;
        Font totalTitleFont = null;
        try {
            //创建字体
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            content = new Font(bfChinese, 10, Font.NORMAL);
            font = new Font(bf,20,Font.BOLD, BaseColor.BLACK);
            totalTitleFont = new Font(bf,14,Font.BOLD, BaseColor.BLACK);
            totalAmountFont = new Font(bf,14,Font.BOLD, BaseColor.RED);
        } catch (Exception e) {
            log.error("创建字体异常,请检查系统是否有对应字体");
            e.printStackTrace();
        }
        //设置页大小和边距
        Document document = new Document(new RectangleReadOnly(595F, 842F));
        document.setMargins(60, 60, 60, 60);
        try {
            PdfWriter.getInstance(document, baos);
            //打开生成的pdf文件
            document.open();

            String[] split = ids.replaceAll(" ", "").split(",");
            for (String id : split) {
                MonthBillVO monthBillVO = this.getDetailsById(Long.valueOf(id));
                User user = userService.getById(monthBillVO.getUserId());
                Assert.isNull(user, "用户不存在!");
                List<MonthBillDetail> detailList = monthBillVO.getDetailList();
                Assert.isListNull(detailList, "月账单信息为空");

                //设置内容
                Paragraph paragraph = new Paragraph("月对账明细表",font);
                paragraph.setAlignment(1);
                //引用字体
                document.add(paragraph);

                // 设置表格的列宽和列数
                PdfPTable table = new PdfPTable(new float[]{25f,15f,15f,25f,35f,25f});
                table.setSpacingBefore(20f);
                // 设置表格宽度为100%
                table.setWidthPercentage(100.0F);
                table.setHeaderRows(1);
                table.getDefaultCell().setHorizontalAlignment(1);
                PdfPCell cell = null;

                String[] infoTitles = new String[]{"姓名", "性别", "年龄", "护理级别", "床位", "床位类别"};
                for (String title : infoTitles) {
                    cell = new PdfPCell(new Paragraph(title,content));
                    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                    table.addCell(cell);
                }

                List<PdfPCell> oldmanCellList = new ArrayList<>();
                oldmanCellList.add(new PdfPCell(new Paragraph(user.getUserName(), content)));
                oldmanCellList.add(new PdfPCell(new Paragraph(user.getGender() == "1" ? "男":"女", content)));
                oldmanCellList.add(new PdfPCell(new Paragraph(user.getAge().toString(), content)));
                oldmanCellList.add(new PdfPCell(new Paragraph(user.getNursingLevelName(), content)));
                oldmanCellList.add(new PdfPCell(new Paragraph(user.getBedName(), content)));
                if (ObjectUtil.isNotNull(user.getBedId())){
                    R<BcRoomVO> roomResult = remoteRoomService.getRoomNameById(oldman.getBedId().longValue(), SecurityConstants.FROM_IN);
                    if (ObjectUtil.isNotNull(roomResult.getData())){
                        oldmanCellList.add(new PdfPCell(new Paragraph(roomResult.getData().getCategoryName(), content)));
                    }
                }

                oldmanCellList.forEach(item -> {
                    //设置居中
                    item.setHorizontalAlignment(Element.ALIGN_CENTER);
                    item.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    table.addCell(item);
                });

                List<MonthBillChargeTypeEnum> chargeType = MonthBillChargeTypeEnum.getAll();

                Map<Integer, PdfPTable> tableMap = new HashMap<>();
                for (MonthBillChargeTypeEnum monthBillChargeTypeEnum : chargeType) {
                    // 设置表格的列宽和列数
                    PdfPTable table3 = new PdfPTable(new float[]{15f,25f,25f,25f,25f,25f,25f,25f,25f});
                    table3.setSpacingBefore(20f);
                    // 设置表格宽度为100%
                    table3.setWidthPercentage(100.0F);
                    table3.setHeaderRows(1);
                    table3.getDefaultCell().setHorizontalAlignment(1);

                    String[] titles = new String[]{"序号", "费用类别", "明细", "开始时间", "结束时间", "费用总价", "优惠", "结算价", "备注"};
                    for (String title : titles) {
                        cell = new PdfPCell(new Paragraph(title,content));
                        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                        table3.addCell(cell);
                    }
                    tableMap.put(monthBillChargeTypeEnum.getId(), table3);
                }

                Map<Integer, List<MonthBillDetail>> groupList = detailList.stream().collect(Collectors.groupingBy(MonthBillDetail::getChargeType));

                for (MonthBillChargeTypeEnum type : chargeType) {
                    List<MonthBillDetail> billDetails = groupList.get(type.getId());
                    if (CollectionUtils.isEmpty(billDetails)){
                        continue;
                    }

                    List<PdfPCell> cellList = new ArrayList<>();
                    for (int i=0; i < billDetails.size() ;i++) {
                        MonthBillDetail detail = detailList.get(i);
                        cellList.add(new PdfPCell(new Paragraph(i+1+"", content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getCostCategoryName(), content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getItemName(), content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getStartDate().toLocalDate().toString(), content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getEndDate().toLocalDate().toString(), content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getTotalAmount().toString(), content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getReliefAmount().toString(), content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getSettlementAmount().toString(), content)));
                        cellList.add(new PdfPCell(new Paragraph(detail.getRemark(), content)));
                    }

                    cellList.forEach(item -> {
                        //设置居中
                        item.setHorizontalAlignment(Element.ALIGN_CENTER);
                        item.setVerticalAlignment(Element.ALIGN_MIDDLE);
                        tableMap.get(type.getId()).addCell(item);
                    });

                }

                document.add(new Paragraph("\n"));
                document.add(new Paragraph("▋ 用户信息",content));
                document.add(table);

                for (Integer key : tableMap.keySet()) {
                    PdfPTable pdfPTable = tableMap.get(key);
                    document.add(new Paragraph("\n"));
                    document.add(new Paragraph("▋ " + MonthBillChargeTypeEnum.getById(key).getValue(), content));
                    int size = pdfPTable.size();
                    if (size > 1){
                        document.add(pdfPTable);
                    }else{
                        Paragraph info = new Paragraph("无", content);
                        info.setAlignment(Element.ALIGN_LEFT);
                        document.add(info);
                    }
                }

                document.add(new Paragraph("\n"));
                // 添加分隔线到文档
                document.add(new LineSeparator());
                Paragraph totalTitle = new Paragraph("合计应收费用", totalTitleFont);
                totalTitle.setAlignment(Element.ALIGN_RIGHT);
                document.add(totalTitle);
                Paragraph totalAmount = new Paragraph("¥ " + monthBillVO.getSettlementAmount(), totalAmountFont);
                totalAmount.setAlignment(Element.ALIGN_RIGHT);
                document.add(totalAmount);
                document.newPage();
            }
            //关闭文档
            document.close();

            // 设置下载文件的响应头
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=example.pdf");

            // 设置文件的MIME类型
            MediaType mediaType = MediaType.APPLICATION_PDF;

            return ResponseEntity.ok()
                    .headers(headers)
                    .contentType(mediaType)
                    .body(baos.toByteArray());

        } catch (com.itextpdf.text.DocumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
目录
相关文章
|
1月前
|
机器学习/深度学习 文字识别 Shell
高效率办公PDF批量处理:批量OCR识别PDF区域文字内容,用PDF内容批量改名或导出表格的货物运单应用案例
针对铁路货运物流单存档需求,本项目基于WPF与飞桨OCR技术,实现批量图片多区域文字识别与自动重命名。用户可自定义识别区域,系统提取关键信息(如车号、批次号)并生成规范文件名,提升档案管理效率与检索准确性,支持PDF及图像文件处理。
281 0
|
7月前
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
4月前
|
缓存 测试技术 网络安全
05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
93 0
05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
|
9月前
|
人工智能 JSON 搜索推荐
猫步简历 - 开源免费AI简历生成器 | 一键导出PDF/JSON
猫步简历是一款免费开源的AI简历生成器,帮助用户轻松创建独特、专业的简历。支持导出超高清PDF、图片、JSON等多种格式,并提供AI智能创作、润色和多语种切换等功能。拥有海量模板、高度定制化模块及完善的后台管理系统,助力求职者脱颖而出。官网:https://maobucv.com,GitHub开源地址:https://github.com/Hacker233/resume-design。
2094 10
|
9月前
|
文字识别
【PDF提取全自动改名】如何批量提取PDF指定区域的文字内容,用内容批量给PDF命名或者导出表格,学会全自动解放双手
在生活和工作中,我们常需处理大量PDF文件,如银行单据、税收单据等。手动处理效率低下,而使用“咕嘎批量PDF多区域内容提取重命名导表格系统”可快速完成数千份文档的处理,大幅提高效率。该工具通过获取PDF各区域内容坐标,导入并处理文件,最终将信息提取至表格,并根据关键信息对PDF进行重命名,方便管理和查找。
1472 2
|
前端开发 API
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
|
资源调度 前端开发 JavaScript
安利一款基于canvas/svg的富文本编辑器-支持在线导出PDF、DOCX
高性能:利用Canvas和SVG进行图形和矢量图形的渲染,提供高性能的绘图能力。 可扩展性:Canvas-Editor是一个开源项目,支持通过插件机制扩展编辑器的功能,如DOCX、PDF导出、表格分页等。 丰富的文本编辑功能:支持多种文本编辑操作,如插入表格、分页、性能优化等。
1480 0
|
4月前
|
C#
【PDF提取内容改名】批量提取PDF指定区域内容重命名PDF文件,PDF自动提取内容命名的方案和详细步骤
本工具可批量提取PDF中的合同编号、日期、发票号等关键信息,支持PDF自定义区域提取并自动重命名文件,适用于合同管理、发票处理、文档归档和数据录入场景。基于iTextSharp库实现,提供完整代码示例与百度、腾讯网盘下载链接,助力高效处理PDF文档。
668 40
|
4月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
6月前
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
285 10

热门文章

最新文章