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

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

相关链接

  • 目录
  • 参考文章: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><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><!-- 程序主入口 --><mainClass>com.groupies.Pdf2ImageIteratorWindowsAdaptive</mainClass></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation="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 Documentsb.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.创建窗口Frameframe.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《目录》标签LabelLabel 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();//设置dpiimageTypeInput = 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

相关文章:

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

相关链接 目录参考文章&#xff1a;pdf转图片(apache pdfbox)参考文章&#xff1a;GUI界面-awt参考文章&#xff1a;jar包转exe(exe4j)参考文章&#xff1a;IDEA导入GIT项目参考文章&#xff1a;IDEA中使用Gitee管理代码gitee项目链接&#xff1a;pdf_2_image网盘地址&#xf…...

vue中实现数字+英文字母组合键盘

完整代码 <template><div class"login"><div click"setFileClick">欢迎使用员工自助终端</div><el-dialog title"初始化设置文件打印消耗品配置密码" :visible.sync"dialogSetFile" width"600px&quo…...

Centos服务器上根据端口号查询jar包,根据jar包查端口号

在开发springboot服务器时&#xff0c;经常会遇到其他人部署的java服务&#xff0c;需要自己维护&#xff0c;留下的信息又非常少。经常面临找不到jar包位置&#xff0c;或者不知道占用端口&#xff0c;不知道启动命令的问题。这里记录一下常用的centos服务器上的命令&#xff…...

数据仓库与数据挖掘复习资料

一、题型与考点[第一种] 1、解释基本概念(中英互译解释简单的含义)&#xff1b; 2、简答题(每个10分有两个一定要记住)&#xff1a; ① 考时间序列Time series(第六章)的基本概念含义解释作用&#xff08;序列模式挖掘的作用&#xff09;&#xff1b; ② 考聚类(第五章)重点考…...

限流算法,基于go的gRPC 实现的

目录 一、单机限流 1、令牌桶算法 3、固定窗口限流算法 4、滑动窗口 二、集群限流 1、分布式固定窗口 &#xff08;基于redis&#xff09; 2、分布式滑动窗口 一、单机限流 1、令牌桶算法 令牌桶算法是当流量进入系统前需要获取令牌&#xff0c;没有令牌那么就要进行限…...

Shell中HTTP变量和文本处理

在Shell中&#xff0c;HTTP变量和文本处理是常见的任务之一。Shell是一个命令行解释器&#xff0c;可以用来自动化执行各种系统任务。在Shell中&#xff0c;我们可以使用各种命令和工具来处理HTTP变量和文本。 首先&#xff0c;让我们来看看如何在Shell中处理HTTP变量。HTTP变…...

java学习part39map

159-集合框架-Map不同实现类的对比与HashMap中元素的特点_哔哩哔哩_bilibili 1.Map 2.Entry 个人理解是c的pair&#xff0c;代表一个键值对。Map就是entry的叠加 3.常用方法 4.TreeMap 5.Properties...

使用sqoop操作HDFS与MySQL之间的数据互传

一&#xff0c;数据从HDFS中导出至MySQL中 1&#xff09;开启Hadoop、mysql进程 start-all.sh/etc/init.d/mysqld start/etc/init.d/mysqld status 2&#xff09;将学生数据stu_data.csv传到HDFS的/local_student目录下 在hdfs中创建目录 hdfs dfs -mkdir /local_student 上…...

Kafka使用指南

Kafka简介架构设计Kafka的架构设计关键概念Kafka的架构设计关键机制 Partition介绍Partition工作机制 应用场景ACK机制介绍ACK机制原理ACK机制对性能的影响ACK控制粒度Kafka分区数对集群性能影响调整分区优化集群性能拓展Kafka数据全局有序 Kafka简介 Kafka是由Apache软件基金…...

HarmonyOS4.0从零开始的开发教程03初识ArkTS开发语言(中)

HarmonyOS&#xff08;二&#xff09;初识ArkTS开发语言&#xff08;中&#xff09;之TypeScript入门 浅析ArkTS的起源和演进 1 引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类…...

西工大计算机学院计算机系统基础实验一(函数编写1~10)

还是那句话&#xff0c;千万不要慌&#xff0c;千万不要着急&#xff0c;耐下性子慢慢来&#xff0c;一步一个脚印&#xff0c;把基础打的牢牢的&#xff0c;一样不比那些人差。回到实验本身&#xff0c;自从​​​​​​按照西工大计算机学院计算机系统基础实验一&#xff08;…...

VMware 虚拟机 电脑重启后 NAT 模式连不上网络问题修复

