springboot+itextpdf+thymeleaf+ognl根据静态模版文件实现动态生成pdf文件并导出demo

第一步:导入maven依赖

<!-- 导出为PDF依赖包 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.13.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.1.12</version></dependency>

第二步:制作thymeleaf静态模版文件并放置在resources目录下,可以自定义模版文件路径

如图所示

thymeleaf静态文件示例(附,在线实时制作预览html文件网址:https://www.jyshare.com/front-end/61/):
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"/><title>xxxx模版</title><style>#mainTable {border-collapse: collapse;border-style: solid;border-width: 0.5pt;width: 100%;}#mainTable td{text-align: center;padding: 8px;border-style: solid;border-width: 0.5pt;}</style>
</head><body><table id="header" boder="0" cellpadding="0" cellspacing="0" width="100%" style="margin-bottom:10px;margin-top:10px;"><tbody><tr><td id="img" rowspan="3"><img th:src="${xxxx}" style="border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;-ms-border-radius: 50%;-o-border-radius: 50%;width: 60%;height: 60%;"/></td><td id="mainTitle" colspan="5" th:text="'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+${xxxx}" style="font-size: 30px;font-style: '+';font-weight: bold;padding-left:30%;padding-bottom:10px;"></td></tr><tr><td></td><td id="xxxx" colspan="5" th:text="${xxxx}+哈哈" style="font-size: 30px;font-style: '+';font-weight: bold;padding-left:45%;padding-top:10px;"></td></tr><tr><td></td><td id="xxxx" colspan="5" style="text-align:right;padding-right:0px;">xxxx: <span  th:text="${xxxx}"></span></td></tr></tbody></table><table id="mainTable"><tbody><tr><td>xxxx</td><td th:text="${xxxx}"></td><td>xxxx</td><td th:text="${xxxx}"></td><td>xxxx</td><td th:text="${xxxx} + ${xxxx}"></td></tr><tr><td>xxxx</td><td colspan="2" th:text="${xxxx}"></td><td>xxxx</td><td colspan="2" th:text="${xxxx}"></td></tr><tr><td>xxxx</td><td colspan="2" th:text="${xxxx}"></td><td>xxxx</td><td colspan="2" th:text="${xxxx}"></td></tr><tr><td>xxxx</td><td colspan="2" th:text="${xxxx} + '/' + ${xxxx}"></td><td>xxxx</td><td colspan="2" th:text="${xxxx}"></td></tr><tr><td>xxxx</td><td colspan="5" style="text-align:left;" th:text="${xxxx}"></td></tr><tr><td>xxxx</td><td colspan="2" th:text="${xxxx}"></td><td>xxxx</td><td colspan="2" th:text="${xxxx}"></td></tr><tr><td height="250">xxxx</td><td colspan="5" style="text-align:left;" th:text="${xxxxx}"></td></tr><tr><td height="250">xxxx</td><td colspan="5" style="text-align:left;" th:text="${xxxx}"></td></tr><tr><td>xxxx</td><td colspan="5" style="text-align:left;"><img th:src="${xxxx}" style="width: 50%;height: 30%;"/></td></tr></tbody></table><div style="margin-top:40px;"><p>注:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p></div></body></html>

第三步:实现编写生成pdf与下载工具,注意区分项目格式是war包还是jar包,目前我这边是两套实现方案。

jar包的方案是否同样适用于war包,我这边没有尝试,有兴趣的可以自己尝试,然后在评论区分享一下。

1)在jar包环境下加载静态模版文件时的代码示例:

