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文件,绘制表格 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版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1、经合组织:《2024数字经济展望:第1卷,拥抱技术前沿》 经合组织近日发布《2024数字经济展望》报告第一卷,…...
惊艳的短视频:成都科成博通文化传媒公司
惊艳的短视频:瞬间之美,震撼心灵 在数字化时代,短视频以其短小精悍、内容丰富的特点,迅速占领了我们的屏幕和时间。而在这个浩如烟海的视频海洋中,总有一些短视频能够脱颖而出,以其惊艳的视觉效果、深刻的…...
消费增值模式引领业绩飙升与用户活跃
大家好,我是吴军,致力于为您揭示私域电商领域的独特魅力与机遇。 今日,我很高兴与大家分享一个激动人心的成功案例。我们的客户在短短一个月的时间里,业绩就飙升至上百万级别,其用户活跃度更是居高不下,日…...
二叉树从入门到AC(3)完全二叉树与堆
完全二叉树与堆 前言优先队列:堆向下调整维护堆向上调整维护堆堆的作用 前言 本文算是补充之前的系列,在前文中,讲了二叉树的基本结构与应用 二叉树从入门到AC(1)构建和前中后序遍历 二叉树从入门到AC(2&a…...
AI写作:如何让创作过程更流畅?
写作这件事一直让我们从小学生头痛到打工人,初高中时期800字的作文让我们焦头烂额,一篇作文里用尽了口水话,拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业,结果毕业前的最后一道坎拦住我们的是毕业论文,苦战几个…...
2024中国海洋装备展暨航海装备大会(福州海峡国际会展中心)
关于邀请参加2024中国海洋装备博览会的函 为加快推动海洋强国建设。在福建省人民政府的大力支持下,第二届中国海洋装备博览会将于2024年11月15-18日在福州举办。 博览会将进一步聚焦产业链和供应链协同创新,着力推动现代海洋产业体系建设,促进海洋科技…...
CyberDAO:引领Web3时代的DAO社区文化
致力于Web3研究和孵化 CyberDAO自成立以来,致力于推动Web3研究和孵化,吸引了来自技术、资本、商业、应用与流量等领域的上千名热忱成员。我们为社区提供多元的Web3产品和商业机会,触达行业核心,助力成员捕获Web3.0时代的红利。 目…...
测试面试点
在面试PC端测试人员时,你可以提出以下具体问题来深入了解候选人的技能、经验和思维方式: 1. 技术能力与基础知识 你能解释一下什么是黑盒测试和白盒测试吗?你在过去的工作中是如何应用这两种测试方法的? 答案:黑盒测…...
Nginx配置详细解释:(4)高级配置
目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外,还有一些高级配置,如网页的状态,第三方模块需要另外安装,支持变量,…...
OceanBase 4.3 特性解析:列存技术
在涉及大规模数据的复杂分析或即时查询时,列式存储是支撑业务负载的关键技术之一。相较于传统的行式存储,列式存储采用了不同的数据文件组织方式,它将表中的数据以列为单位进行物理排列。这种存储模式允许在分析过程中,查询计算仅…...
ARM32开发--PWM与通用定时器
知不足而奋进望远山而前行 目录 文章目录 前言 学习目标 学习内容 PWM pwm原理 需求 开发流程 初始化PWM PWM占空比控制 main函数修改duty 输出通道 关心的内容 重要的关键词 周期 分频 占空比 总结 前言 在微控制器开发中,理解和掌握PWM&#x…...
debugger(七):栈帧(backtrace)
〇、前言 在前面已经详细得介绍了栈帧,这里实现 backtrace。 一、backtrace 思路是遍历 stack,搜索 stack pointer,逐个打印栈帧信息,一直打印到 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默认支持重试和死信主题 重试主题:当消费者消费消息异常时&…...
electron-Vue: Module parse failed: Unexpected character ‘ ‘
electron-Vue项目中,我自己写了一个node的C扩展(xx.node),然后在.vue文件里import它,然后运行npm run electron:serve,报错如下: electron-Vue打包默认使用webpack,默认情况下webpack没…...
贪心算法-数组跳跃游戏(mid)
目录 一、问题描述 二、解题思路 1.回溯法 2.贪心算法 三、代码实现 1.回溯法实现 2.贪心算法实现 四、刷题链接 一、问题描述 二、解题思路 1.回溯法 使用递归的方式,找到所有可能的走步方式,并记录递归深度(也就是走步次数&#x…...
C++经典150题
经典150题 数组/字符串 文章目录 经典150题数组/字符串88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组重点重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机123.买卖股票的最佳时机 III55.跳跃游戏45.跳跃游戏II 88. 合并两个有序数组 给…...
超详解——Python 序列详解——基础篇
目录 1. 序列的概念 字符串(String) 列表(List) 元组(Tuple) 2. 标准类型操作符 连接操作符() 重复操作符(*) 索引操作符([]) …...
DVWA-DC-6
靶机IP:192.168.20.140 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 信息收集 nmap扫描靶机端口及版本信息 dirsearch扫目录 发现是个wordpress建站 我们去访问前端界面 存在重定向,修改hosts文件,加入192.168…...
ubuntu早期版本以及18.04后的版本,通过rc.local配置开机自启
在ubuntu早期版本以及18.04后的版本,还是支持在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…...
30.【Verilog】Verilog 除法器设计
第一步:分析与整理Verilog 除法器设计 1. 除法器原理(定点)与十进制竖式除法类似,以 27 5 为例(二进制): 取被除数高位(与除数同宽,如 3bit),与除…...
[特殊字符] 论文查重还在花钱?这个AI平台凭什么敢免费?一条给你讲透
各位正在跟论文死磕的朋友们,今天咱们不聊选题,不聊文献,聊一个每个毕业生都绑不开的刚需——查重。 你有没有算过一笔账?本科论文查一次少说三四十,硕士论文动辄上百,有些平台甚至标价两三百。一篇论文改…...
3步解锁百度网盘Mac版高速下载:逆向工程实践指南
3步解锁百度网盘Mac版高速下载:逆向工程实践指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘在macOS平台上的下载速度限…...
Midjourney 8x10高保真输出崩溃诊断:内存溢出日志解析、--sref跨模型参考失效、以及GPU显存碎片化导致的upscale中断(附实时监控脚本)
更多请点击: https://intelliparadigm.com 第一章:Midjourney 8x10高保真输出崩溃现象全景概览 近期,大量 Midjourney 用户在使用 --s 1000 --q 2 --v 6.3 配合 --ar 8:10 参数生成高分辨率人像/建筑类图像时,遭遇高频次任务中…...
收藏!小白程序员必看:大模型时代高薪就业新机遇与学习路径
收藏!小白程序员必看:大模型时代高薪就业新机遇与学习路径 2026年中国就业市场面临高校毕业生激增与岗位结构性短缺的矛盾,传统岗位被AI替代,而AI工程师、智能驾驶等高薪岗位却人才紧缺。核心原因是技能断层,企业需要复…...
告别Windows桌面混乱:NoFences桌面分区工具终极指南
告别Windows桌面混乱:NoFences桌面分区工具终极指南 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天都要在堆积如山的桌面图标中寻找需要的应用&#x…...
windows系统下操作GaussDB(DWS)【玩转PB级数仓GaussDB(DWS)】
数据仓库服务GaussDB(DWS) 是一种基于华为云基础架构和平台的在线数据处理数据库,提供即开即用、可扩展且完全托管的分析型数据库服务。GaussDB(DWS)是基于华为融合数据仓库GaussDB产品的云原生服务 ,兼容标准ANSI SQL 99和SQL 2003,同时兼容…...
RevokeMsgPatcher终极指南:3分钟实现微信/QQ/TIM永久防撤回
RevokeMsgPatcher终极指南:3分钟实现微信/QQ/TIM永久防撤回 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitco…...
别再为Canvas跨域头疼了!手把手教你用UniApp H5搞定网络图片转Base64并生成海报(附完整代码)
UniApp H5开发实战:Canvas跨域图片处理与海报生成全攻略 在移动端H5开发中,Canvas绘制网络图片并生成分享海报是个常见需求,但跨域问题往往让开发者头疼不已。本文将带你深入理解Canvas的CORS限制本质,对比两种主流解决方案的技术…...
HTML函数工具在NAS设备上能运行吗_轻服务器适配指南【指南】
在NAS上运行HTML函数工具需依场景选择方案:一、用Web服务托管为静态页,由浏览器执行;二、用Docker运行Node.js容器提供API;三、通过SSHjsdom在终端模拟执行;四、前端留NAS,后端逻辑迁至云函数。如果您希望在…...
