openpdf

news2024/11/26 4:39:29

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 预览图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2207489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正点原子STM32F407ZG 开发板简介

1. STM32F407ZG 学习资料 1&#xff09;ST 官方的学习资料 ST 官方资料有两个网址&#xff1a; www.stmcu.org.cn 和 www.st.com 。 www.stmcu.org.cn 是 ST 中文社区&#xff0c;里面的资料全部由 ST 中国区的人负责更新和整理&#xff0c;包含了所有 ST 公司的 …

计算机的错误计算(一百二十)

摘要 探讨在许多应用中出现的函数 的计算精度问题。 例1. 考虑在许多应用中出现的函数 计算 不妨在Python下计算&#xff1a; 若用下列Rust代码在线计算&#xff1a; fn f(x: f64) -> f64 {(x.exp() - 1.0) / x }fn main() {let result f(0.9e-13);println!("…

微知-Bluefield DPU命名规则各字段作用?BF2 BF3全系列命名大全

文章目录 背景字段命名C是bmc的意思NOT的N是是否加密S表示不加密但是secureboot enable倒数第四个都是E倒数第五个是速率 V和H是200GM表示E serials&#xff0c;H表示P serials&#xff08;区别参考兄弟篇&#xff1a;[more](https://blog.csdn.net/essencelite/article/detail…

【通信协议讲解】单片机基础重点通信协议解析与总结(IIC,CAN,MODBUS...)

目录 一.IIC总线 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 二.SPI总线 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 三.串口通信 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 四.CAN总线 基础特性…

vue后台管理系统从0到1(5)

文章目录 vue后台管理系统从0到1&#xff08;5&#xff09;完善侧边栏修改bug渲染header导航栏 vue后台管理系统从0到1&#xff08;5&#xff09; 接上一期&#xff0c;我们需要完善我们的侧边狼 完善侧边栏 我们在 element 组件中可以看见&#xff0c;这一个侧边栏是符合我们…

I/O进程(Day26)

一、学习内容 I/O进程 标准IO 概念 针对文件的读写操作 文件IO最终达成的目的&#xff1a;将一个临时存在于内存中的数据&#xff0c;永久性的存放于磁盘当中 操作 文件IO的操作&#xff0c;需要这样的2个指针 一个指针&#xff1a;指向源数据&#xff0c;提供读取操作的指针 …

复杂系统学习

一、复杂网络分析在复杂性研究中的地位 1.复杂系统 系统中存在的复杂度从两个维度来看 ①系统自由度&#xff08;系统组成成分的数目&#xff09; ②相互作用&#xff08;线性到非线性的转换&#xff09; 复杂网络是复杂系统的骨架 复杂系统可以抽象成一个网络&#xff0…

大数据新视界 --大数据大厂之 Dremio:改变大数据查询方式的创新引擎

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【JVM】如何判断对象是否可以被回收

引用计数法&#xff1a; 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 优点&#xff1a;实现简单&#xff0c;判…

Visual Studio--VS安装配置使用教程

Visual Studio Visual Studio 是一款功能强大的开发人员工具&#xff0c;可用于在一个位置完成整个开发周期。 它是一种全面的集成开发环境 (IDE)。对新手特别友好&#xff0c;使用方便&#xff0c;不需要复杂的去配置环境。用它学习很方便。 Studio安装教程 Visual Studio官…

从这里看BD仓储如何改变物流效率?

BD仓储物流建设成为当代物流领域的核心要素&#xff0c;推动着整个行业朝向高效性与智能化水平不断提升。在BD仓储物流的创新浪潮中&#xff0c;RFID技术犹如一颗耀眼的明珠&#xff0c;凭借其无可比拟的特性获得了业界的广泛推崇与广泛应用。该技术通过无线信号与电子标签的互…

Python剪辑视频

import os from moviepy.editor import VideoFileClipvideo_dir r"E:\学习\视频剪辑" s_video_file "1.mp4" d_video_file "剪辑片段1.mp4" s_video_path os.path.join(video_dir, s_video_file) # 原视频文件路径 d_video_path os.path…

FDTD Solutions(时域有限差分)仿真技术与应用

FDTD Solutions是一款非常好用的微纳光学设计工具。该软件提供了丰富的设计功能&#xff0c;支持CMOS图像传感器&#xff0c;OLED和液晶&#xff0c;表面计量&#xff0c;表面等离子体&#xff0c;石墨烯&#xff0c;太阳能电池&#xff0c;集成光子组件&#xff0c;超材料&…

排序|归并排序|递归|非递归|计数排序(C)

归并排序 如果数组的左半区间有序&#xff0c;右半区间有序&#xff0c;可以直接进行归并 基本思想 快排是一种前序&#xff0c;归并是后序 每次取小尾插 void _MergeSort(int* a, int* tmp, int begin, int end) {if (end < begin)return;int mid (end begin) / 2;/…

go开发环境设置-安装与交叉编译

1. 引言 Go语言&#xff0c;又称Golang&#xff0c;是Google开发的一门编程语言&#xff0c;以其高效、简洁和并发编程的优势受到广泛欢迎。作为一门静态类型、编译型语言&#xff0c;Go在构建网络服务器、微服务和命令行工具方面表现突出。 在开发过程中&#xff0c;开发者常…

PyCharm打开及配置现有工程(详细图解)

本文详细介绍了如何利用Pycharm打开一个现有的工程&#xff0c;其中包括编译器的配置。 PyCharm打开及配置现有工程 1、打开工程2、配置编译器 1、打开工程 双击PyCharm软件&#xff0c;点击左上角 文件 >> 打开(O)… 选中想要打开的项目之后点击“确定” 2、配置编译器…

STM32学习--3-5 光敏控制传感器控制蜂鸣器

接线图 Buzzer.c #include "stm32f10x.h" // Device header void Buzzer_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_O…

Microsoft Visual Studio安装gtest

1. 参考【Windows Visual Studio下安装和使用google test&#xff08;gtest&#xff09;】 https://blog.csdn.net/Bule_Zst/article/details/78420894 2. 编译gtest使用Win32模式。 3. 配置属性&#xff0c;C/C&#xff0c;常规&#xff0c;附加包含目录 …

【画质模组】古墓丽影mod,调色并修改光影,游戏画质大提升

大家好&#xff0c;今天小编我给大家继续引入一款游戏mod&#xff0c;这次这个模组主要是针对雷神之锤4进行修改&#xff0c;如果你觉得游戏本身光影有缺陷&#xff0c;觉得游戏色彩有点失真的话&#xff0c;或者说你想让雷神之锤4这款游戏增加对光线追踪的支持的话&#xff0c…

Java | Leetcode Java题解之第474题一和零

题目&#xff1a; 题解&#xff1a; class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][] dp new int[m 1][n 1];int length strs.length;for (int i 0; i < length; i) {int[] zerosOnes getZerosOnes(strs[i]);int zeros zerosOnes[0]…