SpringBoot 集成 html2Pdf
一、概述:
1. springboot如何生成pdf,接口可以预览可以下载
2. vue下载通过bold如何下载
3. 一些细节:页脚、页眉、水印、每一页得样式添加
二、直接上代码【主要是一个记录下次开发更快】
模板位置
1. 导入pom包
<dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>5.0.5</version>
</dependency>
<!-- 中文字体支持 -->
<dependency><groupId>com.itextpdf</groupId><artifactId>font-asian</artifactId><version>7.2.1</version>
</dependency>
2. 写工具类
[1] 页眉工具类
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import org.springframework.util.StringUtils;
import java.net.MalformedURLException;
import java.net.URL;public class HeaderMarkerEventHandler implements IEventHandler {/*** pdf字体*/private final PdfFont pdfFont;/*** 页眉显示*/private final String title;/*** logo地址*/private String logoUrl;public HeaderMarkerEventHandler(PdfFont pdfFont, String title) {this.pdfFont = pdfFont;this.title = title;}public HeaderMarkerEventHandler(PdfFont pdfFont, String title, String logoUrl) {this.pdfFont = pdfFont;this.title = title;this.logoUrl = logoUrl;}@Overridepublic void handleEvent(Event event) {PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfDocument pdf = docEvent.getDocument();PdfPage page = docEvent.getPage();Rectangle pageSize = page.getPageSize();PdfCanvas pdfCanvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), pdf);Canvas canvas = new Canvas(pdfCanvas, pageSize);float x = pageSize.getRight() - 60;float y = pageSize.getTop() - 32;Paragraph p = new Paragraph(title).setFontSize(9).setFont(pdfFont);// 页眉字体显示得位置canvas.showTextAligned(p, x, y, TextAlignment.RIGHT);// 加载图片if (!StringUtils.isEmpty(logoUrl)) {try {URL url = new URL(logoUrl);Image logo = new Image(ImageDataFactory.create(url));logo.scaleAbsolute(100, 20);logo.setMarginLeft(30);logo.setMarginTop(15);canvas.add(logo);} catch (MalformedURLException e) {System.out.println("logo 无法解析: " + logoUrl);}}canvas.close();}
}
[2] 水印工具类
import com.itextpdf.kernel.colors.WebColors;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.VerticalAlignment;
import java.io.IOException;/*** 生成 pdf 水印*/
public class WaterMarkEventHandler implements IEventHandler {/*** 水印内容*/private final String waterMarkContent;/*** 一页中有几列水印*/private final int waterMarkX;/*** 一页中每列有多少水印*/private final int waterMarkY;public WaterMarkEventHandler(String waterMarkContent) {this(waterMarkContent, 5, 5);}public WaterMarkEventHandler(String waterMarkContent, int waterMarkX, int waterMarkY) {this.waterMarkContent = waterMarkContent;this.waterMarkX = waterMarkX;this.waterMarkY = waterMarkY;}@Overridepublic void handleEvent(Event event) {PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;PdfDocument document = documentEvent.getDocument();PdfPage page = documentEvent.getPage();Rectangle pageSize = page.getPageSize();PdfFont pdfFont = null;try {pdfFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");} catch (IOException e) {throw new RuntimeException(e);}PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), document);Paragraph waterMark = new Paragraph(waterMarkContent).setOpacity(0.5f);Canvas canvas = new Canvas(pdfCanvas, pageSize).setFontColor(WebColors.getRGBColor("lightgray")).setFontSize(16).setFont(pdfFont);for (int i = 0; i < waterMarkX; i++) {for (int j = 0; j < waterMarkY; j++) {canvas.showTextAligned(waterMark, (150 + i * 300), (160 + j * 150), document.getNumberOfPages(),TextAlignment.CENTER, VerticalAlignment.BOTTOM, 120);}}canvas.close();}
}
[3]添加页脚工具类
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;/*** 生成 pdf 页码*/
public class PageEventHandler implements IEventHandler {/*** pdf字体*/private final PdfFont pdfFont;public PageEventHandler(PdfFont pdfFont) {this.pdfFont = pdfFont;}@Overridepublic void handleEvent(Event event) {PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;PdfDocument document = documentEvent.getDocument();PdfPage page = documentEvent.getPage();Rectangle pageSize = page.getPageSize();PdfCanvas pdfCanvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), document);Canvas canvas = new Canvas(pdfCanvas, pageSize);float x = (pageSize.getLeft() + pageSize.getRight()) / 2;float y = pageSize.getBottom() + 15;Paragraph paragraph =new Paragraph(""+document.getPageNumber(page) ).setFontSize(10).setFont(pdfFont);canvas.showTextAligned(paragraph, x, y, TextAlignment.CENTER);canvas.close();}
}
[4]工具类;重点说一下这个字体:
1. 本文第一个图里面font得字体路径在Windows电脑:C:\Windows\Fonts;看中哪个字体就直接拷贝进去进会自动生成ttc文件;我拷贝得是宋体和微软雅黑,主要解决加粗
2.前端
font-family: "MicrosoftYaHei-Bold";
这个字体得名字日下图:
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import java.io.*;
import java.nio.charset.StandardCharsets;/*** PDF工具** @author ppp* @date 2022/8/5*/
public class Html2PdfUtil {static {Velocity.setProperty(RuntimeConstants.INPUT_ENCODING, StandardCharsets.UTF_8);Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");Velocity.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());Velocity.init();}/*** 据模板生成pfd格式文件** @param context 上下文对象* @param template pdf模板* @param outputStream 生成ofd文件输出流*/public static void pdfFile(Context context, String template, OutputStream outputStream, String watermarkText) throws IOException {PdfWriter pdfWriter = null;PdfDocument pdfDocument = null;StringWriter writer = null;try {pdfWriter = new PdfWriter(outputStream);pdfDocument = new PdfDocument(pdfWriter);PageSize pageSize = new PageSize(842.0F,595.0F);pdfDocument.setDefaultPageSize(pageSize);ConverterProperties properties = new ConverterProperties();// 添加字体FontProvider fontProvider = new FontProvider();// 字体设置,解决中文不显示问题PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H");
// 添加宋体,html中使用SimSun,不指定则默认为第一个引入的字体sysFont = PdfFontFactory.createFont("font/simsun.ttc,0", PdfEncodings.IDENTITY_H);fontProvider.addFont(sysFont.getFontProgram(), PdfEncodings.IDENTITY_H);// 添加微软雅黑,html中使用MicrosoftYaHeisysFont = PdfFontFactory.createFont("font/msyh.ttc,0", PdfEncodings.IDENTITY_H);fontProvider.addFont(sysFont.getFontProgram(), PdfEncodings.IDENTITY_H);// 添加微软雅黑粗体,html中使用MicrosoftYaHei-BoldsysFont = PdfFontFactory.createFont("font/msyhbd.ttc,0", PdfEncodings.IDENTITY_H);fontProvider.addFont(sysFont.getFontProgram(), PdfEncodings.IDENTITY_H);// 处理微软雅黑及粗体描述符错乱问题processYaHeiFontDescriptor(fontProvider);properties.setFontProvider(fontProvider);// 添加页眉
// pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, new HeaderMarkerEventHandler(sysFont, "学校"));// 添加水印pdfDocument.addEventHandler(PdfDocumentEvent.INSERT_PAGE, new WaterMarkEventHandler(watermarkText));// 添加页脚pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new PageEventHandler(sysFont));// 读取html模板和赋值Template pfdTemplate = Velocity.getTemplate(template, "UTF-8");writer = new StringWriter();pfdTemplate.merge(context, writer);// 构建带有样式的 HTML 字符串StringBuilder htmlWithStyles = new StringBuilder();htmlWithStyles.append("<html><head><style>");// 如果有边距参数,则添加到样式中htmlWithStyles.append("@page { ");htmlWithStyles.append("margin-bottom: ").append(30).append("mm; ");htmlWithStyles.append("}");htmlWithStyles.append("</style></head><body>").append("</body></html>");// html转换PDFHtmlConverter.convertToPdf(writer.toString(), pdfDocument, properties);} catch (Exception e) {throw new RuntimeException("PFD文件生成失败", e);}finally {pdfDocument.close();writer.close();pdfWriter.close();}}
}
3.html模板,里面那个分页,就是新开一页,估计有点问题
【1】、td 换行得自己加
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"/>
</head>
<body>
<div class="contianer"><div><div class="fourth_title"><h4>2-2 专业群建设总目标</h4></div><div class="third_con"><p class="pFontCon">$!{xxxxmb.zyqjszmb}</p></div></div><div>#foreach($html in $canVasHtml)<div class="page-break">$html</div>#end</div></div>
</body>
<style>h1,h2 {font-style: italic;font-family: "MicrosoftYaHei-Bold";text-align: center;font-weight: bold; /* 加粗文本 */}td{white-space:normal;word-wrap:break-word;word-break:break-all;}@media print {.page-break {page-break-before: always; /* 在元素之前插入分页 */}}
/* 每次新开一个分页 */.page-break {page-break-before: always; /* 在元素之前插入分页 */}
</style
</html>
4. Service 只留了一部分代码
@Override
public void downloadAchievementsByPdf( HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream = null;try {response.reset();String fileName = schooleInfo.getXxmc();
// 这个是直接下载response.setHeader("Content-Type", "application/pdf");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".pdf", "utf-8"));// 这个是预览,访问接口页面打开得是一个FPD预览得页面
// response.setContentType("application/pdf");
// response.addHeader("Content-Disposition", "inline; filename=" + fileName);VelocityContext context = new VelocityContext();setBaseInfo(context, schooleInfo);context.put("zyqxxList", zyqjbxxTS);context.put("xxxxmb", zyqjbxxTInfoOne);// 获取指标数据List<Map<String, Object>> maps = (List<Map<String, Object>>) treeWithCanvas(schoolBookId, isTask, taskId, schoolId).get("data");List<String> canVasHtml = PdfTemplate.getCanVasHtml(maps);context.put("canVasHtml", canVasHtml);outputStream = response.getOutputStream();Html2PdfUtil.pdfFile(context, "templates/jxzpbPdf.html", outputStream, schooleInfo.getXxmc());} catch (Exception e) {e.printStackTrace();}finally {outputStream.close();}
}private void setBaseInfo(VelocityContext context, XxbcxxT schooleInfo) {// 1. 查询学校基本信息context.put("xmdw", schooleInfo.getXxmc());context.put("xmmc", schooleInfo.getXmmc());context.put("tbrq", DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD));context.put("jbdw", schooleInfo.getJbdw());context.put("szsf", schooleInfo.getSfbm() == null ? "" : ProvinceJson.getProName(schooleInfo.getSfbm()));
}
5. VUE代码
return request(url, {...params,method: 'GET',responseType: 'blob'}).then((data) => {const aLink = document.createElement('a');const blob = new Blob([data],{type: 'application/pdf'}); aLink.style.display = 'none';aLink.href = URL.createObjectURL(blob);aLink.setAttribute('download', fileName); document.body.appendChild(aLink);aLink.click();URL.revokeObjectURL(aLink.href); // 清除引用document.body.removeChild(aLink);});
三、最后还有一个加粗得问题。思路就是需要引入字体文件
相关文章:

SpringBoot 集成 html2Pdf
一、概述: 1. springboot如何生成pdf,接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节:页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…...
利用 Watchtower 自动监听并更新正在运行的 Docker 容器
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 大部分 VPS 和 NAS 用户或多或少都有用 Docker 来部署一些 Self-hosting 的服务,其中大部分项目都是开源项目,更新频率非常高,特别是一些版本 0.x 的项目,及…...

Nodejs开发仿马蜂窝旅游小程序API接口,服务器端开发,商家后台 Vue3+微信小程序+koa+mongodb+node.js
文章目录 🚀 开启您的互联网创业新篇章一、🔥 课程亮点:二、🌐 适合人群:学习这个课程后,您将会收获到三、旅游后台管理系统1.后台登录界面2.后台首页 四、前台旅游小程序1.首页展示2.目的地界面3.搜索功能…...
极限失控的大模型使电力系统面临的跨域攻击风险及应对措施
目录: 0 引言 1 就大模型发生极限失控的风险进行讨论的必要性、紧迫性 1.1 预训练的数据来源 1.2 能力涌现与不可解释性 1.3 大模型与物质世界的连接 1.4 数量效应与失控 1.5 大模型发生极限失控的风险 1.5.1 人工智能反叛所需要素能力的拼图 1.5.2 火种源…...
mybatis-plus方法无效且字段映射失败错误排查
问题: Invalid bound statement (not found): com.htlc.assetswap.mapper.WalletMapper.insert,并且select * 进行查询时带下划线的字段未成功映射。 排查: 1.检查WalletMapper接口,确保继承自BaseMapper 2.启用驼峰命名法映射。a…...

librdns一个开源DNS解析库
原文地址:librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器,用于DNS解析。 源代码地址:GitHub - vstakhov/librdns: Asynchrono…...
Unity3D 逻辑服的Entity, ComponentData与System划分详解
前言 在Unity3D中,逻辑服(Entity, ComponentData和System)是一种非常高效的组件化设计模式,它可以帮助开发者更好地管理游戏中的实体和逻辑。本文将详细介绍Unity3D逻辑服的概念以及如何实现Entity、ComponentData和System的划分。 对惹,这…...

跟《经济学人》学英文:2024年11月23日这期 Why British MPs should vote for assisted dying
Why British MPs should vote for assisted dying A long-awaited liberal reform is in jeopardy in jeopardy:在危险中 jeopardy:美 [ˈdʒepərdi] 危险;危机;风险; 原文: THIS NEWSPAPER believes …...

基于阿里云服务器部署静态的website
目录 一:创建服务器实例并connect 二:本地文件和服务器share 三:关于IIS服务器的安装预配置 四:设置安全组 五:建站流程 六:关于备案 一:创建服务器实例并connect 创建好的服务器实例在云…...

【2024 Optimal Control 16-745】Ubuntu22.04 安装Julia
找不到Julia 内核 下载Julia curl -fsSL https://install.julialang.org | sh官网下载:Julia 安装 IJulia 打开 Julia REPL(在终端中输入 julia)并执行以下命令安装 IJulia: using Pkg Pkg.add("IJulia")这将为 Ju…...
nuget默认包管理格式:packages.config、packageReference区别
packages.config 和 PackageReference 是 NuGet 中的两种包管理格式,各有优劣,适用于不同的场景。以下是它们的详细对比: 1. packages.config 格式 这是 NuGet 的传统包管理格式,早期版本使用的默认方法。 特点 依赖声明文件&…...
element-plus教程:Input Number 数字输入框
一、基础用法 要使用Input Number数字输入框,只需要在<el-input-number>元素中使用v-model绑定变量即可。例如: <template><el-input-number v-model"value" /> </template><script lang"ts" setup>…...

M|横道世之介
rating: 8.0 豆瓣: 8.8 上映时间: “2013” 类型: M剧情爱情 导演: 冲田修一 Shichi Okita 主演: 冲田修一 Shichi Okita吉高由里子 Yuriko Yoshitaka 国家/地区: 日本 片长/分钟: 160分钟 M|横道世之介 横道世之介是一个热情、纯真的人,大家…...

借助算力云跑模型
算力平台:FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤(因为我也不熟练)。 【注】:进入平台,注册登录账号后,才能租用。学生认证+实名认证会有免费的算力资源࿰…...

LlamaIndex+本地部署InternLM实践
LlamaIndex本地部署InternLM实践 XTuner是一个调整模型参数的小工具,通过对于给定的大模型输入有限的参数来调整同类型问题的结果输出 LlamaIndex是一个将大语言模型(LLMs)和外部数据连接在一起的工具,主要用于增强大模型的知识获取能力…...
3.12MayBeSomeJava
接受是否为负数,原双精度数,最大有效位数,固定显示位数 FD类里的把二进制数转为ASCII数,为CONVERT对象类型 然后调用CONVERT类里的舍入函数判断是否舍入 通过调用fdConverter的decimalDigitsExact方法,获取转换后的…...

设计模式之 命令模式
命令模式(Command Pattern)是行为型设计模式之一,它将请求(或命令)封装成一个对象,从而使用户能够将请求发送者与请求接收者解耦。通过命令模式,调用操作的对象与执行操作的对象不直接关联&…...

24.11.23 Ajax
1动态网页技术与静态网页技术对比: 静态网页: 如果数据库中有用户列表 html中要显示 如果用户列表数据变化 html要改代码才能显示完整数据 (不能使用动态数据 ) 动态网页: servlet可以通过代码 以输出流显示数据 当数据库数据改变时 不需要改代码 2.为了解决html不能使用动…...

Sickos1.1 详细靶机思路 实操笔记
Sickos1.1 详细靶机思路 实操笔记 免责声明 本博客提供的所有信息仅供学习和研究目的,旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动,您将独自承担…...
rk3568-linux-5.10.160移植rtl8822cs wifi 模块纪要
rk3568-linux-5.10.160移植rtl8822cs wifi 模块纪要 1、将驱动添加到 kernel/drivers/net/wireless/rockchip_wlan/ 或者 kernel/drivers/net/wireless/realtek/rtlwifi/ 2、修改该目录下的makefile、kconfig 3、修改rtl8822cs/os_dep/linux/os_intfs.c,添加 MO…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...