3.4_1 java自制小工具 - pdf批量转图片

news2025/1/24 8:45:15

相关链接

  • 目录
  • 参考文章:pdf转图片(apache pdfbox)
  • 参考文章:GUI界面-awt
  • 参考文章:jar包转exe(exe4j)
  • 参考文章:IDEA导入GIT项目
  • 参考文章:IDEA中使用Gitee管理代码
  • gitee项目链接:pdf_2_image
  • 网盘地址:.jar文件,提取码: ppwr
  • 网盘地址:.exe文件,提取码:jp3y

背景介绍

  最近做标书,涉及到很多批量pdf文件要转图片,再将插入word的使用场景,大概几千份,本着能省就省的原则,下载了四五个app,基本都是要收费,永久会员50~600不等,不付费会受到各种功能限制(禁用批量功能、单个文件页数限制)。
  自己尝试写个小工具,由于之前做的小工具都是打成jar包,只能在有jre环境的电脑上黑窗口操作。这次转为exe文件,用到的GUI和exe4j属于新的尝试,最终效果还比较满意。

在这里插入图片描述
在这里插入图片描述


  • 开发流程

    • 1.单个pdf转图片:Apache PDFbox 开源包,实现pdf转单个图片。
    • 2.批量pdf转图片:结合上面功能,实现批量转文件。
    • 3.GUI可视化界面:awt,设计思路类似于大学的vb编程课,实现界面操作。
    • 4.exe可执行文件:exe4j,可以不安装jre环境,windows系统下双击即可运行。

    两处避坑:
      1. macos M1芯片下载后使用不了,换了台windows才运行成功。
      2. 下载时默认exe4j 9.0,应该是指对应的版本为java9及以上。我的项目使用jdk8,就要下载exe4j 8.0版本,否则会卡在其中一步,点下一步没有反应,进行不下去。
    在这里插入图片描述

      卡住的位置:
    在这里插入图片描述

    • 5.自适应:写死分辨率容易导致在分辨率较高的屏幕下,窗口非常小,通过获取屏幕尺寸,按比例计算各个组件坐标、长宽,实现自适应大小。

  • 功能示例
    • 1.设置dpi清晰度(100~600)
    • 2.图片格式(jpg和png)
    • 3.自动遍历子目录按照 原文件名_序号 格式生成对应图片
      在这里插入图片描述

源码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>pdf_2_image</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--pdf2jpg-->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.9</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.9</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <!-- 程序主入口 -->
                                    <mainClass>com.groupies.Pdf2ImageIteratorWindowsAdaptive</mainClass>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
        </plugins>

    </build>
</project>

Pdf2ImageIteratorWindowsAdaptive

package com.groupies;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @author GroupiesM
 * @date 2023/11/30
 * @version 1.2
 * @introduction pdf转图片工具类,awt可视化界面,会自动遍历所有子目录,窗口大小自适应
 */
public class Pdf2ImageIteratorWindowsAdaptive {
    //公共变量
    static String filePath;//基础路径
    static String fileName;//文件名称

    //用户输入
    static Integer dpiInput;//dpi清晰度
    static String imageTypeInput;//图片类型
    static File fileUrl;//文件目录

    //循环相关
    static Integer taskCount = 0;//任务数量
    static Integer imageCount = 0;//图片数量

    //主体
    static Frame frame = new Frame("pdf转图片小工具 -- by GroupiesM");

    //控制台
    static TextArea textAreaConsole = new TextArea("");
    static StringBuffer sb = new StringBuffer("");

    //按比例获取尺寸
    static Toolkit toolkit = Toolkit.getDefaultToolkit();
    static int frameWidth = toolkit.getScreenSize().width * 2 / 5;//宽
    static int frameHeight = toolkit.getScreenSize().height * 19 / 20;//高
    static int leftEdge = frameWidth / 10;//左边距
    static int elementWidth = frameWidth * 4 / 5;//组件宽度
    static int elementHeight = frameWidth / 20;//组件宽度

    //字体
    static Font titleFontLabel = new Font("黑体", Font.BOLD, Math.max((frameWidth / 55), 12));//标签样式
    static Font bodyFontLabel = new Font("宋体", Font.PLAIN, Math.max((frameWidth / 55), 12));//标签样式