问题描述&#xff1a; 昨天 VMware 安装centos7虚拟机&#xff0c;网络模式配置的是NAT模式&#xff0c;配置好后&#xff0c;当时能连上外网&#xff0c;今天电脑重启后&#xff0c;发现连不上外网了 检查下各个配置&#xff0c;都没变动&#xff0c;突然就连不上了 网上查了…...

【桑基图】绘制桑基图

绘制桑基图 一、绘制桑基图&#xff08;1&#xff09;方法一&#xff1a;去在线网站直接绘制&#xff08;2&#xff09;方法二&#xff1a;写html之后在vscode上运行 二、遇到的问题&#xff08;1&#xff09;当导入一些excel的时候&#xff0c;无法绘制出桑基图 一、绘制桑基图…...

ACM32F403/F433 12 位多通道,支持 MPU 存储保护功能,应用于工业控制,智能家居等产品中

ACM32F403/F433 芯片的内核基于 ARMv8-M 架构&#xff0c;支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核 支持一整套DSP指令用于数字信号处理&#xff0c;支持单精度FPU处理浮点数据&#xff0c;同时还支持Memory Protection Unit &#xff08;MPU&#xff09;用于提升应用的…...

7. 从零用Rust编写正反向代理, HTTP及TCP内网穿透原理及运行篇

wmproxy wmproxy是由Rust编写&#xff0c;已实现http/https代理&#xff0c;socks5代理&#xff0c; 反向代理&#xff0c;静态文件服务器&#xff0c;内网穿透&#xff0c;配置热更新等&#xff0c; 后续将实现websocket代理等&#xff0c;同时会将实现过程分享出来&#xff…...

UE4.27-UE5.1设置打包Android环境

打包Android配置文件 1. 配置打包Android的SDK需求文件位于下面文件中&#xff1a; 2. 指定了对应的SDK环境变量名字以及NDK需求等&#xff1a; UE4.27-UE5.1--脚本自动配置 安装前提 1. 务必关闭虚幻编辑器和Epic Games Launcher&#xff0c;以确保NDK组件的安装或引擎环境…...

MySQL授权密码