静态模版无需加载包含base64格式的图片内容时,可用以下代码处理:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;/*** @author leon* @date 2023/8/15* @description pdf 模版下载工具**/
@Component
@Slf4j
public class PdfTemplateDownload {@Autowiredprivate ApplicationContext applicationContext;/*** 下载pdf模版* @param response* @param paramMap* @param templateFileName* @param outputFileName*/public void downloadPdfTemplate(HttpServletResponse response,Map<String, Object> paramMap,String templateFileName,String outputFileName) {try {// 创建基于类路径资源的模板解析器SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();resolver.setApplicationContext(applicationContext); // 你需要注入Spring的应用上下文resolver.setTemplateMode(TemplateMode.HTML);resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());resolver.setCacheable(true); // 在开发阶段设置为false,生产环境可改为trueresolver.setPrefix("classpath:/file/");resolver.setSuffix(".html");// 创建模版引擎TemplateEngine engine = new TemplateEngine();engine.setTemplateResolver(resolver);// 填充变量参数Context context = new Context();paramMap.forEach((k,v) -> context.setVariable(k, v));// 替换变量值String output = engine.process(templateFileName, context);// 设置导出文件名String exportName = "attachment;filename="+outputFileName;response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));response.setContentType("application/mspdf");response.setCharacterEncoding("utf-8");// 新建Document对象Document document = new Document(PageSize.A4);// 新建PdfWriter对象PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());// 打开文档document.open();// 读取html文件内容InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(StandardCharsets.UTF_8));// 使用XMLWorkerHelper将html内容转为pdfXMLWorkerHelper xmlWorkerHelper = XMLWorkerHelper.getInstance();xmlWorkerHelper.parseXHtml(pdfWriter, document, htmlInputStream, Charset.forName("UTF-8"), new AsianFontProvider());// 关闭文档document.close();// 关闭输入流htmlInputStream.close();// 关闭文件输出流IOUtils.closeQuietly(response.getOutputStream());}catch (IOException e) {log.error("", e);}catch (DocumentException e) {log.error("", e);}}/*** 用于中文显示的Provider*/class AsianFontProvider extends XMLWorkerFontProvider {@Overridepublic Font getFont(final String fontname, String encoding, float size, final int style) {try {BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);return new Font(bfChinese, size, style);}catch (Exception e) {}return super.getFont(fontname, encoding, size, style);}}}
若静态模版中有base64格式的图片信息,可换用下边的方法实现

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFilesImpl;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.HTML;
import com.itextpdf.tool.xml.html.TagProcessorFactory;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;/*** @author leon* @date 2023/8/15* @description pdf 模版下载工具**/
@Component
@Slf4j
public class PdfTemplateDownload {@Autowiredprivate ApplicationContext applicationContext;/*** 下载pdf模版,用于模版中需要展示base64格式的图片信息* @param response* @param paramMap* @param templateFileName* @param outputFileName*/public void downloadPdfTemplateForBase64Img(HttpServletResponse response,Map<String, Object> paramMap,String templateFileName,String outputFileName) {try {// 创建基于类路径资源的模板解析器SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();resolver.setApplicationContext(applicationContext); // 你需要注入Spring的应用上下文resolver.setTemplateMode(TemplateMode.HTML);resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());resolver.setCacheable(true); // 在开发阶段设置为false,生产环境可改为trueresolver.setPrefix("classpath:/file/");resolver.setSuffix(".html");// 创建模版引擎TemplateEngine engine = new TemplateEngine();engine.setTemplateResolver(resolver);// 填充变量参数Context context = new Context();paramMap.forEach((k,v) -> context.setVariable(k, v));// 替换变量值String output = engine.process(templateFileName, context);// 设置导出文件名String exportName = "attachment;filename="+outputFileName;response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));response.setContentType("application/pdf");response.setCharacterEncoding("utf-8");// 新建Document对象Document document = new Document(PageSize.A4);// 新建PdfWriter对象PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());// 打开文档document.open();// 自定义处理base64图片final TagProcessorFactory htmlTagProcessorFactory = Tags.getHtmlTagProcessorFactory();htmlTagProcessorFactory.removeProcessor(HTML.Tag.IMG);htmlTagProcessorFactory.addProcessor(new ImageTagProcessor(),HTML.Tag.IMG);final Charset charset = StandardCharsets.UTF_8;final CssFilesImpl cssFiles = new CssFilesImpl();cssFiles.add(XMLWorkerHelper.getInstance().getDefaultCSS());final StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);final HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new AsianFontProvider()));hpc.setAcceptUnknown(true).autoBookmark(true).setTagFactory(htmlTagProcessorFactory);final HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, pdfWriter));final Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);final XMLWorker worker = new XMLWorker(pipeline, true);final XMLParser p = new XMLParser(true, worker, charset);// 读取html文件内容InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(charset));p.parse(htmlInputStream, charset);// 关闭文档document.close();// 关闭输入流htmlInputStream.close();// 关闭文件输出流IOUtils.closeQuietly(response.getOutputStream());}catch (IOException e) {log.error("", e);}catch (DocumentException e) {log.error("", e);}}/*** 用于中文显示的Provider*/class AsianFontProvider extends XMLWorkerFontProvider {@Overridepublic Font getFont(final String fontname, String encoding, float size, final int style) {try {BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);return new Font(bfChinese, size, style);}catch (Exception e) {}return super.getFont(fontname, encoding, size, style);}}}

2)在war包环境下加载静态模版文件时的代码示例:

包含了静态模版中需要加载与不需要加载base64格式的图片内容时的两个方法实现示例:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFilesImpl;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.HTML;
import com.itextpdf.tool.xml.html.TagProcessorFactory;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import com.wondersgroup.healthcloud.exception.CommonException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.FileTemplateResolver;import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;/*** @author leon* @date 2023/8/15* @description pdf 模版下载工具**/
@Component
@Slf4j
public class PdfTemplateDownload {/*** 下载pdf模版* @param response* @param paramMap* @param templateFileName* @param outputFileName*/public void downloadPdfTemplate(HttpServletResponse response,Map<String, Object> paramMap,String templateFileName,String outputFileName) {try {URL url = PdfTemplateDownload.class.getClassLoader().getResource("file/"+templateFileName);if (ObjectUtils.isEmpty(url)) {throw new CommonException("下载模版文件缺失");}File htmlFile = new File(url.getPath());// 创建html文件解析器FileTemplateResolver resolver = new FileTemplateResolver();resolver.setTemplateMode(TemplateMode.HTML);resolver.setSuffix(".html");// 创建模版引擎TemplateEngine engine = new TemplateEngine();engine.setTemplateResolver(resolver);// 填充变量参数Context context = new Context();paramMap.forEach((k,v) -> context.setVariable(k, v));// 替换变量值String output = engine.process(htmlFile.getAbsolutePath(), context);// 设置导出文件名String exportName = "attachment;filename="+outputFileName;response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));response.setContentType("application/pdf");response.setCharacterEncoding("utf-8");// 新建Document对象Document document = new Document(PageSize.A4);// 新建PdfWriter对象PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());// 打开文档document.open();// 读取html文件内容InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(StandardCharsets.UTF_8));// 使用XMLWorkerHelper将html内容转为pdfXMLWorkerHelper xmlWorkerHelper = XMLWorkerHelper.getInstance();xmlWorkerHelper.parseXHtml(pdfWriter, document, htmlInputStream, Charset.forName("UTF-8"), new AsianFontProvider());// 关闭文档document.close();// 关闭输入流htmlInputStream.close();// 关闭文件输出流IOUtils.closeQuietly(response.getOutputStream());}catch (IOException e) {log.error("", e);}catch (DocumentException e) {log.error("", e);}}/*** 下载pdf模版,用于模版中需要展示base64格式的图片信息* @param response* @param paramMap* @param templateFileName* @param outputFileName*/public void downloadPdfTemplateForBase64Img(HttpServletResponse response,Map<String, Object> paramMap,String templateFileName,String outputFileName) {try {URL url = PdfTemplateDownload.class.getClassLoader().getResource("file/"+templateFileName);if (ObjectUtils.isEmpty(url)) {throw new CommonException("下载模版文件缺失");}File htmlFile = new File(url.getPath());// 创建html文件解析器FileTemplateResolver resolver = new FileTemplateResolver();resolver.setTemplateMode(TemplateMode.HTML);resolver.setSuffix(".html");// 创建模版引擎TemplateEngine engine = new TemplateEngine();engine.setTemplateResolver(resolver);// 填充变量参数Context context = new Context();paramMap.forEach((k,v) -> context.setVariable(k, v));// 替换变量值String output = engine.process(htmlFile.getAbsolutePath(), context);// 设置导出文件名String exportName = "attachment;filename="+outputFileName;response.setHeader("Content-Disposition",new String(exportName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));response.setContentType("application/pdf");response.setCharacterEncoding("utf-8");// 新建Document对象Document document = new Document(PageSize.A4);// 新建PdfWriter对象PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());// 打开文档document.open();// 自定义处理base64图片final TagProcessorFactory htmlTagProcessorFactory = Tags.getHtmlTagProcessorFactory();htmlTagProcessorFactory.removeProcessor(HTML.Tag.IMG);htmlTagProcessorFactory.addProcessor(new ImageTagProcessor(),HTML.Tag.IMG);final Charset charset = StandardCharsets.UTF_8;final CssFilesImpl cssFiles = new CssFilesImpl();cssFiles.add(XMLWorkerHelper.getInstance().getDefaultCSS());final StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);final HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new AsianFontProvider()));hpc.setAcceptUnknown(true).autoBookmark(true).setTagFactory(htmlTagProcessorFactory);final HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, pdfWriter));final Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);final XMLWorker worker = new XMLWorker(pipeline, true);final XMLParser p = new XMLParser(true, worker, charset);// 读取html文件内容InputStream htmlInputStream = new ByteArrayInputStream(output.getBytes(charset));p.parse(htmlInputStream, charset);// 关闭文档document.close();// 关闭输入流htmlInputStream.close();// 关闭文件输出流IOUtils.closeQuietly(response.getOutputStream());}catch (IOException e) {log.error("", e);}catch (DocumentException e) {log.error("", e);}}/*** 用于中文显示的Provider*/class AsianFontProvider extends XMLWorkerFontProvider {@Overridepublic Font getFont(final String fontname, String encoding, float size, final int style) {try {BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);return new Font(bfChinese, size, style);}catch (Exception e) {}return super.getFont(fontname, encoding, size, style);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/563214.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL进阶——索引

索引 索引概述 索引结构 索引分类 索引语法 SQL性能分析 索引使用 索引设计原则 概述 介绍 索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结…

Linux安装Nginx及配置TCP负载均衡

目录 1、安装编译工具及库文件2、下载解压Nginx压缩包3、Ngnix配置Tcp负载均衡4、配置Ngnix的文件5、Nginx启动 1、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel2、下载解压Nginx压缩包 wget https://nginx.o…

135. 分发糖果(力扣LeetCode)

文章目录 135. 分发糖果题目描述贪心算法代码如下 总结 135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩…

PostgreSQL数据库中表的物理大小, 妙懂

数据库中表的物理大小 这是一个很有意思的话题。尤其是在我们做物理设计和空间大小评估的时候。 PostgreSQL中对于稍长一点的列&#xff0c;直接使用了TOAST表来存储&#xff0c;默认是会对表中的数据进行压缩的。关于TOAST, 以后或有时间专门做简单介绍。 先看看相关函数的定…

LabVIEW比例流量阀自动测试系统

LabVIEW比例流量阀自动测试系统 开发了一套基于LabVIEW编程和PLC控制的比例流量阀自动测试系统。通过引入改进的FCMAC算法至测试回路的压力控制系统&#xff0c;有效提升了压力控制效果&#xff0c;展现了系统的设计理念和实现方法。 项目背景&#xff1a; 比例流量阀在液压…

Docker入门到实践之环境配置

Docker入门到实践之环境配置 docker 环境安装 Ubuntu/Debian: sudo apt update sudo apt install docker.ioCentOS/RHEL: sudo yum install dockerArch Linux: sudo pacman -S docker如果未安装成功&#xff0c;或者env的path未设置成功&#xff0c;运行时会报错 Bash: Do…

训练不了AI,怎么办?

即使直接训练人工智能&#xff08;AI&#xff09;模型对许多人来说可能是一个技术上和资源上的挑战&#xff0c;仍然有多种方式可以参与、利用和推动AI技术的发展&#xff0c;而不必直接参与到模型的训练过程中。以下是一些可以考虑的途径&#xff1a; 1. 使用现有的AI服务和工…

每日一题 --- 螺旋矩阵 II[力扣][Go]

螺旋矩阵 II 题目&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出…

强化学习之父Richard Sutton:通往AGI的另一种可能

2019年&#xff0c;强化学习之父、阿尔伯塔大学教授Richard Sutton发表了后来被AI领域奉为经典的The Bitter lesson&#xff0c;这也是OpenAI研究员的必读文章。 在这篇文章中&#xff0c;Richard指出&#xff0c;过去 70 年来&#xff0c;AI 研究的一大教训是过于重视人类既有…

鸿蒙ArkUI【开发移植Carbon】

项目介绍 本项目是基于开源项目[Carbon] 进行harmonyos化的移植和开发的。 移植版本&#xff1a;Branches/master 这不是单纯只是API和基本功能展示demo&#xff0c;它是最有用的自定义控件的实现&#xff0c;如设计规范中所示。 Carbon试图&#xff1a; 让事情变得更简单&…

PySide6-YOLO8目标检测、追踪可视化界面

目录 项目地址实现效果DetectTrack 项目地址 https://github.com/zhengjie9510/pyside-yolo 实现效果 Detect Track

SpringBoot2.x 整合SpringDocJavadocknife4j实现无注解零入侵式接口文档

说明 基于 javadoc 无注解零入侵生成规范的 openapi 结构体。 文档工具使用 由于框架采用 openapi 行业规范 故市面上大部分的框架均支持 可自行选择 例如: apifox apipost postman torna knife4j 等 根据对应工具的文档接入即可 Swagger升级SpringDoc指南 常见功能如下 其他…