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

Java把列表数据导出为PDF文件,同时加上PDF水印

一、实现效果

在这里插入图片描述

二、遇到的问题

  1. 实现导出PDF主体代码参考:Java纯代码实现导出PDF功能,下图是原作者实现的效果
    在这里插入图片描述
  2. 导出报错Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized.。参考:itext 生成 PDF(五) 使用外部字体

网上都是说jar包的版本不对,导致的字体兼容性问题。换了jar包版本发现没效果,后来索性直接把字体下载到本地直接引入。

  1. jar包发布到服务器上导出PDF的时候发生报错BOOT-INF/classes!/fonts/SimSun.ttf not exists

可以看到字体文件在jar目录下面是有的,但是发现classes后面多了个叹号。这是引入外部字体方式不对,后改用问题2参考文章的第三种写法就没问题了。

  1. 添加水印参考:itextpdf5.5.13给pdf添加图片水印、添加文字水印(平铺)、添加文字水印(单个)、添加页眉、页脚、页眉事件、添加图片

三、测试数据展示

list:子节点数据
0 = {BasBudgetDetailVo@16046} "BasBudgetDetailVo(budgetId=2064535550, functionId=231231232, budgetQuantity=3, totalPrice=2664.00, functionName=功能1, functionDescription=功能1描述, functionUnit=套, functionPrice=888.00, parentId=231234512, functionSort=1)"
1 = {BasBudgetDetailVo@16047} "BasBudgetDetailVo(budgetId=2039369726, functionId=231236478, budgetQuantity=1, totalPrice=888.00, functionName=功能1, functionDescription=功能1描述, functionUnit=套, functionPrice=888.00, parentId=231234879, functionSort=1)"
2 = {BasBudgetDetailVo@16048} "BasBudgetDetailVo(budgetId=2039369725, functionId=231236473, budgetQuantity=1, totalPrice=888.00, functionName=功能2, functionDescription=功能2描述, functionUnit=套, functionPrice=888.00, parentId=231234879, functionSort=2)"
3 = {BasBudgetDetailVo@16049} "BasBudgetDetailVo(budgetId=2056146943, functionId=231231241, budgetQuantity=1, totalPrice=888.00, functionName=功能2, functionDescription=功能2描述, functionUnit=套, functionPrice=888.00, parentId=231234512, functionSort=2)"
4 = {BasBudgetDetailVo@16050} "BasBudgetDetailVo(budgetId=2047758334, functionId=231236487, budgetQuantity=1, totalPrice=888.00, functionName=功能3, functionDescription=功能3描述, functionUnit=套, functionPrice=888.00, parentId=231234512, functionSort=3)"
5 = {BasBudgetDetailVo@16051} "BasBudgetDetailVo(budgetId=2039369724, functionId=231231245, budgetQuantity=1, totalPrice=888.00, functionName=功能3, functionDescription=功能3描述, functionUnit=套, functionPrice=888.00, parentId=231234879, functionSort=3)"
6 = {BasBudgetDetailVo@16052} "BasBudgetDetailVo(budgetId=2047758333, functionId=231231597, budgetQuantity=1, totalPrice=888.00, functionName=功能4, functionDescription=功能4描述, functionUnit=套, functionPrice=888.00, parentId=231234512, functionSort=4)"
7 = {BasBudgetDetailVo@16053} "BasBudgetDetailVo(budgetId=2030981118, functionId=231233154, budgetQuantity=1, totalPrice=888.00, functionName=功能4, functionDescription=功能4描述, functionUnit=套, functionPrice=888.00, parentId=231234879, functionSort=4)"
8 = {BasBudgetDetailVo@16054} "BasBudgetDetailVo(budgetId=2030981117, functionId=231234596, budgetQuantity=1, totalPrice=888.00, functionName=功能5, functionDescription=功能5描述, functionUnit=套, functionPrice=888.00, parentId=231234879, functionSort=5)"
9 = {BasBudgetDetailVo@16055} "BasBudgetDetailVo(budgetId=2030981116, functionId=231235487, budgetQuantity=1, totalPrice=888.00, functionName=功能6, functionDescription=功能6描述, functionUnit=套, functionPrice=888.00, parentId=231234879, functionSort=6)"functionInfoList:根节点数据
0 = {BasFunctionInfo@16090} "BasFunctionInfo(functionId=231234512, functionName=模块1, functionDescription=, functionUnit=0, functionPrice=0.00, createName=管理员, createBy=admin, createTime=Wed Jan 24 16:56:35 CST 2024, updateName=管理员, updateBy=admin, updateTime=Wed Jan 24 16:56:38 CST 2024, functionQuantity=null, functionSort=1, parentId=null)"
1 = {BasFunctionInfo@16091} "BasFunctionInfo(functionId=231234879, functionName=模块2, functionDescription=, functionUnit=0, functionPrice=0.00, createName=管理员, createBy=admin, createTime=Wed Jan 24 16:56:35 CST 2024, updateName=管理员, updateBy=admin, updateTime=Wed Jan 24 16:56:38 CST 2024, functionQuantity=null, functionSort=2, parentId=null)"matchList:当前节点的子节点数据