mysql> crate databases school charcter set utf8; Query OK, 1 row affected, 1 warning (0.00 sec) 2.在school数据库中创建Student和Score表 mysql> use school Database changed mysql> create table student-> -> (id int(10) primary key auto_incremen…...

0X05

打开题目 点击完登录和注册都没有什么反应&#xff0c;所以先扫一下看看 在出现admin.php后就截止了&#xff0c;访问看看,进入后台。。 尝试一下弱口令 admin/12345 或者是demo/demo 设计中-自定义->右上角导出主题 找到一个导出的点&#xff0c;下载了一个1.zip压缩包…...

Doris优化总结

1 查看QueryProfile 利用查询执行的统计结果,可以更好的帮助我们了解Doris的执行情况,并有针对性的进行相应Debug与调优工作。 FE将查询计划拆分成为Fragment下发到BE进行任务执行。BE在执行Fragment时记录了运行状态时的统计值,并将Fragment执行的统计信息输出到日志之中。…...

案例059:基于微信小程序的在线投稿系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

利用STM32内置Bootloader实现USB DFU固件升级

本文将介绍如何利用STM32内置的Bootloader来实现USB DFU&#xff08;Device Firmware Upgrade&#xff09;固件升级功能。首先&#xff0c;我们会介绍USB DFU的原理和工作流程。然后&#xff0c;我们将详细讲解如何配置STM32芯片以支持USB DFU&#xff0c;并提供相应的代码示例…...

Centos7如何安装MySQL

目录 一、卸载mysql 二、安装mysql 注&#xff1a;本文主要是看了这位大佬安装MySQL&#xff0c;才想着写一篇记录一下。 一、卸载mysql 安装mysql之前一定要将之前安装的mysql相关文件删除干净&#xff0c;防止出现错误。 &#xff08;1&#xff09;关闭mysql 开启了mysql就…...

VR远程带看,助力线下门店线上化转型“自救”

VR远程带看&#xff0c;因自身高效的沉浸式在线沟通功能&#xff0c;逐渐走进了大众的视野。身临其境的线上漫游体验以及实时同屏互联的新型交互模式&#xff0c;提升了商家同用户之间的沟通效率&#xff0c;进一步实现了远程线上一对一、一对多的同屏带看&#xff0c;用户足不…...

算法通关村第十七关-白银挑战贪心算法高频题目

大家好我是苏麟 , 今天说说贪心算法的高频题目 . 大纲 区间问题判断区间是否重叠合并区间插入区间 区间问题 判断区间是否重叠 描述 : 给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间intervalsl[i] [start, end] &#xff0c;请你…...

【数据结构】动态规划(Dynamic Programming)

一.动态规划&#xff08;DP&#xff09;的定义&#xff1a; 求解决策过程&#xff08;decision process&#xff09;最优化的数学方法。 将多阶段决策过程转化为一系列单阶段问题&#xff0c;利用各阶段之间的关系&#xff0c;逐个求解。 二.动态规划的基本思想&#xff1a; …...

Redis key过期删除机制实现分析

文章目录 前言Redis key过期淘汰机制惰性删除机制定时扫描删除机制 前言 当我们创建Redis key时&#xff0c;可以通过expire命令指定key的过期时间(TTL)&#xff0c;当超过指定的TTL时间后&#xff0c;key将会失效。 那么当key失效后&#xff0c;Redis会立刻将其删除么&#…...

ElasticSearch 谈谈分词与倒排索引的原理

ElasticSearch是一个基于Lucene的搜索服务器。Lucene是Java的一个全文检索工具包&#xff0c;而ElasticSearch则是一个分布式搜索和分析引擎。下面&#xff0c;我们将详细讨论ElasticSearch中的分词和倒排索引的原理。 分词&#xff1a; 在ElasticSearch中&#xff0c;分词是…...

【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作

【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作 前言Lambda函数式编程Stream流对集合数据操作&#xff08;一&#xff09;创建Stream流&#xff08;二&#xff09;中间操作之filter&#xff08;三&#xff09;中间操作之map&#xff08;四&#xff09…...

大话数据结构-查找-散列表查找(哈希表)

注&#xff1a;本文同步发布于稀土掘金。 8 散列表查找&#xff08;哈希表&#xff09; 8.1 定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f&#xff0c;使得每个关键字key对应一个存储位置f(key)。查找时&#xff0c;根据这个确定的对应关系找到给…...

持续集成交付CICD:Sonarqube自动更新项目质量配置

目录 一、实验 1.Sonarqube手动自定义质量规则并指定项目 2.Sonarqube自动更新项目质量配置 一、实验 1.Sonarqube手动自定义质量规则并指定项目 &#xff08;1&#xff09;自定义质量规则 ①新配置 ②更多激活规则③根据需求激活相应规则④已新增配置 ⑤ 查看 &#x…...

Linux设置Docker自动创建Nginx容器脚本

文章目录 前言一、本地新建脚本二、复制本地脚本到服务器三、执行服务器脚本总结如有启发&#xff0c;可点赞收藏哟~ 前言 一、本地新建脚本 在本地新建nginx-generator.sh脚本文件&#xff0c;并保存以下内容 主要动态定义两个变量&#xff08;容器名称/服务器本地文件名、端…...

技术博客:Vue中各种混淆用法汇总

技术博客&#xff1a;Vue中各种混淆用法汇总 摘要 本文主要介绍了在Vue中使用的一些常见混淆用法&#xff0c;包括new Vue()、export default {}、createApp()、Vue.component、Vue3注册全局组件、Vue.use()等&#xff0c;以及如何使用混淆器对代码进行加固&#xff0c;保护应…...

【python】Python生成GIF动图,多张图片转动态图,pillow

pip install pillow 示例代码&#xff1a; from PIL import Image, ImageSequence# 图片文件名列表 image_files [car.png, detected_map.png, base64_image_out.png]# 打开图片 images [Image.open(filename) for filename in image_files]# 设置输出 GIF 文件名 output_g…...

python/matlab图像去雾/去雨综述

图像去雾和去雨是计算机视觉领域的两个重要任务&#xff0c;旨在提高图像质量和可视化效果。本文将综述图像去雾和去雨的算法、理论以及相关项目代码示例。 一、图像去雾算法 基于暗通道先验的方法&#xff1a; 这是广泛应用于图像去雾的经典算法之一。该方法基于一个观察&…...

Docker+jenkins+gitlab实现持续集成

1.安装环境 服务器ip虚拟机版本192.168.5.132centos7.6192.168.5.152centos7.6 2. 安装docker 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息&#xff0c;要确保centos7能上外网 yum-config-manager --add-repo http:…...

Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据

写在前面&#xff1a; 根据Web项目开发需求&#xff0c;需要在H5页面中&#xff0c;通过点击视频列表页中的任意视频进入视频详情页&#xff0c;然后根据视频的链接地址&#xff0c;主要是 .mp4 文件格式&#xff0c;在进行播放时实时的显示该视频的音频轨道情况&#xff0c;并…...

MySQL生成UUID并去除-

uuid()函数 uuid() 函数可以使mysql生成uuid,但是uuid中存在-,如下图&#xff1a; 去除uuid的- 默认生成的uuid含有-&#xff0c;我们可以使用replace函数替换掉-&#xff0c;SQL如下 select replace(uuid(),"-","") as uuid;Insert语句中使用UUID 如果…...

包与字符串

包是分类管理的需要&#xff0c;建立包用:package&#xff0c;包中类的引用import 学习使用javaAPI中的字符串类String&#xff0c;学会其成员方法的使用 &#xff08;必看&#xff09;eclipse包的分层等级结构设置 因为eclipse的包的结构默认是平行等级的&#xff0c;所以要手…...

【Gradle】mac环境安装Gradle及配置

官网安装说明&#xff1a;Gradle | Installation 由于Gradle运行依赖jvm&#xff0c;所以事先需要安装jdk&#xff0c;并确认你的jdk版本和gradle版本要求的对应关系&#xff0c;这个官网上有说明&#xff0c;但是我试了一下不太准确&#xff0c;供参考&#xff0c;链接如下&a…...

使用C语言操作kafka ---- librdkafka

1 安装librdkafka git clone https://github.com/edenhill/librdkafka.git cd librdkafka git checkout v1.7.0 ./configure make sudo make install sudo ldconfig 在librdkafka的examples目录下会有示例程序。比如consumer的启动需要下列参数 ./consumer <broker> &…...

误用STM32串口发送标志位 “USART_FLAG_TXE” “USART_FLAG_TC”造成的BUG

当你使用串口发送数据时是否出现过这样的情况&#xff1a; 1.发送时第一个字节丢失。 2.发送时出现莫名的字节丢失。 3.各种情况字节丢失。 1.先了解一下串口发送的流程图&#xff08;手动描绘&#xff09;&#xff1a; 可以假想USART_FLAG_TXE是用于检测"弹仓"&…...

指针(三)

函数指针 定义&#xff1a;整型指针是指向整形的指针,数组指针式指向数组的指针,其实函数指针就是指向函数的指针。 函数指针基础&#xff1a; &#xff08;&#xff09;优先级要高于*&#xff1b;一个变量除去了变量名&#xff0c;便是它的变量类型&#xff1b;一个指针变量…...

labelimg遇到的标签修改问题:修改一张图像的标签时,保存后导致classes.txt改变

问题描述&#xff1a;修改一张图像的标签时候&#xff0c; classes.txt 会同步更新&#xff0c;导致重新生成了 classes.txt 但是这个 classes.txt 只有你现在写的那个类别名&#xff0c;以前的没有了。 解决&#xff1a;设置一个 predefined_classes.txt&#xff0c;内容和模…...

Spring Cloud Gateway使用和配置

Spring Cloud Gateway是Spring官方基于Spring 5.0&#xff0c;Spring Boot 2.0和Project Reactor等技术开发的网关&#xff0c;Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关&#xff…...

RT-Thread 时钟管理

时钟管理 时钟是非常重要的概念&#xff0c;和朋友出去游玩需要约定时间&#xff0c;完成任务也需要花费时间&#xff0c;生活离不开时间。 操作系统也一样&#xff0c;需要通过时间来规范其任务的执行&#xff0c;操作系统中最小的时间单位是时钟节拍&#xff08;OS Tick&…...

User: zhangflink is not allowed to impersonate zhangflink

使用hive2连接进行添加数据是报错&#xff1a; [08S01][1] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. User: zhangflink is not allowed to impersonate zhangflink 有些文章说需要修…...

深入理解Sentinel系列-1.初识Sentinel

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…...

vue中字典的使用

1.引入字典 dicts: [order_status,product_type],2.表单中使用 select下拉 <el-form-item label"订单状态" prop"orderStatus"><el-select v-model"form.orderStatus" clearable placeholder"请输入订单状态" :disabled"…...

AWS基于x86 vs Graviton(ARM)的RDS MySQL性能对比

概述 这是一个系列。在前面&#xff0c;我们测试了阿里云经济版&#xff08;“ARM”&#xff09;与标准版的性能/价格对比&#xff1b;华为云x86规格与ARM&#xff08;鲲鹏增强&#xff09;版的性能/价格对比。现在&#xff0c;再来看看AWS的ARM版本的RDS情况 在2018年&#…...

ESP32 蓝牙音箱无法链接上电脑的解决:此项不起作用,请确保你的蓝牙设备仍可检测到

ESP32 被我加了放大器后通过A2DP链接手机播放一直正常&#xff0c;但是怎么都链接不到电脑&#xff0c;蓝牙设备可以被发现和配对&#xff0c;但是始终无法连接&#xff0c;显示&#xff1a; 此项不起作用&#xff0c;请确保你的蓝牙设备仍可检测到&#xff0c;然后再试一次 …...