当前位置: 首页 > news >正文

JAVA开发 PDF文件生成表格,表格根据内容自动调整高度

1、展示效果

在这里插入图片描述
在这里插入图片描述

2、相关功能实现

JAVA开发 使用Apache PDFBox库生成PDF文件,绘制表格

3、实现代码

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;import java.io.File;
import java.io.IOException;import java.text.SimpleDateFormat;
import java.util.Date;public class TableInPDFBox {private static final int WARPNUM  = 11;   //每行显示的字符数量,一个中文占一个字符,其他字符占0.5个//判断输入的字符是不是中文public static boolean isChineseChar(char ch) {String regex = "[\u4E00-\u9FA5]";String charToCheck = String.valueOf(ch);return charToCheck.matches(regex);}//每行显示的字符数量,获取每个字符串所需要的行数public static  int GetWarpRowByString(String str){float sum = 0 ;   //sum 用来计算中文字符int row = 0,index=0;char[] tempArr = str.toCharArray();for(int i = 0;i<tempArr.length;i++){if(isChineseChar(tempArr[i])){sum +=1;}else{sum +=0.5f;}if(sum == WARPNUM){row++;sum=0;}else if(sum>WARPNUM){i--;row++;sum = 0;}else{}}row = row +1;return row;}//根据每行的内容,获取最大需要换行的行数(只比较爱好、优势两列)public static int[] ConfirmRowLength(String[][] stu,int index){int[] MaxlengthArr = new int[stu.length];MaxlengthArr[0] = 1;for(int i = 1;i<stu.length;i++){int max = GetWarpRowByString(stu[i][0]);for(int j=index;j<stu[i].length;j++){int strRow = GetWarpRowByString(stu[i][j]);if(strRow>max){max = strRow;}}MaxlengthArr[i] = max;}return MaxlengthArr;}//将字符串按照最大每行显示数进行分割,保存到字符串数组中public static String[] GetWarpStr(int rowLength,String str){float sum = 0.0f;String[] returnStr=new String[rowLength];int returnIndex = 0;String temp="";char[] strArr = str.toCharArray();for(int i= 0;i<strArr.length;i++){if(isChineseChar(strArr[i])){sum = sum + 1.0f;}else{sum+=0.5f;}temp = temp + strArr[i];if(sum == WARPNUM){returnStr[returnIndex++]= temp;temp = "";sum = 0.0f;}else if(sum >= WARPNUM){returnStr[returnIndex++]= temp.substring(0,temp.length()-1);i--;temp = "";sum = 0.0f;}else{}}if(!temp.isEmpty() && returnIndex<rowLength){returnStr[returnIndex++] = temp;}return returnStr;}public static void main(String[] args) {PDDocument document = null;String[][] stuData = new String[][]{{"姓名","工号","部门","爱好","优势"},{"张三丰","WD0001","武当派","阅读让我们获得知识和灵感,运动可以让我们保持身体健康。阅读让我们获得知识和灵感,运动可以让我们保持身体健康。阅读让我们获得知识和灵感,运动可以让我们保持身体健康。阅读让我们获得知识和灵感,运动可以让我们保持身体健康。","武当派和三丰派的祖师,会少林武功和九阳真经,武功特点是阴阳互融、刚柔并济,达到了武学的巅峰。真是泰裤辣。武功特点是阴阳互融、刚柔并济,达到了武学的巅峰。真是泰裤辣"},{"郭  襄","EM0001","峨嵋派","书法有助于修养身心,陶冶情操,既练习了字,也可以修炼沉稳的性格.书法有助于修养身心,陶冶情操,既练习了字,也可以修炼沉稳的性格。","会峨眉九阳功,擅长黄药师最精妙的剑法之一的落英剑法。"}};try {int[] lengthArr = ConfirmRowLength(stuData,3);float[] rowIndxArr = new float[stuData.length+1];float[] colIndxArr = new float[stuData[0].length+1];document = new PDDocument();PDPage page = new PDPage();document.addPage(page);PDPageContentStream contentStream = new PDPageContentStream(document, page);Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmmss");String dateFormat = sdf.format(date);// 表格参数int rows = 3;int cols = 5;float cellWidth1 = 60 , cellWidth2 = 150;float cellHeight = 30;float xStart = 30,xEnd = xStart + 3 * cellWidth1+2*cellWidth2;       //横向开始线的x点,横向结束线的x点float yStart = 700,yEnd = 0;   //纵向开始线的y点,纵向结束线的y点float sumRows = cellHeight;// 绘制表格x轴线for (int i = 0; i <= rows; i++) {float rowY =0;if(i == 0){rowY = yStart - i * cellHeight;}else{sumRows =  sumRows +lengthArr[i-1]*10+5*2;rowY = yStart - sumRows;yEnd = rowY;}rowIndxArr[i] = rowY;contentStream.moveTo(xStart, rowY);contentStream.lineTo(xEnd, rowY);contentStream.stroke();}//绘制表格y轴线for (int j = 0; j <= cols; j++) {float colX;if(j<=3){colX= xStart + j * cellWidth1;}else{colX = xStart +3*cellWidth1 +(j-3)*cellWidth2;}colIndxArr[j] = colX;contentStream.moveTo(colX, yStart);contentStream.lineTo(colX, yEnd);contentStream.stroke();}// 填写表格内容File fontFile = new File("C:\\Windows\\Fonts\\SIMLI.TTF"); // 字体文件路径PDType0Font font = PDType0Font.load(document, fontFile);for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {String text = stuData[i][j];String[] rowText = GetWarpStr(lengthArr[i],text);for(int k = 0;k<rowText.length && rowText[k]!=null;k++){contentStream.beginText();contentStream.setFont(font, 12);contentStream.newLineAtOffset(colIndxArr[j]+5, rowIndxArr[i]-10-10*k);contentStream.showText(rowText[k]);contentStream.endText();}}}contentStream.close(); // 关闭内容流// 保存PDFdocument.save("D:\\JAVAFILE\\attachments\\pdfs\\" + dateFormat + "  table.pdf");} catch (IOException e) {e.printStackTrace();} finally {if (document != null) {try {document.close(); // 关闭文档} catch (IOException e) {e.printStackTrace();}}}}
}