四、jar包引入

<!--导出pdf所需包-->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
</dependencies>

五、外部字体引入

字体文件资源自己百度,直接搜SimSun.ttf字体下载不难找
在这里插入图片描述

六、代码实现

private final ResourceLoader resourceLoader;public BasBudgetDetailServiceImpl(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;
}/*** 导出pdf* * @param response* @throws Exception*/
@Override
public void downloadPdf(HttpServletResponse response) throws Exception {// 业务数据,根据需求查询获取// 子节点数据List<BasBudgetDetailVo> list;// 根子节点数据List<BasFunctionInfo> functionInfoList;// 定义全局的字体静态变量Font content = null;Resource resource = resourceLoader.getResource("classpath:/fonts/SimSun.ttf");InputStream inputStream = resource.getInputStream();BaseFont bfChinese = null;try {// 字体bfChinese = BaseFont.createFont("SimSun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, IOUtils.toByteArray(inputStream), null);content = new Font(bfChinese, 10, Font.NORMAL);} catch (Exception e) {e.printStackTrace();}BaseFont bf = null;Font font = null;try {//创建字体bf = BaseFont.createFont("SimSun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, IOUtils.toByteArray(inputStream), null);//使用字体并给出颜色font = new Font(bf, 20, Font.BOLD, BaseColor.BLACK);} catch (Exception e) {e.printStackTrace();}Document document = new Document(new RectangleReadOnly(842F, 595F));try {PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());//打开生成的pdf文件document.open();//设置标题Paragraph paragraph = new Paragraph("这是标题文档标题", font);paragraph.setAlignment(1);//引用字体document.add(paragraph);// 总额BigDecimal detailTotal = BigDecimal.valueOf(0);for (BasFunctionInfo functionInfo : functionInfoList) {// 匹配明细List<BasBudgetDetailVo> matchList = list.stream().filter(item ->String.valueOf(item.getParentId()).equals(String.valueOf(functionInfo.getFunctionId()))).collect(Collectors.toList());// 设置表格的列宽和列数float[] widths = {10f, 35f, 70f, 10f, 10f, 20f, 20f};PdfPTable table = new PdfPTable(widths);table.setSpacingBefore(20f);// 设置表格宽度为100%table.setWidthPercentage(100.0F);table.setHeaderRows(1);table.getDefaultCell().setHorizontalAlignment(1);//列表-表头String[] titleList = new String[]{"序号", "功能名称", "功能描述", "数量", "单位", "单价(元)", "总价(元)"};addTableTitle(table, content, titleList);// 模块总额BigDecimal modelTotal = BigDecimal.valueOf(0);//列表数据if (matchList.size() > 0) {Integer index = 1;for (BasBudgetDetailVo item : matchList) {PdfPCell cell1 = new PdfPCell(new Paragraph(String.valueOf(index), content));PdfPCell cell2 = new PdfPCell(new Paragraph(item.getFunctionName(), content));PdfPCell cell3 = new PdfPCell(new Paragraph(item.getFunctionDescription(), content));PdfPCell cell4 = new PdfPCell(new Paragraph(String.valueOf(item.getBudgetQuantity()), content));PdfPCell cell5 = new PdfPCell(new Paragraph(item.getFunctionUnit(), content));PdfPCell cell6 = new PdfPCell(new Paragraph(String.valueOf(item.getFunctionPrice()), content));BigDecimal totalPrice = item.getFunctionPrice().multiply(BigDecimal.valueOf(item.getBudgetQuantity()));PdfPCell cell7 = new PdfPCell(new Paragraph(String.valueOf(totalPrice), content));//单元格对齐方式cell1.setFixedHeight(20);cell1.setHorizontalAlignment(Element.ALIGN_CENTER);cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);// 文字长度大于15的时候,设置表格行间距,底边距离if (item.getFunctionName().length() > 15) {cell2.setLeading(0f, 1.5f);cell2.setPaddingBottom(10);}cell2.setHorizontalAlignment(Element.ALIGN_CENTER);cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);// 文字长度大于30的时候,设置表格行间距,底边距离if (item.getFunctionDescription().length() > 30) {cell3.setLeading(0f, 1.5f);cell3.setPaddingBottom(10);}cell3.setHorizontalAlignment(Element.ALIGN_CENTER);cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);cell4.setHorizontalAlignment(Element.ALIGN_CENTER);cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);cell5.setHorizontalAlignment(Element.ALIGN_CENTER);cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);cell6.setHorizontalAlignment(Element.ALIGN_CENTER);cell6.setVerticalAlignment(Element.ALIGN_MIDDLE);cell7.setHorizontalAlignment(Element.ALIGN_CENTER);cell7.setVerticalAlignment(Element.ALIGN_MIDDLE);table.addCell(cell1);table.addCell(cell2);table.addCell(cell3);table.addCell(cell4);table.addCell(cell5);table.addCell(cell6);table.addCell(cell7);// 序号index++;modelTotal = modelTotal.add(totalPrice);}// 合计行PdfPCell cell1 = new PdfPCell(new Paragraph("合计", content));cell1.setFixedHeight(20);cell1.setHorizontalAlignment(Element.ALIGN_CENTER);cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);// 空格PdfPCell cell2 = new PdfPCell(new Paragraph("", content));cell2.setFixedHeight(20);cell2.setHorizontalAlignment(Element.ALIGN_CENTER);cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);// 数额PdfPCell cell3 = new PdfPCell(new Paragraph(String.valueOf(modelTotal), content));cell3.setFixedHeight(20);cell3.setHorizontalAlignment(Element.ALIGN_CENTER);cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);table.addCell(cell1);table.addCell(cell2);table.addCell(cell2);table.addCell(cell2);table.addCell(cell2);table.addCell(cell2);table.addCell(cell3);detailTotal = detailTotal.add(modelTotal);}document.add(new Paragraph("\n"));document.add(new Paragraph("▋ " + functionInfo.getFunctionName(), content));document.add(table);document.add(new Paragraph("\n"));if (matchList.size() == 0) {document.add(new Paragraph("暂无数据", content));}}document.add(new Paragraph("\n"));document.add(new Paragraph("总计:" + detailTotal + "元", content));// 加水印PdfContentByte waterMar = pdfWriter.getDirectContentUnder();String text = "天天想辞职月月拿全勤";addTextFullWaterMark(waterMar, text, bfChinese);document.close();} catch (DocumentException e) {e.printStackTrace();log.error("导出pdf失败:{}", e);}
}/*** 给表格添加表头** @param table* @param content* @param titleList*/
public void addTableTitle(PdfPTable table, Font content, String[] titleList) {PdfPCell cell = null;for (String title : titleList) {cell = new PdfPCell(new Paragraph(title, content));cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setFixedHeight(20);cell.setNoWrap(false);table.addCell(cell);}
}/*** 给pdf添加文字水印(平铺)** @param waterMar* @param text     水印文本* @throws Exception*/
public static void addTextFullWaterMark(PdfContentByte waterMar, String text, BaseFont bf) {waterMar.beginText();PdfGState gs = new PdfGState();// 设置填充字体不透明度为0.2fgs.setFillOpacity(0.2f);waterMar.setFontAndSize(bf, 20);// 设置透明度waterMar.setGState(gs);// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度for (int x = 0; x <= 900; x += 200) {for (int y = -50; y <= 800; y += 200) {waterMar.showTextAligned(Element.ALIGN_RIGHT, text, x, y, 35);}}// 设置水印颜色waterMar.setColorFill(BaseColor.GRAY);//结束设置waterMar.endText();waterMar.stroke();
}

