使用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月前
|
前端开发 API
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
|
2月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
493 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
2月前
|
资源调度 前端开发 JavaScript
安利一款基于canvas/svg的富文本编辑器-支持在线导出PDF、DOCX
高性能:利用Canvas和SVG进行图形和矢量图形的渲染,提供高性能的绘图能力。 可扩展性:Canvas-Editor是一个开源项目,支持通过插件机制扩展编辑器的功能,如DOCX、PDF导出、表格分页等。 丰富的文本编辑功能:支持多种文本编辑操作,如插入表格、分页、性能优化等。
210 0
|
3月前
|
JavaScript
vue导出pdf(接口)
vue导出pdf(接口)
25 3
|
4月前
|
JavaScript 前端开发
vue导出pdf(大数量可能有问题)
vue导出pdf(大数量可能有问题)
186 2
|
4月前
|
开发框架 前端开发 JavaScript
在Winform分页控件中集成导出PDF文档的功能
在Winform分页控件中集成导出PDF文档的功能
|
4月前
|
XML 编解码 前端开发
wkhtmltopdf 代替 itext 将 url 转成 pdf
wkhtmltopdf 代替 itext 将 url 转成 pdf
53 0
|
2月前
|
Java Apache Maven
将word文档转换成pdf文件方法
在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。
|
2月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
256 1
|
2月前
|
索引 Python
PDF文件页面提取操作小指南
PDF文件页面提取操作小指南
77 4