相关文章:

JAVA开发 PDF文件生成表格,表格根据内容自动调整高度

1、展示效果 2、相关功能实现 JAVA开发 使用Apache PDFBox库生成PDF文件&#xff0c;绘制表格 3、实现代码 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.ap…...

OSINT技术情报精选·2024年6月第1周

OSINT技术情报精选2024年6月第1周 2024.6.11版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、经合组织&#xff1a;《2024数字经济展望&#xff1a;第1卷,拥抱技术前沿》 经合组织近日发布《2024数字经济展望》报告第一卷&#xff0c;…...

惊艳的短视频:成都科成博通文化传媒公司

惊艳的短视频&#xff1a;瞬间之美&#xff0c;震撼心灵 在数字化时代&#xff0c;短视频以其短小精悍、内容丰富的特点&#xff0c;迅速占领了我们的屏幕和时间。而在这个浩如烟海的视频海洋中&#xff0c;总有一些短视频能够脱颖而出&#xff0c;以其惊艳的视觉效果、深刻的…...

消费增值模式引领业绩飙升与用户活跃

大家好&#xff0c;我是吴军&#xff0c;致力于为您揭示私域电商领域的独特魅力与机遇。 今日&#xff0c;我很高兴与大家分享一个激动人心的成功案例。我们的客户在短短一个月的时间里&#xff0c;业绩就飙升至上百万级别&#xff0c;其用户活跃度更是居高不下&#xff0c;日…...

二叉树从入门到AC(3)完全二叉树与堆

完全二叉树与堆 前言优先队列&#xff1a;堆向下调整维护堆向上调整维护堆堆的作用 前言 本文算是补充之前的系列&#xff0c;在前文中&#xff0c;讲了二叉树的基本结构与应用 二叉树从入门到AC&#xff08;1&#xff09;构建和前中后序遍历 二叉树从入门到AC&#xff08;2&a…...

AI写作:如何让创作过程更流畅?

写作这件事一直让我们从小学生头痛到打工人&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;苦战几个…...

2024中国海洋装备展暨航海装备大会(福州海峡国际会展中心)

关于邀请参加2024中国海洋装备博览会的函 为加快推动海洋强国建设。在福建省人民政府的大力支持下,第二届中国海洋装备博览会将于2024年11月15-18日在福州举办。 博览会将进一步聚焦产业链和供应链协同创新&#xff0c;着力推动现代海洋产业体系建设&#xff0c;促进海洋科技…...

CyberDAO:引领Web3时代的DAO社区文化

