openpdf

1、简介

2、示例

2.1 引入依赖

        <dependency>
            <groupId>com.github.librepdf</groupId>
            <artifactId>openpdf</artifactId>
            <version>1.3.34</version>
        </dependency>
        <dependency>
            <groupId>com.github.librepdf</groupId>
            <artifactId>openpdf-fonts-extra</artifactId>
            <version>1.3.34</version>
        </dependency>

2.2 代码

2.2.1 主程序

String filePath = "/Users/xingyu/Documents/tmp/a.pdf";
        FileOutputStream fos = new FileOutputStream(filePath);
        PdfWriter pdfWriter = null;
        Document document = null;
        try {
            document = new Document();
            document.setPageSize(PageSize.A4);
            pdfWriter = PdfWriter.getInstance(document, fos);
            document.open();
            Image rightTopIcon = getRightTopIcon("4");
            document.add(rightTopIcon);

            Paragraph titleParagraph = createParagraph("新模版002", FONT_TITLE, Element.ALIGN_CENTER, 0);
            document.add(titleParagraph);

            ProcessPdfVO processPdf = new ProcessPdfVO();
            processPdf.setCompanyName("xxx公司");
            processPdf.setCreateTime("2024-05-27");
            processPdf.setProcessId("202405270004");
            processPdf.setPrintDateTime("2024-05-28 17:25:09");
            processPdf.setPrinter("张三");

            PdfPTable firstRow = createFirstRow(processPdf);
            document.add(firstRow);

            PdfPTable mainTable = createMainTable();

            PdfPCell cell = new PdfPCell(createParagraph("审批流程", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
            cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
            mainTable.addCell(cell);

            PdfPTable subTable = new PdfPTable(2);
            subTable.setWidths(new float[]{30,70});
            subTable.setWidthPercentage(100);  // 使得子表铺满单元格

            PdfPCell subCell1 = new PdfPCell(createParagraph("subCell1", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
            subCell1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            subCell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
            subCell1.setBorder(Cell.BOX);
            subTable.addCell(subCell1);

            PdfPCell subCell2 = new PdfPCell(createParagraph("subCell2", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
            subCell2.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            subCell2.setBorder(Cell.BOX);
            subTable.addCell(subCell2);

            PdfPCell subCell3 = new PdfPCell(createParagraph("subCell3", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
            subCell3.setBorder(Cell.BOX);
            subCell3.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            subTable.addCell(subCell3);

            PdfPCell subCell4 = new PdfPCell(createParagraph("subCell4", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
            subCell4.setBorder(Cell.BOX);
            subCell4.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            subTable.addCell(subCell4);
            subTable.setComplete(true);

            PdfPCell subCell5 = new PdfPCell();
            subCell5.setBorder(Cell.BOX);
            subCell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
            subCell5.setPadding(0);
            subCell5.addElement(subTable);

            mainTable.addCell(subCell5);


            mainTable.addCell(new PdfPCell(createParagraph("审批流程1", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0)));
            mainTable.addCell(new PdfPCell(createParagraph("审批流程2", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0)));
            mainTable.addCell(new PdfPCell(createParagraph("审批流程3", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0)));
            mainTable.addCell(subCell5);

            mainTable.setComplete(true);

            document.add(mainTable);

            PdfPTable lastTable = createLastTable(processPdf);
            document.add(lastTable);
        } finally {
            IoUtil.close(document);
            IoUtil.close(pdfWriter);
            IoUtil.close(fos);
        }

2.2.2 表格

        private static PdfPTable createMainTable() {
        PdfPTable table = new PdfPTable(2);
        float[] width = getUnitValues(table.getNumberOfColumns(), new float[]{30f, 70f});
        table.setWidths(width);
        return table;
    }



    private static float[] getUnitValues(int columnNum, float[] percents) {
        float[] unitValues = new float[columnNum];
        for (int i = 0; i < columnNum; i++) {
            float percentValue;
            if (Objects.nonNull(percents) && columnNum == percents.length) {
                percentValue = percents[i];

            } else {
                percentValue = BigDecimal.valueOf(100)
                        .divide(BigDecimal.valueOf(columnNum), 10, RoundingMode.HALF_UP)
                        .floatValue();
            }
            unitValues[i] = percentValue;
        }
        return unitValues;
    }

2.2.3 单元格

/**
     * 创建单元格
     *
     * @param horizontalAlignment 水平位置
     * @param verticalAlignment   垂直位置
     * @param border              边框
     * @param borderColor         边框颜色
     * @return 单元格
     */
    private static PdfPCell createCell(Integer horizontalAlignment, Integer verticalAlignment, Integer border,
                                       Color borderColor) {
        PdfPCell cell = new PdfPCell();
        if (Objects.nonNull(horizontalAlignment)) {
            cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
        }
        if (Objects.nonNull(verticalAlignment)) {
            cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
        }
        if (Objects.nonNull(border)) {
            cell.setBorder(border);
        }
        if (Objects.nonNull(borderColor)) {
            cell.setBorderColor(borderColor);
        }
        return cell;
    }

2.2.4 创建单元格

/**
     * 创建单元格
     *
     * @param horizontalAlignment 水平位置
     * @param verticalAlignment   垂直位置
     * @param border              边框
     * @param borderColor         边框颜色
     * @return 单元格
     */
    private static PdfPCell createCell(Integer horizontalAlignment, Integer verticalAlignment, Integer border,
                                       Color borderColor) {
        PdfPCell cell = new PdfPCell();
        if (Objects.nonNull(horizontalAlignment)) {
            cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
        }
        if (Objects.nonNull(verticalAlignment)) {
            cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
        }
        if (Objects.nonNull(border)) {
            cell.setBorder(border);
        }
        if (Objects.nonNull(borderColor)) {
            cell.setBorderColor(borderColor);
        }
        return cell;
    }

2.2.5 图片

private static Image getRightTopIcon(String processStatus) {
        Image image = null;
        ProcessStatusEnum processStatusEnum = ProcessStatusEnum.getEnum(processStatus);
        if (Objects.isNull(processStatusEnum)) {
            return image;
        }
        if (StringUtils.isBlank(processStatusEnum.getIcon())) {
            return image;
        }
        String iconPath = String.format(Locale.ROOT, "%s%s%s", "images", File.separator, processStatusEnum.getIcon());
        InputStream is = null;
        ByteArrayOutputStream bos = null;
        try {
            ClassPathResource classPathResource = new ClassPathResource(iconPath);
            is = classPathResource.getInputStream();
            bos = new ByteArrayOutputStream();
            IoUtil.copy(is, bos);
            is.close();
            image = Image.getInstance(bos.toByteArray());
            image.scalePercent(50);
            image.setAbsolutePosition(500,700);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            IoUtil.close(is);
            IoUtil.close(bos);
        }
        return image;
    }

2.2.6 预览图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值