You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
6.4 KiB
169 lines
6.4 KiB
package com.hai.config;
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
import sun.font.FontDesignMetrics;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import java.awt.*;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.util.Map;
|
|
import java.util.zip.ZipEntry;
|
|
import java.util.zip.ZipOutputStream;
|
|
|
|
/**
|
|
* @serviceName QrCodeUtilsConfig.java
|
|
* @author Sum1Dream
|
|
* @version 1.0.0
|
|
* @Description // 工具
|
|
* @createTime 09:54 2022/4/13
|
|
**/
|
|
@Configuration
|
|
public class CommonConfig {
|
|
|
|
//得到该字体字符串的长度
|
|
public static int getWordWidth(Font font, String content) {
|
|
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
|
|
int width = 0;
|
|
for (int i = 0; i < content.length(); i++) {
|
|
width += metrics.charWidth(content.charAt(i));
|
|
}
|
|
return width;
|
|
}
|
|
|
|
// 二维码生产自定义图片
|
|
public static void overlapImage(String path , String content) throws Exception {
|
|
BufferedImage read = ImageIO.read(new File(CommonSysConst.getSysConfig().getFileUrl() + "img/original_image.png"));
|
|
Image image = ImageIO.read(new File(CommonSysConst.getSysConfig().getFileUrl() + "/" + path));
|
|
|
|
Graphics graphics = read.getGraphics();
|
|
|
|
graphics.drawImage(image, (read.getWidth() - image.getWidth(null))/2 ,306, null);
|
|
graphics.setColor(Color.BLACK);
|
|
//定义字体
|
|
Font font = new Font("微软雅黑", Font.PLAIN, 14);
|
|
//计算该字体文本的长度
|
|
int wordWidth = CommonConfig.getWordWidth(font, content);
|
|
|
|
graphics.setFont(font);
|
|
graphics.drawString( content, (read.getWidth() - wordWidth)/2 ,304 + image.getHeight(null));
|
|
|
|
ImageIO.write(read , "png" , new File(CommonSysConst.getSysConfig().getFileUrl() + "/" + path));
|
|
}
|
|
|
|
|
|
/**
|
|
* 多文件压缩成ZIP
|
|
*
|
|
* @param imageMap 需要压缩的文件列表,键值对为 <文件名,文件的字节数组>,文件名必须包含后缀
|
|
* @param out 压缩文件输出流
|
|
* @throws RuntimeException 压缩失败会抛出运行时异常
|
|
*/
|
|
public static void toZip(Map<String, byte[]> imageMap, OutputStream out) throws RuntimeException {
|
|
long start = System.currentTimeMillis();
|
|
try (ZipOutputStream zos = new ZipOutputStream(out)) {
|
|
for (Map.Entry<String, byte[]> map : imageMap.entrySet()) {
|
|
zos.putNextEntry(new ZipEntry(map.getKey()));
|
|
zos.write(map.getValue());
|
|
zos.closeEntry();
|
|
}
|
|
long end = System.currentTimeMillis();
|
|
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
|
|
} catch (Exception e) {
|
|
throw new RuntimeException("zip error from ZipUtils", e);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* 文件夹压缩成ZIP
|
|
*
|
|
* @param srcDir 压缩文件夹路径
|
|
* @param out 压缩文件输出流
|
|
* @param keepDirStructure 是否保留原来的目录结构,true:保留目录结构;
|
|
*
|
|
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
|
|
*
|
|
* @throws RuntimeException 压缩失败会抛出运行时异常
|
|
*
|
|
*/
|
|
public static void toZip(String srcDir, OutputStream out, boolean keepDirStructure)
|
|
throws RuntimeException {
|
|
long start = System.currentTimeMillis();
|
|
ZipOutputStream zos = null;
|
|
try {
|
|
zos = new ZipOutputStream(out);
|
|
File sourceFile = new File(srcDir);
|
|
compress(sourceFile, zos, sourceFile.getName(), keepDirStructure);
|
|
long end = System.currentTimeMillis();
|
|
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
|
|
} catch (Exception e) {
|
|
throw new RuntimeException("zip error from ZipUtils", e);
|
|
} finally {
|
|
if (zos != null) {
|
|
try {
|
|
zos.close();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* 递归压缩方法
|
|
* @param sourceFile 源文件
|
|
* @param zos zip输出流
|
|
* @param name 压缩后的名称
|
|
* @param keepDirStructure 是否保留原来的目录结构,true:保留目录结构;
|
|
*
|
|
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
|
|
* @throws Exception
|
|
*/
|
|
private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean keepDirStructure) throws Exception {
|
|
byte[] buf = new byte[2048];
|
|
if (sourceFile.isFile()) {
|
|
// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
|
|
zos.putNextEntry(new ZipEntry(name));
|
|
// copy文件到zip输出流中
|
|
int len;
|
|
FileInputStream in = new FileInputStream(sourceFile);
|
|
while ((len = in.read(buf)) != -1) {
|
|
zos.write(buf, 0, len);
|
|
}
|
|
// Complete the entry
|
|
zos.closeEntry();
|
|
in.close();
|
|
} else {
|
|
File[] listFiles = sourceFile.listFiles();
|
|
if (listFiles == null || listFiles.length == 0) {
|
|
// 需要保留原来的文件结构时,需要对空文件夹进行处理
|
|
if (keepDirStructure) {
|
|
// 空文件夹的处理
|
|
zos.putNextEntry(new ZipEntry(name + "/"));
|
|
// 没有文件,不需要文件的copy
|
|
zos.closeEntry();
|
|
}
|
|
} else {
|
|
for (File file : listFiles) {
|
|
// 判断是否需要保留原来的文件结构
|
|
if (keepDirStructure) {
|
|
// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
|
|
// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
|
|
compress(file, zos, name + "/" + file.getName(), keepDirStructure);
|
|
} else {
|
|
compress(file, zos, file.getName(), keepDirStructure);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|