当前位置: 首页 > 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…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...