Browse Source

二维码生成工具类、模板操作工具类

dev-warehouse
kilo 2 years ago
parent
commit
ccf217a687
  1. 25
      blade-biz-common/pom.xml
  2. 69
      blade-biz-common/src/main/java/org/springblade/common/utils/QRCodeUtil.java
  3. 150
      blade-biz-common/src/main/java/org/springblade/common/utils/TemplateUtil.java

25
blade-biz-common/pom.xml

@ -29,6 +29,7 @@
<scope>provided</scope>
</dependency>
<!-- 二维码生成jar包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
@ -39,12 +40,13 @@
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
<!-- commons-lang-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
@ -55,6 +57,27 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--minio-->
<!-- <dependency>-->
<!-- <groupId>io.minio</groupId>-->
<!-- <artifactId>minio</artifactId>-->
<!-- <version>8.5.2</version>-->
<!-- </dependency>-->
<!--freemark模板所需类-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>core-renderer</artifactId>
<version>R8</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>

69
blade-biz-common/src/main/java/org/springblade/common/utils/QRCodeUtil.java

@ -19,6 +19,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 二维码工具
@ -30,40 +31,46 @@ public class QRCodeUtil {
private static final Logger log= LoggerFactory.getLogger(QRCodeUtil.class);
//CODE_WIDTH:二维码宽度,单位像素
private static final int CODE_WIDTH = 400;
private static final int CODE_WIDTH = 100;
//CODE_HEIGHT:二维码高度,单位像素
private static final int CODE_HEIGHT = 400;
private static final int CODE_HEIGHT = 100;
//FRONT_COLOR:二维码前景色,0x000000 表示黑色
private static final int FRONT_COLOR = 0x000000;
//BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色
//演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白
private static final int BACKGROUND_COLOR = 0xFFFFFF;
public static void createCodeToFile(String content, File codeImgFileSaveDir, String fileName) {
try {
if (StringUtils.isBlank(content) || StringUtils.isBlank(fileName)) {
return;
}
content = content.trim();
if (codeImgFileSaveDir==null || codeImgFileSaveDir.isFile()) {
//二维码图片存在目录为空,默认放在桌面...
codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();
}
if (!codeImgFileSaveDir.exists()) {
//二维码图片存在目录不存在,开始创建...
codeImgFileSaveDir.mkdirs();
}
//核心代码-生成二维码
BufferedImage bufferedImage = getBufferedImage(content);
File codeImgFile = new File(codeImgFileSaveDir, fileName);
ImageIO.write(bufferedImage, "png", codeImgFile);
log.info("二维码图片生成成功:" + codeImgFile.getPath());
} catch (Exception e) {
e.printStackTrace();
}
//默认生成二维码格式
private static final String FileFormat="png";
private static final String path="qrCodeImg";
public static String createCodeToFile(String content) {
try {
//getResource("/")等同于到resource文件夹下
String imgPath = QRCodeUtil.class.getResource("").getPath()+path;
File codeImgFileSaveDir = new File(imgPath);
//1. 使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
String fileName = UUID.randomUUID() + "." +FileFormat;
content = content.trim();
if (codeImgFileSaveDir==null || codeImgFileSaveDir.isFile()) {
//二维码图片存在目录为空,默认放在桌面...
codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();
}
if (!codeImgFileSaveDir.exists()) {
//二维码图片存在目录不存在,开始创建...
codeImgFileSaveDir.mkdirs();
}
//核心代码-生成二维码
BufferedImage bufferedImage = getBufferedImage(content);
File codeImgFile = new File(codeImgFileSaveDir, fileName);
ImageIO.write(bufferedImage, FileFormat, codeImgFile);
return fileName = imgPath +"/"+fileName;
// return folderName+fileName;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
@ -80,15 +87,13 @@ public class QRCodeUtil {
content = content.trim();
//核心代码-生成二维码
BufferedImage bufferedImage = getBufferedImage(content);
//区别就是这一句,输出到输出流中,如果第三个参数是 File,则输出到文件中
ImageIO.write(bufferedImage, "png",response.getOutputStream());
ImageIO.write(bufferedImage, FileFormat,response.getOutputStream());
log.info("二维码图片生成到输出流成功...");
}
//核心代码-生成二维码
private static BufferedImage getBufferedImage(String content) throws WriterException {
public static BufferedImage getBufferedImage(String content) throws WriterException {
//com.google.zxing.EncodeHintType:编码提示类型,枚举类型
Map<EncodeHintType, Object> hints = new HashMap();

150
blade-biz-common/src/main/java/org/springblade/common/utils/TemplateUtil.java

@ -0,0 +1,150 @@
package org.springblade.common.utils;
import freemarker.cache.ByteArrayTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.io.IOUtils;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xhtmlrenderer.swing.Java2DRenderer;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.logging.Logger;
public class TemplateUtil {
/**
* 通过远程URL地址获取模板
* 此方法可以通过URL加载存储在远程服务器上的模板
*
* @param template
* @param map
* @param url
* @return
* @throws Exception
*/
public static String getTemplateByUrl(String template, Map<String, Object> map, String url) throws Exception {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
ByteArrayTemplateLoader byteArrayTemplateLoader = new ByteArrayTemplateLoader();
InputStream initialStream = getInputStreamByGet(url);
byteArrayTemplateLoader.putTemplate(template, IOUtils.toByteArray(initialStream));
cfg.setTemplateLoader(byteArrayTemplateLoader);
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
cfg.setClassicCompatible(true);
Template temp = cfg.getTemplate(template);
StringWriter stringWriter = new StringWriter();
temp.process(map, stringWriter);
stringWriter.flush();
stringWriter.close();
String result = stringWriter.getBuffer().toString();
return result;
}
/**
* 通过get请求得到读取器响应数据的数据流
*
* @param url
* @return
* @throws Exception
*/
public static InputStream getInputStreamByGet(String url) throws Exception {
InputStream inputStream = null;
HttpURLConnection conn = (HttpURLConnection) new URL(url)
.openConnection();
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.setConnectTimeout(5000);
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
inputStream = conn.getInputStream();
}
return inputStream;
}
/**
* ftl模板生成图片
* @param template
* @param map
* @param url
* @throws Exception
*/
public static BufferedImage turnImage(String template, Map<String,Object> map, String url,Integer width,Integer height) {
//方式一:指定模板文件路径加载模板
// String html = getTemplateByTemplatePath(template, map);
//方式二:指定类加载器加载模板
// String html = getTemplateByClassLoader(template, map);
//方式三:指定远程模板文件存储路径加载模板
String html = null;
BufferedImage img =null;
try {
html = getTemplateByUrl(template, map,url);
byte[] bytes=html.getBytes();
ByteArrayInputStream bin=new ByteArrayInputStream(bytes);
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(bin);
Java2DRenderer renderer = new Java2DRenderer(document,width,height);
img = renderer.getImage();
} catch (Exception e) {
e.printStackTrace();
}
return img;
}
/**
* 待合并的两张图必须满足这样的前提如果水平方向合并则高度必须相等如果是垂直方向合并宽度必须相等
* mergeImage方法不做判断自己判断
*
* @param img1
* 待合并的第一张图
* @param img2
* 带合并的第二张图
* @param isHorizontal
* 为true时表示水平方向合并为false时表示垂直方向合并
* @return 返回合并后的BufferedImage对象
* @throws IOException
*/
public static BufferedImage mergeImage(BufferedImage img1,
BufferedImage img2, boolean isHorizontal) throws IOException {
int w1 = img1.getWidth();
int h1 = img1.getHeight();
int w2 = img2.getWidth();
int h2 = img2.getHeight();
// 从图片中读取RGB
int[] ImageArrayOne = new int[w1 * h1];
ImageArrayOne = img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
int[] ImageArrayTwo = new int[w2 * h2];
ImageArrayTwo = img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2);
// 生成新图片
BufferedImage DestImage = null;
if (isHorizontal) { // 水平方向合并
DestImage = new BufferedImage(w1+w2, h1, BufferedImage.TYPE_INT_RGB);
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2);
} else { // 垂直方向合并
DestImage = new BufferedImage(w1, h1 + h2, BufferedImage.TYPE_INT_RGB);
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 设置下半部分的RGB
}
return DestImage;
}
}
Loading…
Cancel
Save