    /**
     * @param args
     * @introduction 程序入口
     */
    public static void main(String[] args) {
        textAreaConsole.setText("介绍:\nhttps://blog.csdn.net/qq_43529621/article/details/134758957");
        initGUI();
    }

    /**
     * @param folder
     * @introduction 遍历目录中的所有pdf、子目录中的所有pdf,发现pdf文件则调用pdf2png方法转换pdf文件为png
     */
    public static void traverseFolder(File folder) {
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        traverseFolder(file); // 递归遍历子文件夹
                    } else if (file.getAbsolutePath().endsWith(".pdf")) {//如果是pdf文件,转图片
                        filePath = folder.getAbsolutePath();//文件目录
                        fileName = file.getName();//文件名
                        sb.append("------------Task" + ++taskCount + "------------\r\n");
                        sb.append("目录:" + folder.getAbsolutePath() + "\r\n");
                        sb.append("文件:" + file.getAbsolutePath() + "\r\n");
                        textAreaConsole.setText(sb.toString());

                        System.out.println("------------Task" + taskCount + "------------");
                        System.out.println("目录:" + folder.getAbsolutePath());
                        System.out.println("文件:" + file.getAbsolutePath());
                        try {
                            pdf2png(filePath, filePath, fileName, imageTypeInput);
                        } catch (Exception e) {
                            //e.printStackTrace();
                            sb.append(e.getMessage() + "\r\n");
                            textAreaConsole.setText(sb.toString());
                        }
                    }
                }
            }
        } else {
            System.out.println("路径有误,请重新输入");
        }
    }

    /**
     * @introduction 使用pdfbox将整个pdf转换成图片
     * @param sourceDirectory
     * @param targetDirectory
     * @param filename
     * @param type 图片类型 png 和jpg
     * @throws Exception
     */
    public static void pdf2png(String sourceDirectory, String targetDirectory, String filename, String type) throws Exception {
        long startTime = System.currentTimeMillis();
        // 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接
        File file = new File(sourceDirectory + "/" + filename);
        try {
            // 写入文件
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                // dpi为144,越高越清晰,转换越慢
                BufferedImage image = renderer.renderImageWithDPI(i, dpiInput); // Windows native DPI
                // 将图片写出到该路径下
                sb.append("图片" + ++imageCount + ":" + targetDirectory + "/" + filename.replace(".pdf", "") + "_" + (i + 1) + "." + type + "\r\n");
                textAreaConsole.setText(sb.toString());

                System.out.println("图片" + imageCount + ":" + targetDirectory + "/" + filename.replace(".pdf", "") + "_" + (i + 1) + "." + type);
                File imageTarget = new File(targetDirectory + "/" + filename.replace(".pdf", "") + "_" + (i + 1) + "." + type);
                //覆盖写文件
                ImageIO.write(image, type, imageTarget);
            }
            long endTime = System.currentTimeMillis();//结束时间

            doc.close();//关流,否则会报异常 Warning: You did not close a PDF Document
            sb.append("共耗时:" + ((endTime - startTime) / 1000.0) + "秒\r\n");
            textAreaConsole.setText(sb.toString());
            System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒");  //转化用时
        } catch (IOException e) {
            e.printStackTrace();
            sb.append(e.getMessage());
            textAreaConsole.setText(sb.toString());
        }
    }

    /**
     * @introduction 初始化GUI页面
     */
    public static void initGUI() {
        //todo 0.创建窗口Frame
        frame.setVisible(true);
        frame.setSize(frameWidth, frameWidth * 203 / 200);//设置大小
        frame.setBackground(new Color(88, 87, 86));//窗口背景色
        frame.setLayout(null);

        //todo 1.1 《dpi》标签
        Label labelDpi = new Label("  一、dpi分辨率(越高越清晰,转换越慢)");
        labelDpi.setBounds(leftEdge, elementHeight * 3 / 2, elementWidth, elementHeight);//设置位置、大小
        labelDpi.setBackground(Color.darkGray);//背景色
        labelDpi.setForeground(Color.WHITE);//字体颜色
        labelDpi.setFont(titleFontLabel);
        frame.add(labelDpi);//给窗口添加组件
        //todo 1.2 《dpi》滚动条
        Scrollbar scrollbarDpi = new Scrollbar(Scrollbar.HORIZONTAL, 144, elementHeight, 100, 600 + elementHeight); //构造一个具有指定方向,初始值,粗细、最小值、最大值的新滚动条
        scrollbarDpi.setBounds(leftEdge * 3 / 2, elementHeight * 27 / 10, elementWidth / 2, elementHeight * 2 / 3);//设置位置、大小
        frame.add(scrollbarDpi);//给窗口添加组件
        //todo 1.3《dpi回显》标签
        Label labelDpiValue = new Label("\t\t144");
        labelDpiValue.setBounds(leftEdge * 3 / 2 + elementWidth / 2, elementHeight * 27 / 10, leftEdge, elementHeight * 2 / 3);//设置位置、大小
        labelDpiValue.setForeground(Color.WHITE);//字体颜色
        labelDpiValue.setBackground(Color.darkGray);//字体颜色
        labelDpiValue.setFont(bodyFontLabel);
        frame.add(labelDpiValue);//给窗口添加组件
        //todo 1.4《dpi》滚动条背景
        Label labelDpiBackGround = new Label();
        labelDpiBackGround.setBounds(leftEdge, elementHeight * 5 / 2, elementWidth, elementHeight * 6 / 5);//设置大小
        labelDpiBackGround.setBackground(Color.darkGray);//背景色
        frame.add(labelDpiBackGround);//给窗口添加组件

        //todo 2.1《转换类型》标签
        Label labelImageType = new Label("  二、图片类型(jpg:有损压缩;png:无损压缩)");
        labelImageType.setBounds(leftEdge, elementHeight * 21 / 5, elementWidth, elementHeight);//设置大小
        labelImageType.setBackground(Color.darkGray);//设置标签背景色
        labelImageType.setForeground(Color.white);//设置标签背景色
        labelImageType.setFont(titleFontLabel);
        frame.add(labelImageType);//add()给窗口添加标签

        //todo 2.2《转换类型》单选框
        CheckboxGroup boxImageType = new CheckboxGroup();
        Checkbox ck1 = new Checkbox("jpg", boxImageType, true);
        Checkbox ck2 = new Checkbox("png", boxImageType, false);
        ck1.setBounds(leftEdge * 3 / 2, elementHeight * 26 / 5, leftEdge * 3 / 2, elementHeight);
        ck2.setBounds(leftEdge * 6 / 2, elementHeight * 26 / 5, leftEdge * 3 / 2, elementHeight);
        ck1.setForeground(Color.white);
        ck2.setForeground(Color.white);
        ck1.setBackground(Color.darkGray);
        ck2.setBackground(Color.darkGray);
        ck1.setFont(bodyFontLabel);
        ck2.setFont(bodyFontLabel);
        frame.add(ck1);//给窗口添加组件
        frame.add(ck2);//给窗口添加组件

        //todo 2.3《转换类型》背景
        Label labelImageTypeBackGround = new Label();
        labelImageTypeBackGround.setBounds(leftEdge, elementHeight * 26 / 5, elementWidth, elementHeight * 6 / 5);//设置大小
        labelImageTypeBackGround.setBackground(Color.darkGray);//背景色
        frame.add(labelImageTypeBackGround);//给窗口添加组件

        //todo 3.1《目录》标签Label
        Label labelUrl = new Label("  三、文件路径,例如:C:\\Users\\GroupiesM\\Desktop");
        labelUrl.setBounds(leftEdge, elementHeight * 7, elementWidth, elementHeight);//设置大小
        labelUrl.setBackground(Color.darkGray);//背景色
        labelUrl.setForeground(Color.WHITE);//字体颜色
        labelUrl.setFont(titleFontLabel);
        frame.add(labelUrl);//给窗口添加组件
        //todo 3.2《目录》输入框
        TextField textUrl = new TextField(elementHeight);
        textUrl.setText("C:\\Users\\GroupiesM\\Desktop");
        textUrl.setFont(bodyFontLabel);
        textUrl.setBounds(leftEdge, elementHeight * 8, elementWidth, elementHeight);
        frame.add(textUrl);//给窗口添加组件

        //todo 4《清空》按钮
        Button buttonClean = new Button("清空");//创建按钮
        buttonClean.setBounds(leftEdge * 2, elementHeight * 19 / 2, leftEdge * 7 / 5, elementHeight * 7 / 5);//设置位置
        buttonClean.setFont(titleFontLabel);
        frame.add(buttonClean);//给窗口添加组件

        //todo 5《转换》按钮
        Button buttonTransform = new Button("转换");//创建按钮
        buttonTransform.setBounds(leftEdge * 22 / 5, elementHeight * 19 / 2, leftEdge * 7 / 5, elementHeight * 7 / 5);//设置位置
        buttonTransform.setFont(titleFontLabel);
        frame.add(buttonTransform);//给窗口添加组件

        //todo 6《退出》按钮
        Button buttonExit = new Button("退出");//创建按钮
        buttonExit.setBounds(leftEdge * 34 / 5, elementHeight * 19 / 2, leftEdge * 7 / 5, elementHeight * 7 / 5);//设置位置
        buttonExit.setFont(titleFontLabel);
        frame.add(buttonExit);//给窗口添加组件

        //todo 7《控制台》
        textAreaConsole.setBounds(leftEdge, elementHeight * 113 / 10, elementWidth, elementHeight * 9);//设置大小
        textAreaConsole.setBackground(Color.white);//背景色
        textAreaConsole.setForeground(Color.black);//背景色
        textAreaConsole.setFont(bodyFontLabel);
        frame.add(textAreaConsole);//给窗口添加组件

        //todo 7.1《dpi滚动条》触发动作
        scrollbarDpi.addAdjustmentListener(e -> labelDpiValue.setText(String.valueOf("\t\t" + scrollbarDpi.getValue())));//回显滚动条

        //todo 7.2 《清空》触发动作
        buttonClean.addActionListener(actionEvent -> textUrl.setText("\b"));//清空输入框

        //todo 7.3 《转换》触发动作
        buttonTransform.addActionListener(actionEvent -> startTransform(scrollbarDpi, boxImageType, textUrl));//开始转换,并校验

        //todo 7.4 《退出》触发动作
        buttonExit.addActionListener(Pdf2ImageIteratorWindowsAdaptive::actionPerformed);

        //frame.pack();
    }

    /**
     * @introduction 开始转换,初始化参数,校验文件目录是否存在
     * @param scrollbarDpi dpi清晰度
     * @param group 图片类型,单选框
     * @param textUrl 文件目录
     */
    public static void startTransform(Scrollbar scrollbarDpi, CheckboxGroup group, TextField textUrl) {
        dpiInput = scrollbarDpi.getValue();//设置dpi
        imageTypeInput = group.getSelectedCheckbox().getLabel();//设置图片类型
        fileUrl = new File(textUrl.getText().trim());//创建文件
        //如果目录不存在,不执行指令
        if (!fileUrl.exists()) {
            textUrl.setForeground(Color.red);
            if (!textUrl.getText().trim().endsWith("(路径不存在)")) textUrl.setText(textUrl.getText().trim() + "(路径不存在)");
            textUrl.selectAll();
            return;
        }
        //校验通过
        textUrl.setForeground(Color.black);

        //初始化参数
        sb = new StringBuffer();
        taskCount = 0;//任务数量
        imageCount = 0;//图片数量

        //开始转换
        traverseFolder(fileUrl);
    }

    /**
     * @introduction 退出按钮, 监听
     * @param e
     */
    private static void actionPerformed(ActionEvent e) {
        sb = initSB();
        textAreaConsole.setText("....................正在退出.....................\n" +
                                        "===============================================\n" +
                                        sb.toString());
        try {
            Thread.sleep(1600);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        sb = initSB();
        textAreaConsole.setText("....................正在退出.....................\n" +
                                        "===============================================\n" +
                                        sb.reverse().toString());
        try {
            Thread.sleep(1300);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        System.exit(0);
    }

    /**
     * @introduction 退出程序-控制台
     * @return StringBuffer
     */
    public static StringBuffer initSB() {
        sb = new StringBuffer();
        sb.append("                     _oo0oo_                    \n");
        sb.append("                    o8888888o                    \n");
        sb.append("                    88” . “88                    \n");
        sb.append("                   ( |- _ - | )                    \n");
        sb.append("                   O \\  =  / O                    \n");
        sb.append("                  __/ ‘---’ \\__                    \n");
        sb.append("                  '\\|       |/'                    \n");
        sb.append("              / \\\\|||   :   |||// \\                    \n");
        sb.append("            / _|||||  -卍- |||||_  \\                    \n");
        sb.append("           |    |\\\\\\   -    ///  |_ \\                     \n");
        sb.append("           |  \\_|  ''\\---/''    |_/  |                    \n");
        sb.append("           \\ ,-\\__    '-'    __/- ,  /              \n");
        sb.append("          ___'.  .'  /--.--\\   '.  .'___               \n");
        sb.append("          .”“'< ‘.___\\_<|>_/___.'> ' ”“.             \n");
        sb.append("         | | : '-\\'.:'\\ _ /' : .'/ - ': | |            \n");
        sb.append("          \\ \\ '_. \\_ __\\ /__ _/  , - ' / /           \n");
        sb.append("     ====='-.___'.___ \\____//___.-' ___.-' =====           \n");
        sb.append("                      '=----='           \n");
        sb.append("                                                             \n");
        return sb;
    }
}

23/12/3

M

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIP-十六、IGMPPIM-SM 组播

十六、IGMP&PIM-SM 组播 IGMP实验拓扑实验需求及解法1. 配置各设备IP地址2. R1启用组播功能&#xff0c;并在g0/0/0和g0/0/1上开启pim dm3. R1的g0/0/1开启igmp协议 PIM-SM实验拓扑实验需求及解法1.配置各设备IP地址。2.运行IGP3.R1/2/3/4运行PIM-SM IGMP 实验拓扑 实验需…

内网穿透工具获取一个公网ip

下载地址&#xff1a;点击即可下载很简单 然后将他复制到上面的命令行窗口直接回车

SQL自学通之查询--SELECT语句的使用

一、前言 1、目标 在今天你将学习到以下内容&#xff1a; l 如何写SQL的查询 l 将表中所有的行选择和列出 l 选择和列出表中的选定列 l 选择和列出多个表中的选定列 2、背景 在上篇中我们简要地介绍了关系型数据库系统所具有的强大功能 在对 SQL 进行了 简要的介绍中我们…

scrapy-redis

一、什么是scrapy-redis Scrapy-Redis 是 Scrapy 框架的一个扩展&#xff0c;它提供了对 Redis 数据库的支持&#xff0c;用于实现分布式爬取。通过使用 Scrapy-Redis&#xff0c;你可以将多个 Scrapy 进程连接到同一个 Redis 服务器&#xff0c;共享任务队列和去重集&#xf…

食物相关的深度学习数据集合集—食物、饮料、肉类、餐具等数据集

最近收集了一大波与食物酒水相关的数据集&#xff0c;包含食物、饮料、肉类、餐具等不同等类型的数据集&#xff0c;废话不多说&#xff0c;给大家逐一介绍&#xff01;&#xff01; 1、自制啤酒配方数据库 超过20万自制啤酒配方数据库&#xff0c;数据集包含不同精酿啤酒的名…

C# WPF上位机开发(绘图软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 本身c# wpf可以看成是生产力工具&#xff0c;它的意义在于可以快速根据业务的情况&#xff0c;把产品模型搭建出来。这一点不像c/c&#xff0c;需要…

4.OpenResty系列之Nginx负载均衡

1. 负载均衡配置 上篇文章中&#xff0c;代理仅仅指向一个服务器。但是&#xff0c;网站在实际运营过程中&#xff0c;大部分都是以集群的方式运行&#xff0c;这时需要使用负载均衡来分流。nginx 也可以实现简单的负载均衡功能。 假设这样一个应用场景&#xff1a;将应用部署…

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

想进国家电网,电气类专业都有哪些就业方向呢?

电气工程及自动化专业的主干课程都有哪些&#xff0c;笔者跟你分享一下就业方向都有哪些主要课程呢&#xff1f;包含电路原理、模拟电子技术、数字电子技术工程、电磁场、微机原理与接口技术、自动控制原理、电机学、电力电子技术、电力系统分析等等。 电气类专业都有哪些就业方…

使用idea如何快速的搭建ssm的开发环境

文章目录 唠嗑部分言归正传1、打开idea&#xff0c;点击新建项目2、填写信息3、找到pom.xml先添加springboot父依赖4、添加其他依赖5、编写启动类、配置文件6、连接创建数据库、创建案例表7、安装MybatisX插件8、逆向工程9、编写controller10、启动项目、测试 结语 唠嗑部分 小…

技术阅读周刊第第8️⃣期

技术阅读周刊&#xff0c;每周更新。 历史更新 20231103&#xff1a;第四期20231107&#xff1a;第五期20231117&#xff1a;第六期20231124&#xff1a;第七期 Prometheus vs. VictoriaMetrics (VM) | Last9 URL: https://last9.io/blog/prometheus-vs-victoriametrics/?refd…

大文件分片上传、分片进度以及整体进度、断点续传(一)

大文件分片上传 效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页面上写几个组件用来获取文件。 <body><input type"file" id"file" /><button id"uploadButton…

VisionPro---PatMaxTool工具使用

CogPMAlignTool PatMax是一种图案位置搜索技术&#xff08;识别定位&#xff09;&#xff0c;PatMax图案不依赖于像素格栅&#xff0c;是基于边缘特征的模板匹配而不是基于像素的模板匹配&#xff0c;支持图像中特征的旋转与缩放&#xff0c;边缘特征表示图像中不同区域间界限…

Redis-安装、配置和修改配置文件、以及在Ubuntu和CentOS上设置Redis服务的开机启动和防火墙设置,以及客户端连接。

目录 1. Redis简介 2. 离线安装 2.1 准备工作 2.2 解压、安装 2.3 修改配置文件 2.4 redis服务与关闭 2.5 redis服务的开机启动 2.5.1 Ubuntu上的配置 2.5.2 centos上的配置 3. 在线安装 4. 设置防火墙 5. 客户端连接 1. Redis简介 Redis 是完全开源免费的&#x…

配置typroa上传图片到gitee

在typora这个位置下载插件 在picgo.exe文件夹下输入cmd 打开命令行输入如下命令安装相关插件 .\picgo install gitee-uploader .\picgo install super-prefix 之后按照官方文档更改相关配置 官方文档参考 https://picgo.github.io/PicGo-Core-Doc 博客参考&#xff1a;…

JSP学习资源网站系统eclipse定制开发mysql数据库BS模式java编程

一、源码特点 java 学习资源网站系统是一套完善的web设计系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;…

FL Studio水果软件2024简体中文语言版本下载

Fl Studio21是最好的音乐制作软件&#xff0c;但它的成本超过300美元......一个年轻的新音乐创作者怎么能从上到下&#xff0c;地球上没有比 FL Studio 21 更完整的音乐制作软件了。14 年来&#xff0c;它一直是行业领导者&#xff0c;并且随着随后的每一次更新&#xff08;在此…

字符函数 和 字符串函数

今天我打算介绍一些字符函数和字符串函数&#xff0c;有一些字符串函数我实现了模拟&#xff0c;但文章中没有放出来&#xff0c;如果需要的欢迎来到我的gitee里面拿取&#xff08;在test.c11-23里面&#xff09; 这是我的gitee:小汐 (lhysxx) - Gitee.com 字符函数 1. islow…

编程怎么学才能快速入门,分享一款中文编程工具快速学习编程思路,中文编程工具之边条主控菜单构件简介

编程怎么学才能快速入门&#xff0c;分享一款中文编程工具快速学习编程思路&#xff0c;中文编程工具之边条主控菜单构件简介 一、前言 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程编程系统化教程链接https://jywxz.blog…

Python标准库:math库【侯小啾python领航班系列(十六)】

Python标准库:math库【侯小啾python领航班系列(十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…