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

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

一、概述&#xff1a; 1. springboot如何生成pdf&#xff0c;接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节&#xff1a;页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…...

利用 Watchtower 自动监听并更新正在运行的 Docker 容器

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 大部分 VPS 和 NAS 用户或多或少都有用 Docker 来部署一些 Self-hosting 的服务&#xff0c;其中大部分项目都是开源项目&#xff0c;更新频率非常高&#xff0c;特别是一些版本 0.x 的项目&#xff0c;及…...

Nodejs开发仿马蜂窝旅游小程序API接口,服务器端开发,商家后台 Vue3+微信小程序+koa+mongodb+node.js

文章目录 &#x1f680; 开启您的互联网创业新篇章一、&#x1f525; 课程亮点&#xff1a;二、&#x1f310; 适合人群&#xff1a;学习这个课程后&#xff0c;您将会收获到三、旅游后台管理系统1.后台登录界面2.后台首页 四、前台旅游小程序1.首页展示2.目的地界面3.搜索功能…...

极限失控的大模型使电力系统面临的跨域攻击风险及应对措施

目录&#xff1a; 0 引言 1 就大模型发生极限失控的风险进行讨论的必要性、紧迫性 1.1 预训练的数据来源 1.2 能力涌现与不可解释性 1.3 大模型与物质世界的连接 1.4 数量效应与失控 1.5 大模型发生极限失控的风险 1.5.1 人工智能反叛所需要素能力的拼图 1.5.2 火种源…...

mybatis-plus方法无效且字段映射失败错误排查

问题&#xff1a; Invalid bound statement (not found): com.htlc.assetswap.mapper.WalletMapper.insert&#xff0c;并且select * 进行查询时带下划线的字段未成功映射。 排查&#xff1a; 1.检查WalletMapper接口&#xff0c;确保继承自BaseMapper 2.启用驼峰命名法映射。a…...

librdns一个开源DNS解析库

原文地址&#xff1a;librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器&#xff0c;用于DNS解析。 源代码地址&#xff1a;GitHub - vstakhov/librdns: Asynchrono…...

Unity3D 逻辑服的Entity, ComponentData与System划分详解

前言 在Unity3D中&#xff0c;逻辑服(Entity, ComponentData和System)是一种非常高效的组件化设计模式&#xff0c;它可以帮助开发者更好地管理游戏中的实体和逻辑。本文将详细介绍Unity3D逻辑服的概念以及如何实现Entity、ComponentData和System的划分。 对惹&#xff0c;这…...

跟《经济学人》学英文: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&#xff1a;在危险中 jeopardy&#xff1a;美 [ˈdʒepərdi] 危险&#xff1b;危机&#xff1b;风险&#xff1b; 原文&#xff1a; THIS NEWSPAPER believes …...

基于阿里云服务器部署静态的website

目录 一&#xff1a;创建服务器实例并connect 二&#xff1a;本地文件和服务器share 三&#xff1a;关于IIS服务器的安装预配置 四&#xff1a;设置安全组 五&#xff1a;建站流程 六&#xff1a;关于备案 一&#xff1a;创建服务器实例并connect 创建好的服务器实例在云…...

【2024 Optimal Control 16-745】Ubuntu22.04 安装Julia

找不到Julia 内核 下载Julia curl -fsSL https://install.julialang.org | sh官网下载&#xff1a;Julia 安装 IJulia 打开 Julia REPL&#xff08;在终端中输入 julia&#xff09;并执行以下命令安装 IJulia&#xff1a; using Pkg Pkg.add("IJulia")这将为 Ju…...

nuget默认包管理格式:packages.config、packageReference区别

packages.config 和 PackageReference 是 NuGet 中的两种包管理格式&#xff0c;各有优劣&#xff0c;适用于不同的场景。以下是它们的详细对比&#xff1a; 1. packages.config 格式 这是 NuGet 的传统包管理格式&#xff0c;早期版本使用的默认方法。 特点 依赖声明文件&…...

element-plus教程:Input Number 数字输入框

一、基础用法 要使用Input Number数字输入框&#xff0c;只需要在<el-input-number>元素中使用v-model绑定变量即可。例如&#xff1a; <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&#xff5c;横道世之介 横道世之介是一个热情、纯真的人&#xff0c;大家…...

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…...

LlamaIndex+本地部署InternLM实践

LlamaIndex本地部署InternLM实践 XTuner是一个调整模型参数的小工具,通过对于给定的大模型输入有限的参数来调整同类型问题的结果输出 ‌LlamaIndex‌是一个将大语言模型&#xff08;LLMs&#xff09;和外部数据连接在一起的工具&#xff0c;主要用于增强大模型的知识获取能力…...

3.12MayBeSomeJava

接受是否为负数&#xff0c;原双精度数&#xff0c;最大有效位数&#xff0c;固定显示位数 FD类里的把二进制数转为ASCII数&#xff0c;为CONVERT对象类型 然后调用CONVERT类里的舍入函数判断是否舍入 通过调用fdConverter的decimalDigitsExact方法&#xff0c;获取转换后的…...

设计模式之 命令模式

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

24.11.23 Ajax

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

Sickos1.1 详细靶机思路 实操笔记

Sickos1.1 详细靶机思路 实操笔记 免责声明 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担…...

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&#xff0c;添加 MO…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...