相关文章:

Java把列表数据导出为PDF文件,同时加上PDF水印

一、实现效果 二、遇到的问题 实现导出PDF主体代码参考&#xff1a;Java纯代码实现导出PDF功能&#xff0c;下图是原作者实现的效果 导出报错Font STSong-Light with UniGB-UCS2-H is not recognized.。参考&#xff1a;itext 生成 PDF(五) 使用外部字体 网上都是说jar包的版本…...

const与readonly详解

const与readonly详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入探讨在TypeScript中常用的const与readonly关键字&#xff0c;了解它…...

ArcGIS Pro 如何计算长度和面积等数据?

要素的几何属性属于比较重要的信息&#xff0c;作为一款专业的GIS软件&#xff0c;ArcGIS Pro自然也是带有计算几何的功能&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的矢量数据&#xff0c;除了矢…...

IntelliJ创建一个springboot工程

安装jdk mac教程 windows教程 安装maven mac教程 windows教程 建议&#xff1a; 在本地磁盘新建一个文件夹叫maven&#xff0c;然后把下载的maven安装到这里。在后续的IntelliJ操作中&#xff0c;配置maven的settings.xml和repository地址为这个目录下的地址。 创建sprin…...

Spark入门02-Spark开发环境配置(idea环境)

安装与配置Spark开发环境 1.下载解压安装包 https://archive.apache.org/dist/spark/spark-2.1.2/ https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.3.4/ 2、新建Scala项目 参考https://blog.csdn.net/weixin_38383877/article/details/135894760 3、项目中引…...

