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…...
【环境搭建】1.阿里云ECS服务器 安装jdk8
在阿里云服务器上安装 JDK 8 可以通过以下步骤完成。假设你使用的是 CentOS 或者其他基于 Red Hat 的发行版或Alibaba Cloud Linux 3.2104 LTS 64位。 1.更新系统软件包 sudo yum update -y2.安装 OpenJDK 8 使用 yum 包管理器安装 OpenJDK 8 sudo yum install -y java-1.8…...
idea插件开发之定义侧边栏
写在前面 看下如何在侧边栏定义窗口,如下的效果: 1:正戏 先来定义UI,随便拖拽个组件,就看个效果: 接着定义一个工厂类来创建这个UI,需要实现接口com.intellij.openapi.wm.ToolWindowFactor…...
HarmonyOS未来五年的市场展望
一、引言 随着科技的不断进步和消费者对于智能化设备需求的日益增长,操作系统作为连接硬件与软件的核心平台,其重要性愈发凸显。HarmonyOS(鸿蒙系统),作为华为自主研发的分布式操作系统,自诞生以来便备受瞩…...
R语言:什么是向量化操作(Vectorization)?
在R语言中,向量化操作是一个非常重要且强大的概念。它不仅提高了代码的简洁性和可读性,还大大提升了代码的执行效率。本文将详细介绍什么是向量化操作,并通过几个示例来展示其应用。 什么是向量化操作? 向量化操作是指在不使用显…...
Python 机器学习 基础 之 【实战案例】中药数据分析项目实战
Python 机器学习 基础 之 【实战案例】中药数据分析项目实战 目录 Python 机器学习 基础 之 【实战案例】中药数据分析项目实战 一、简单介绍 二、中药数据分析项目实战 三、数据处理与分析实战 1、数据读取 2、中药材数据集的数据处理与分析 2.1数据清洗 2.2、 提取别…...
python中报错“ModuleNotFoundError: No module named ‘docx2txt‘”
python中from langchain_community.document_loaders import Docx2txtLoader报错“ModuleNotFoundError: No module named ‘docx2txt’” 问题描述: python中from langchain_community.document_loaders import Docx2txtLoader报错“ModuleNotFoundError: No module named ‘…...
json.dumps参数
json.dumps()是 Python 中json 模块的一个函数,用于将 Python 对象编码成 JSON格式的字符串。这个函数有几个常用的参数,下面是一些主要的参数及其描述: 1. **obj**: 必需。要转换的 Python 对象。 2. *…...
未来已来,划时代革命性产品——全息数字人管家系统,全网首发
尊敬的投资人、亲爱的网友们: 大家好,我是数字人管家项目总设计师,我叫William wang。在这个科技日新月异的时代,我们正站在一个前所未有的交汇点上,数字与现实的边界日益模糊,智能技术正以前所未有的方式…...
psql导入数据报错排查
问题:采用pg_dump导出表数据后,用psql导入表数据,导入时报错 无效的命令 \N定位该问题的方法 --进入psql \set ON_ERROR_STOP on --退出psqlpsql -U postgres -d test -v ON_ERROR_STOPon < /home/postgres/test.dmp参考文章:…...
项目:双人五子棋对战-对战模块(6)
完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 当玩家进入到游戏房间后, 就要开始一局紧张而又刺激的五子棋对战了, 本文将就前端后端的落子与判断胜负的部分作详细讲解. 模块详细讲解 约定前后端交互的接口 首先是建立连接后, 服务器需要生成一些游戏的初始信息(可…...
上海网站制作最大的公司/广告传媒公司
第一部分 前景提要一、背景用Go搭一个小项目, 按传统的套路把开发环境和生产环境配置信息写在配置文件config.json中, 初始化加载配置,解析出数据。看着是解析一个JSON的小事,过程中却发生了3次演进:1、定义一个配置文件对应的结构体。2、递归…...
wordpress博客备案/广告推广图片
本节书摘来自异步社区《深入理解JavaScript》一书中的第1章,第1.2节,作者: 【美】AxelRauschmayer(罗彻麦尔)译者: 王玉林 , 杜欢 , 庄婷婷 , 章子鹏,更多章节内容可以访问云栖社区“异步社区”…...
重庆高端网站设计/百度搜索seo
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇来自公众号:InfoQ整理|燕珊、核子可乐当冲突爆发且到了必须让程序员离开时……那让他们“及时离开”吧。 假如你已经对某个开发人员下发解雇通…...
做网站比较专业的公司/一个产品的网络营销方案
1. git 本地项目关联远程项目, 并推送到远程新分支(推送时在远程新建立一个分支) 1.1 在git bash 中或其他命令行中进入本地项目文件夹 1.2 创建本地仓库 git init .注意后面的 . 意思是当前目录,不能省略 1.3 把本地项目提交到本地仓库: #先把当前…...
哪个网站做首饰批发好/seo网站建设优化什么意思
夜光序言: 流星坠落 湖面水波清越 远方 被你轻轻擦去的灰白 令人向往 月光照耀枝头 为谁停留 青年抬起头,深邃的眼眸中似乎有点感伤,但是他紧握的双手似也表明着他的决心 俄罗斯方块告诉我们 太和群了 人就会消失 而不合群的话…...
棋牌网站开发多少钱/免费加客源软件
添加链接描述 数论: 三种情况: 1.找到最大的数,如果这个数是<0,说明都是负数或0,找到最大的负奇数既答案 2.最大的正数和为奇数,为答案, 3.最大的正数和为偶数,判断减去最小正奇数…...