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 {

    @Autowired
    private 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,生产环境可改为true
            resolver.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内容转为pdf
            XMLWorkerHelper 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 {
        @Override
        public 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 {


    @Autowired
    private 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,生产环境可改为true
            resolver.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 {
        @Override
        public 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内容转为pdf
            XMLWorkerHelper 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 {
        @Override
        public 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);
        }
    }



}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xAI开发的一款巨大型语言模型(HLM)--Grok 1

在xAI发布Grok的权重和架构之后&#xff0c;很明显大型语言模型&#xff08;LLM&#xff09;的时代已经过去&#xff0c;现在是巨大型语言模型&#xff08;HLM&#xff09;的时代。这个混合专家模型发布了3140亿个参数&#xff0c;并且在Apache 2.0许可下发布。这个模型没有针对…

C++关于类和对象的基础语法

前言&#xff1a; 介绍c中类和对象的基础语法和注意事项&#xff0c;这里是c入门的第一道坎&#xff0c;细节很多&#xff0c;在后面的更深的学习中还会反复提到。 目录 前言&#xff1a; 1.OO语言 2.类的定义 3.类的访问限定符与封装的引入 4.类的实例化 5.关键字this指…

Magic Copy:一键AI抠图,在浏览器中获得任何图像素材

Magic Copy&#xff1a;轻松一点&#xff0c;精准抠图&#xff0c;让创意无限放大&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 Magic Copy&#xff08;AI智能抠图插件&#xff09;是一个创新型的浏览器扩展工具&#xff0c;其独特之处在于能够无缝集成于用户的网…

项目配置之道:优化Scrapy参数提升爬虫效率

前言 在当今信息时代&#xff0c;数据是无处不在且无比重要的资源。为了获取有效数据&#xff0c;网络爬虫成为了一项至关重要的技术。Scrapy作为Python中最强大的网络爬虫框架之一&#xff0c;提供了丰富的功能和灵活的操作&#xff0c;让数据采集变得高效而简单。本文将以爬…

Kafka安装配置

#安装启动之前必须配置好zookeeper 可以参考zookeeper安装配置-CSDN博客 一、下载安装包&#xff0c;并解压 #创建目录 mkdir -p /kafka/{install,data} #进入/kafka/install目录下 cd /kafka/install #下载kafka wget https://archive.apache.org/dist/kafka/3.7.0/kafka_2…

JSONP 实现跨域请求案例

后端使用 express 搭建&#xff0c;案例代码如下&#xff1a; const express require(express)const app express() const PORT 3000app.get(/data, (req, res) > {const jsonData {name: Alan,age: 666,city: GD}const callback req.query.callback // 获取前端中的回…

【Linux】Linux开发工具-vim / 编译器-gcc/g++ / 调试器-gdb / git操作 / 项目自动化构建工具-make/Makefile

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.在Linux写自己的第一个程序 1.1 nano指令 1.2 nano指令的使用 1.2.1 介绍 1.2.2 演示 1.2.2.1 创建.c文件 1.2.2.2 nano cod…

值迭代和策略迭代【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 文章目录 强化学习笔记一、Value It…

基于Docker的JMeter分布式压测!

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示&#xff0c;一个JMeter实例将能够控制许多其他的远程JMeter实例&#xff0c;并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互。JMeter主站…

【运放】LM358和LM324

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

一个python实现的Kline框架

起因是想研究量化交易&#xff0c;然后核查算法的落角点&#xff0c;比如哪些指标的组合可以入场做单&#xff0c;没有一个形象化的工具算法写起来总是感觉差强人意。 初步想法是需要一个数据串&#xff0c;里面记录一组开高低收量&#xff0c;然后打开程序后可以将这个基础数…

【基于skyent的热更思考】

基于skyent的热更思考 skynet-inject热更原理关键源码分析热更方式拓扑图注意事项 skynet-inject热更原理 inject是一个用于动态加载 Lua 代码文件并执行其中定义的函数的功能。可以在运行时动态加载 Lua 代码文件&#xff0c;然后调用其中定义的函数&#xff0c;通过修改模块…

【小米汽车SU7实测】 小米汽车su7到底行不行?小米新能源轿车体验感怎么样?

小米汽车SU7是小米汽车的首款车型&#xff0c;定位“C级高性能生态科技轿车”&#xff0c;也是小米迈入新能源赛道的首次成果落地。 首先&#xff0c;让我们来谈谈它的性能。试驾过程中&#xff0c;小米SU7展现出了惊人的加速能力&#xff0c;0-100km/h加速仅需2.78秒&#xf…

射频前端架构之Phase8简介

Phase8系列方案有三种&#xff0c;分别是Phase8、Phase8M、Phase8M。 Phase8与Phase8M方案采用的是低频及中高频两颗L-PAMiD构成完成方案&#xff0c;目标是高端及旗舰手机&#xff0c;方案强调强大的射频能力&#xff0c;以及完整的CA、EN-DC支持&#xff0c;当然这两个方案的…

C++读取文本文件中的汉字出现乱码的原因及解决措施

大家好&#xff01; 作者今天在写代码时遇到了读取文本文件中的汉字时出现乱码的情况&#xff0c;所以本文介绍Windows操作系统中&#xff0c;C读取文本文件中的汉字出现乱码情况原因及解决措施。 下面代码可以读取Stu.txt中的内容并输出&#xff1a; ifstream ifs; ifs.open(…

Python编程—Ajax数据爬取

Python编程—Ajax数据爬取 ​ 在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests得到的结果中并没有这些数据。这是因为requests获取的都是原始HTML文档&#xff0c;而浏览器中的页面是JavaScript处理数据后生成的结果&#xff0c;这些数据有多种来源&#xff…

模糊PID模糊化(三角隶属度函数SCL代码)

模糊PID系列文章大家可以查看PID专栏,这里我们再次对模糊化进行细分,为大家呈现不同的程序写法。 1、模糊控制模糊PID学习笔记 https://rxxw-control.blog.csdn.net/article/details/124380674https://rxxw-control.blog.csdn.net/article/details/1243806742、模糊PID(三角…

25.8 MySQL 数据处理之增删改

1. 数据完整性问题 数据完整性问题: 数据的插入, 更新, 删除等操作都需要满足数据库表的完整性约束条件, 否则这些操作将会失败. 完整性约束在数据库设计中起到了至关重要的作用, 它们确保了数据库中数据的准确性和一致性.约束条件的全称通常被称为完整性约束条件(Integrity Co…

物理查询优化(二):两表连接算法(附具体案例及代码分析)

前言 关系代数的一项重要操作是连接运算&#xff0c;多个表连接是建立在两表之间连接的基础上的。研究两表连接的方式&#xff0c;对连接效率的提高有着直接的影响。 连接方式是一个什么样的概念&#xff0c;或者说我们为何要有而且有好几种&#xff0c;对于不太了解数据库的人…

Sentry(Android)源码解析

本文字数&#xff1a;16030字 预计阅读时间&#xff1a;40分钟 01 前言 Sentry是一个日志记录、错误上报、性能监控的开源框架&#xff0c;支持众多平台&#xff1a; 其使用方式在本文不进行说明了&#xff0c;大家可参照官方文档&#xff1a;https://docs.sentry.io/platforms…