Codeforces Round 886 (Div. 4)

目录 A. To My Critics B. Ten Words of Wisdom C. Word on the Paper D. Balanced Round E. Cardboard for Pictures F. We Were Both Children G. The Morning Star H. The Third Letter A. To My Critics 直接模拟 void solve(){int a,b,c; cin>>a>>b&…...

Pull模式和Push模式

Pull模式是一种消息消费模式&#xff0c;其中客户端主动从服务端拉取数据。 优点&#xff1a;客户端可以根据自己的消费能力来消费数据&#xff0c;不存在消息堆积的情况。 缺点&#xff1a;消息处理可能不及时&#xff0c;可能存在大量无效请求&#xff0c;客户端需要考虑拉取…...

高端车规MCU的破局之路

目录 1 低质量的无效内卷 2 高端车规MCU产品共性 2.1 支持标定测量 2.2 低延迟通信加速 2.3 完备的网络安全解决方案 2.4虚拟化 3 国产替代的囚徒困境 1 低质量的无效内卷 近几年&#xff0c;车规MCU国产替代的呼声此消彼长&#xff0c;但仍然集中在低端产品。 从产…...

活字格V9获取图片失败bug,报错404,了解存储路径,已改为批量上传和批量获取

项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 完成了批量上传功能&#xff0c;这插件真的很方便 于是写了个批量获取附件的js代码&#xff0c;我真厉害 项目场景&#xff1a; 活字格V9版本获取图片链接Upload 【9.0.103.0】图片上传的存储路…...

【Echart】echart图表不显示总结

【Echart】echart图表不显示 经常遇到的场景&#xff1a;v-if和el-tabs切换图表不显示图表&#xff1b; 1、echarts.init时确认dom容器是否设置了宽高&#xff0c;必须设置宽高&#xff1b; 错误写法 <div id"line" ref"lineChart" width"100%&qu…...

vue 组件之间相互传值的6种方法

Vue.js 中组件间通信的方法有很多种&#xff0c;以下是6种常见的直接或间接的组件传值方式&#xff1a; 1. Props&#xff08;父向子&#xff09; 优点&#xff1a; 易于理解&#xff0c;符合单向数据流的原则&#xff0c;有利于代码维护。 缺点&#xff1a; 数据只能从父组件…...

开源大规模分布式MQTT消息服务器EMQX部署教程

1.EMQX是什么&#xff1f; EMQX 是一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息&#xff0c;并…...

postgresql慢查询排查和复现

postgresql慢查询排查和复现 一. 介绍一张表&#xff1a;pg_stat_activity pg_stat_activity 是 PostgreSQL 中一个非常有用的系统视图&#xff0c;提供了有关当前数据库连接和活动查询的信息。通过查询这个视图&#xff0c;你可以获取有关正在执行的查询、连接的用户、进程 …...

【服务器】搭建ChatGPT站点常见问题

目录 ❓ 常见问题 &#x1f33c;1. 什么是OpenAI APIkey? &#x1f33c;2. 什么是Token&#xff1f; &#x1f33c;3. 为什么回复不是GPT-4&#xff1f; &#x1f33c;4. 如何区分 GPT-3.5 和 GPT-4 &#x1f33c;5. 为什么回复到一半卡住&#xff1f; &#x1f33c;6.…...

QT+opengl 创建一个六边形

一.关键名词解释 VAO: Vertex Array Object, 顶点数组对象&#xff0c;你要绘制的图形。 VBO:Vertex Buffer Object, 顶点缓冲对象&#xff0c;所有顶点的集合。 EBO:Element Buffer Object, 元素缓冲对象&#xff0c;顶点的索引值。 IBO: Index Buffer Object, 索引缓冲对象。…...

Android imageView.setImageXXX() 引发的卡顿问题

在 Android 开发中&#xff0c;ImageView 是一个用户界面控件&#xff0c;用于在应用中显示图片。它是 Android UI 组件库中一个非常基础和常用的部分。使用 ImageView&#xff0c;你可以在屏幕上显示来自不同来源的图像&#xff0c;比如位图文件、绘图资源 drawable、网络来源…...

MavenGradle等引入jSerialComm

引入 jSerialComm [2.0.0,3.0.0) 此版本发布于 Nov 7, 2023 (23年11月) Maven: <dependency><groupId>com.fazecast</groupId><artifactId>jSerialComm</artifactId><version>[2.0.0,3.0.0)</version> </dependency>Ivy: …...

热门技术问答 | 请 GaussDB 用户查收

近年来&#xff0c;Navicat 与华为云 GaussDB 展开一系列技术合作&#xff0c;为 GaussDB 用户提供面向管理开发工具的生态工具。Navicat 现已完成 GaussDB 主备版&#xff08;单节点、多节点&#xff09;和分布式数据库的多项技术对接。Navicat 通过工具的流畅性和实用性&…...

【C/C++ 01】初级排序算法

排序算法通常是针对数组或链表进行排序&#xff0c;在C语言中&#xff0c;需要手写排序算法完成对数据的排序&#xff0c;排序规则通常为升序或降序&#xff08;本文默认为升序&#xff09;&#xff0c;在C中&#xff0c;<algorithm>头文件中已经封装了基于快排算法的 st…...

Android Settings 显示电池点亮百分比

如题&#xff0c;Android 原生 Settings 里有个 电池电量百分比 的选项&#xff0c;打开后电池电量百分比会显示在状态栏。 基于 Android 13 &#xff0c; 代码在 ./packages/apps/Settings/src/com/android/settings/display/BatteryPercentagePreferenceController.java &am…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...