致力于Web3研究和孵化 CyberDAO自成立以来&#xff0c;致力于推动Web3研究和孵化&#xff0c;吸引了来自技术、资本、商业、应用与流量等领域的上千名热忱成员。我们为社区提供多元的Web3产品和商业机会&#xff0c;触达行业核心&#xff0c;助力成员捕获Web3.0时代的红利。 目…...

测试面试点

在面试PC端测试人员时&#xff0c;你可以提出以下具体问题来深入了解候选人的技能、经验和思维方式&#xff1a; 1. 技术能力与基础知识 你能解释一下什么是黑盒测试和白盒测试吗&#xff1f;你在过去的工作中是如何应用这两种测试方法的&#xff1f; 答案&#xff1a;黑盒测…...

Nginx配置详细解释:(4)高级配置

目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外&#xff0c;还有一些高级配置&#xff0c;如网页的状态&#xff0c;第三方模块需要另外安装&#xff0c;支持变量&#xff0c…...

OceanBase 4.3 特性解析:列存技术

在涉及大规模数据的复杂分析或即时查询时&#xff0c;列式存储是支撑业务负载的关键技术之一。相较于传统的行式存储&#xff0c;列式存储采用了不同的数据文件组织方式&#xff0c;它将表中的数据以列为单位进行物理排列。这种存储模式允许在分析过程中&#xff0c;查询计算仅…...

ARM32开发--PWM与通用定时器

知不足而奋进望远山而前行 目录 文章目录 前言 学习目标 学习内容 PWM pwm原理 需求 开发流程 初始化PWM PWM占空比控制 main函数修改duty 输出通道 关心的内容 重要的关键词 周期 分频 占空比 总结 前言 在微控制器开发中&#xff0c;理解和掌握PWM&#x…...

debugger(七):栈帧(backtrace)

〇、前言 在前面已经详细得介绍了栈帧&#xff0c;这里实现 backtrace。 一、backtrace 思路是遍历 stack&#xff0c;搜索 stack pointer&#xff0c;逐个打印栈帧信息&#xff0c;一直打印到 main 函数。 void Debugger::print_backtrace() {auto output_frame [frame_n…...

kafka-重试和死信主题(SpringBoot整合Kafka)

文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题&#xff1a;当消费者消费消息异常时&…...

electron-Vue: Module parse failed: Unexpected character ‘ ‘

​ electron-Vue项目中&#xff0c;我自己写了一个node的C扩展&#xff08;xx.node&#xff09;&#xff0c;然后在.vue文件里import它&#xff0c;然后运行npm run electron:serve&#xff0c;报错如下: ​​ electron-Vue打包默认使用webpack&#xff0c;默认情况下webpack没…...

贪心算法-数组跳跃游戏(mid)

目录 一、问题描述 二、解题思路 1.回溯法 2.贪心算法 三、代码实现 1.回溯法实现 2.贪心算法实现 四、刷题链接 一、问题描述 二、解题思路 1.回溯法 使用递归的方式&#xff0c;找到所有可能的走步方式&#xff0c;并记录递归深度&#xff08;也就是走步次数&#x…...

C++经典150题

经典150题 数组/字符串 文章目录 经典150题数组/字符串88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组重点重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机123.买卖股票的最佳时机 III55.跳跃游戏45.跳跃游戏II 88. 合并两个有序数组 给…...

超详解——Python 序列详解——基础篇

目录 1. 序列的概念 字符串&#xff08;String&#xff09; 列表&#xff08;List&#xff09; 元组&#xff08;Tuple&#xff09; 2. 标准类型操作符 连接操作符&#xff08;&#xff09; 重复操作符&#xff08;*&#xff09; 索引操作符&#xff08;[]&#xff09; …...

DVWA-DC-6

靶机IP:192.168.20.140 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 信息收集 nmap扫描靶机端口及版本信息 dirsearch扫目录 发现是个wordpress建站 我们去访问前端界面 存在重定向&#xff0c;修改hosts文件&#xff0c;加入192.168…...

ubuntu早期版本以及18.04后的版本,通过rc.local配置开机自启

在ubuntu早期版本以及18.04后的版本&#xff0c;还是支持在rc.local中进行操作开机自启。 1、编辑rc.local文件 cat <<EOF >/etc/rc.local #!/bin/sh -e # rc.local # This script is executed at the end of each multiuser runlevel. # Make sure that the script…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...