PPT文件,Wor文件,Excel文件,TxT文件转PDF,PDF转图片,并添加水印
需求:各种文件需转成图片格式,在线预览,并打上水印。
本文将介绍如何将不同类型的文件首先转换为PDF格式,然后将PDF文件转换为图片并添加水印。
为了实现对象的解耦,提供灵活的扩展性,采用工厂设计模式。
各类文件转图片,并添加水印进行展示
1. 引入需要的依赖
<!-- 核心依赖 -->
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-words</artifactId>
<version>23.1</version>
</dependency>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-slides</artifactId>
<version>23.1</version>
</dependency>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-cells</artifactId>
<version>23.1</version>
</dependency>
<!-- 其它可用的 -->
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
2.创建文件转换工厂
2.1 文件转换工厂接口,根据文件类型选择文件转换器
package com.example.practice.common.convert;
/**
* 文件转换工厂
*
* @author : HP
* @date : 2023/4/18
*/
public interface FileFactory {
/**
* 根据类型创建不同的文件转换
*
* @param type 文件类型
* @return
*/
public FileConvert createConvert(String type);
}
2.2 文件转换工厂
这里我使用的是注入的方式,并没有去创建对象,因为创建一个新的对象时,spring属性 注入会出现为null的情况。
package com.example.practice.common.convert;
import com.example.practice.common.convert.concrete.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author : HP
* @date : 2023/4/18
*/
@Component
public class CreateFileFactory implements FileFactory{
@Resource
private PdfConvertToImg pdfConvertToImg;
@Resource
private WordConvertToImg wordConvertToImg;
@Resource
private PptCovertToImg pptCovertToImg;
@Resource
private ExcelConvertToImg excelConvertToImg;
@Resource
private TextConvertToImg textConvertToImg;
@Override
public FileConvert createConvert(String type) {
if ("pdf".equals(type)) {
return pdfConvertToImg;
} else if ("docx".equals(type) || "doc".equals(type)) {
return wordConvertToImg;
} else if ("pptx".equals(type) || "ppt".equals(type)) {
return pptCovertToImg;
}else if ("xlsx".equals(type) || "xls".equals(type)) {
return excelConvertToImg;
}else if ("txt".equals(type)) {
return textConvertToImg;
} else {
throw new IllegalArgumentException("Invalid File type");
}
}
}
3. 各种文件转PDF
我把各种文件转为PDF文件,写成了一个公共方法里面,FileUtil类,如下所示:
package com.example.practice.utils;
import com.aspose.cells.Workbook;
import com.aspose.cells.Worksheet;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import com.aspose.words.Document;
import com.aspose.words.PdfSaveOptions;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
* @author : HP
* @date : 2023/4/17
*/
@Slf4j
@Service
@Component
public class FileUtil {
public static final String FILE_TEMP_PDF = "D:\\tmp\\usercenter\\tempFile\\pdf_file\\Temp.pdf";
/**
* 如果文件夹不存在则创建文件夹,并返回该文件夹路径
*
* @param pathDirectory
* @return
*/
public static String getRootPath(String pathDirectory) {
File file = new File(pathDirectory);
if (!file.exists()) {
file.mkdirs();
}
return pathDirectory = pathDirectory + File.separator;
}
/**
* 加载ip白名单
*
* @param filePath ip白名单路径
* @return 返回IP
*/
public static Set<String> loadIpWhiteList(String filePath) {
Set<String> ipWhitelist = new HashSet<>();
try {
FileReader fileReader = new FileReader(filePath);
Scanner scanner = new Scanner(fileReader);
while (scanner.hasNextLine()) {
String ip = scanner.nextLine().trim();
if (!ip.isEmpty()) {
ipWhitelist.add(ip);
}
}
} catch (FileNotFoundException e) {
log.info("无法加载IP白名单文件" + filePath);
e.printStackTrace();
}
return ipWhitelist;
}
/**
* word转pdf-在线预览
*
* @param response
* @param file
*/
public static void wordToPdf(HttpServletResponse response, File file) {
XWPFDocument xwpfDocument = null;
OutputStream outputStream = null;
try {
xwpfDocument = new XWPFDocument(new FileInputStream(file));
PdfOptions pdfOptions = PdfOptions.create();
outputStream = response.getOutputStream();
PdfConverter.getInstance().convert(xwpfDocument, outputStream, pdfOptions);
outputStream.close();
xwpfDocument.close();
log.info("pdf转word成功");
} catch (IOException e) {
log.info("word to pdf is error:{}", e.getMessage());
} finally {
try {
if (xwpfDocument != null) {
xwpfDocument.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* word转pdf-保存到本地
*
* @param file
*/
public static void wordToPdf(File file) {
XWPFDocument xwpfDocument = null;
FileOutputStream outputStream = null;
try {
xwpfDocument = new XWPFDocument(new FileInputStream(file));
PdfOptions pdfOptions = PdfOptions.create();
outputStream = new FileOutputStream(FILE_TEMP_PDF);
PdfConverter.getInstance().convert(xwpfDocument, outputStream, pdfOptions);
outputStream.close();
xwpfDocument.close();
log.info("pdf转word成功--fileUtil中的");
} catch (IOException e) {
log.info("word to pdf is error:{}", e.getMessage());
} finally {
try {
if (xwpfDocument != null) {
xwpfDocument.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* word文档(.doc和.docx文件)-转pdf
*
* @param wordFilePath 输入的文件路径
*/
public static void asposeWordToPDF(String wordFilePath) {
try {
Document wordDocument = new Document(wordFilePath);
PdfSaveOptions pso = new PdfSaveOptions();
wordDocument.save(FILE_TEMP_PDF, pso);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* word文档(.doc和.docx文件)-转pdf
*
* @param wordSourceFilePath 输入的文件file
*/
public static void asposeWordToPDF(File wordSourceFilePath, String outputFilePath) {
try {
FileInputStream fileInputStream = new FileInputStream(wordSourceFilePath);
Document wordDocument = new Document(fileInputStream);
PdfSaveOptions pso = new PdfSaveOptions();
FileOutputStream outputStream = new FileOutputStream(outputFilePath);
wordDocument.save(outputStream, pso);
log.info("使用aspose方案将 word 转pdf成功===={}", DateUtil.getDefaultTime());
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* ppt转pdf
*
* @param pptFilePath
*/
public static void asposePptToPdf(String pptFilePath) {
try {
Presentation pres = new Presentation(pptFilePath);
FileOutputStream outputStream = new FileOutputStream("D:\\tmp\\usercenter\\tempFile\\pdf_file\\outputPpt.pdf");
pres.save(outputStream, SaveFormat.Pdf);
log.info("使用aspose方案将 ppt 转pdf成功===={}", DateUtil.getDefaultTime());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* ppf转pdf,输出到本地路径
*
* @param pptSourceFilePath 源路径
* @param outputFilePath 输出路径
*/
public static void asposePptToPdf(File pptSourceFilePath, String outputFilePath) {
try {
FileInputStream fileInputStream = new FileInputStream(pptSourceFilePath);
Presentation pres = new Presentation(fileInputStream);
FileOutputStream outputStream = new FileOutputStream(outputFilePath);
pres.save(outputStream, SaveFormat.Pdf);
log.info("使用aspose方案将 ppt 转pdf成功===={}", DateUtil.getDefaultTime());
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void asposeExcelToPdf(String excelFilePath) {
try {
Workbook workbook = new Workbook(excelFilePath);
com.aspose.cells.PdfSaveOptions pdfSaveOptions = new com.aspose.cells.PdfSaveOptions();
pdfSaveOptions.setOnePagePerSheet(true);
// 获取第一个工作表
Worksheet worksheet = workbook.getWorksheets().get(0);
// 设置水印文本
String watermarkText = "liudy23 " + DateUtil.getDefaultTime();
worksheet.getPageSetup().setHeader(0, watermarkText);
FileOutputStream outputStream = new FileOutputStream("D:\\tmp\\usercenter\\tempFile\\pdf_file\\outputExcel.pdf");
workbook.save(outputStream, pdfSaveOptions);
log.info("使用aspose方案将 excel 转 pdf 成功===={}", DateUtil.getDefaultTime());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* excel转pdf
*
* @param excelSourceFile 文件源路径
* @param outputFilePath 输出到本地路径
*/
public static void asposeExcelToPdf(File excelSourceFile, String outputFilePath) {
try {
FileInputStream fileInputStream = new FileInputStream(excelSourceFile);
Workbook workbook = new Workbook(fileInputStream);
com.aspose.cells.PdfSaveOptions pdfSaveOptions = new com.aspose.cells.PdfSaveOptions();
pdfSaveOptions.setOnePagePerSheet(true);
// 获取第一个工作表
Worksheet worksheet = workbook.getWorksheets().get(0);
// 设置水印文本
String watermarkText = "liudy23 " + DateUtil.getDefaultTime();
worksheet.getPageSetup().setHeader(0, watermarkText);
FileOutputStream outputStream = new FileOutputStream(outputFilePath);
workbook.save(outputStream, pdfSaveOptions);
log.info("使用aspose方案将 excel 转 pdf 成功===={}", DateUtil.getDefaultTime());
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean getLicence() {
boolean result = false;
try {
InputStream is = FileUtil.class.getClassLoader().getResourceAsStream("D:\\az\\maven\\repository\\com\\aspose\\License.xml");
// InputStream is = new FileInputStream(new File("D:\\az\\maven\\repository\\com\\aspose\\License.xml"));
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 输入文件获取图片流
*
* @param file
* @return
*/
public static BufferedImage getImagStream(File file) {
PDDocument pdDocument = null;
BufferedImage bufferedImage;
try {
// 使用 PDFBox 将 pdf 转成图片
pdDocument = PDDocument.load(file);
PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
int pageCount = pdDocument.getNumberOfPages();
int totalWidth = 0;
int totalHeight = 0;
// 获取每页pdf的大小,计算总大小
for (int i = 0; i < pageCount; i++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(i, 150);
// 横向构图
// totalWidth += image.getWidth();
// totalHeight = Math.max(totalHeight, image.getHeight());
totalWidth = Math.max(totalWidth, image.getWidth());
totalHeight += image.getHeight();
}
// 合成一张空白图片
bufferedImage = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
int x = 0;
int y = 0;
// 将每页pdf的内容画到空白图片上
for (int i = 0; i < pageCount; i++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(i, 150);
// bufferedImage.createGraphics().drawImage(image, x, 0, null);
// x += image.getWidth();
bufferedImage.createGraphics().drawImage(image, 0, y, null);
y += image.getHeight();
}
// bufferedImage = pdfRenderer.renderImage(0);
return bufferedImage;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (pdDocument != null) {
try {
pdDocument.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
4. 文件转换
4.1 创建文件转换抽象类,并定义抽象方法
package com.example.practice.common.convert;
import java.awt.image.BufferedImage;
import java.io.File;
/**
* @author : HP
* @date : 2023/4/18
*/
public abstract class FileConvert {
/**
* 文件转图片流
*
* @param file 输入文件
* @return
*/
public abstract BufferedImage covertToImgStream(File file);
}
4.2 PPT文件转图片流
注意:抽离的PPT转Pdf方法:asposePptToPdf,Pdf转图片流方法:getImagStream,均封装在FileUtil类里面。
package com.example.practice.common.convert.concrete;
import com.example.practice.common.convert.FileConvert;
import com.example.practice.utils.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.awt.image.BufferedImage;
import java.io.File;
/**
* ppt文件转图片流
*
* @author : HP
* @date : 2023/5/18
*/
@Component
public class PptCovertToImg extends FileConvert {
private static final String OUTPUT_PPT_TO_PDF = "D:\\tmp\\usercenter\\tempFile\\pdf_file\\outputPptTemp.pdf";
@Override
public BufferedImage covertToImgStream(File file) {
FileUtil.asposePptToPdf(file, OUTPUT_PPT_TO_PDF);
return FileUtil.getImagStream(new File(OUTPUT_PPT_TO_PDF));
}
}
4.3 Word文件转图片流
注意:平常的工作当中,OUTPUT_WORD_TO_PDF 输出路径不用在代码里面写死,可以使用配置文件的形式。我这里使用private BasicProperties basicProperties去加载配置文件,也可以获取到配置文件中指定的内容
package com.example.practice.common.convert.concrete;
import com.example.practice.common.config.properties.BasicProperties;
import com.example.practice.common.convert.FileConvert;
import com.example.practice.utils.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Properties;
/**
* Word文件转图片流
*
* @author : HP
* @date : 2023/4/18
*/
@Slf4j
@Service
public class WordConvertToImg extends FileConvert {
private static final String OUTPUT_WORD_TO_PDF = "D:\\tmp\\usercenter\\tempFile\\pdf_file\\outputWordTemp.pdf";
@Resource
private BasicProperties basicProperties;
@Override
public BufferedImage covertToImgStream(File file) {
try {
FileUtil.asposeWordToPDF(file, OUTPUT_WORD_TO_PDF);
File tempFile = new File(OUTPUT_WORD_TO_PDF);
return FileUtil.getImagStream(tempFile);
} catch (Exception e) {
log.info("covertToImgStream is error: {}", e.getMessage());
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Properties properties = System.getProperties();
System.out.println(properties);
}
}
package com.example.practice.common.config.properties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.io.Serializable;
/**
* 配置文件中基本的参数信息
*
* @author : HP
* @date : 2023/3/16
*/
@Data
@Configuration
@ConfigurationProperties(prefix = BasicProperties.PREFIX)
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("配置文件中基本的参数信息")
public class BasicProperties implements Serializable {
private static final long serialVersionUID = -8530307978299621486L;
public static final String PREFIX = "basic";
@ApiModelProperty(name = "fileUploadPath", value = "文件上传路径")
private String fileUploadPath;
@ApiModelProperty(name = "fileSavePath", value = "文件保存路径")
private String fileSavePath;
@ApiModelProperty(name = "address", value = "配置文件中的 address")
private String address;
@ApiModelProperty(name = "fileIpWhiteFile", value = "IP白名单位置")
private String fileIpWhiteFile;
@ApiModelProperty(name = "fileTempPdf", value = "临时保存的pdf文件地址")
private String fileTempPdf;
}
4.4 Excel文件转图片流
package com.example.practice.common.convert.concrete;
import com.example.practice.common.convert.FileConvert;
import com.example.practice.utils.FileUtil;
import org.springframework.stereotype.Component;
import java.awt.image.BufferedImage;
import java.io.File;
/**
* Excel文件转图片流
*
* @author : HP
* @date : 2023/5/18
*/
@Component
public class ExcelConvertToImg extends FileConvert {
private static final String OUTPUT_EXCEL_TO_PDF = "D:\\tmp\\usercenter\\saveFile\\2023-03-17\\outputExcelTemp.pdf";
@Override
public BufferedImage covertToImgStream(File file) {
FileUtil.asposeExcelToPdf(file, OUTPUT_EXCEL_TO_PDF);
return FileUtil.getImagStream(new File(OUTPUT_EXCEL_TO_PDF));
}
}
4.5 Txt文件转图片流
package com.example.practice.common.convert.concrete;
import com.example.practice.common.convert.FileConvert;
import org.springframework.stereotype.Component;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Collectors;
/**
* text文件转图片流
*
* @author : HP
* @date : 2023/5/17
*/
@Component
public class TextConvertToImg extends FileConvert {
private static final String FILE_SAVE_PATH = "D:\\tmp\\usercenter\\tempFile\\png_file\\liudy23.png";
@Override
public BufferedImage covertToImgStream(File file) {
try {
Path path = Paths.get(file.getPath());
String textString = Files.lines(path).collect(Collectors.joining("\n"));
BufferedImage bufferedImage = convertTextToImage(textString);
return bufferedImage;
// ImageIO.write(bufferedImage, "png", new File(FILE_SAVE_PATH));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static BufferedImage convertTextToImage(String text) {
Font font = new Font(Font.MONOSPACED, Font.PLAIN, 12);
FontMetrics fontMetrics = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB)
.getGraphics().getFontMetrics(font);
int lineHeight = fontMetrics.getHeight();
int margin = 20;
// 计算文本的行数和最大行宽
String[] lines = text.split("\n");
int lineCount = lines.length;
int maxLineWidth = 0;
for (String line : lines) {
int lineWidth = fontMetrics.stringWidth(line);
maxLineWidth = Math.max(maxLineWidth, lineWidth);
}
// 计算图像的宽度和高度
int imageWidth = maxLineWidth + 2 * margin;
int imageHeight = lineHeight * lineCount + 2 * margin;
BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, imageWidth, imageHeight);
graphics.setColor(Color.BLACK);
graphics.setFont(font);
int currentY = margin;
for (String line : lines) {
graphics.drawString(line, margin, currentY);
currentY += lineHeight;
}
graphics.dispose();
return image;
}
}
4.6 Pdf文件转图片流
package com.example.practice.common.convert.concrete;
import com.example.practice.common.convert.FileConvert;
import com.example.practice.utils.FileUtil;
import org.springframework.stereotype.Component;
import java.awt.image.BufferedImage;
import java.io.File;
/**
* Pdf文件转图片流
*
* @author : HP
* @date : 2023/4/18
*/
@Component
public class PdfConvertToImg extends FileConvert {
@Override
public BufferedImage covertToImgStream(File file) {
return FileUtil.getImagStream(file);
// PDDocument pdDocument = null;
// BufferedImage bufferedImage;
// try {
// // 使用 PDFBox 将 pdf 转成图片
// pdDocument = PDDocument.load(file);
// PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
// int pageCount = pdDocument.getNumberOfPages();
// int totalWidth = 0;
// int totalHeight = 0;
// // 获取每页pdf的大小,计算总大小
// for (int i = 0; i < pageCount; i++) {
// BufferedImage image = pdfRenderer.renderImageWithDPI(i, 150);
// // 横向构图
// // totalWidth += image.getWidth();
// // totalHeight = Math.max(totalHeight, image.getHeight());
// totalWidth = Math.max(totalWidth, image.getWidth());
// totalHeight += image.getHeight();
// }
//
// // 合成一张空白图片
// bufferedImage = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
// int x = 0;
// int y = 0;
//
// // 将每页pdf的内容画到空白图片上
// for (int i = 0; i < pageCount; i++) {
// BufferedImage image = pdfRenderer.renderImageWithDPI(i, 150);
// // bufferedImage.createGraphics().drawImage(image, x, 0, null);
// // x += image.getWidth();
// bufferedImage.createGraphics().drawImage(image, 0, y, null);
// y += image.getHeight();
// }
// // bufferedImage = pdfRenderer.renderImage(0);
// return bufferedImage;
// } catch (IOException e) {
// e.printStackTrace();
// } finally {
// if (pdDocument != null) {
// try {
// pdDocument.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
// return null;
}
}
5. 给图片添加水印
/**
* 添加多处水印
*
* @param image 输入的图片流文件
* @param watermark 水印内容
* @param font 字体
* @param color 颜色
* @param alpha 水印深度
* @return
*/
public static Graphics2D addMultipleWatermarkToImage(BufferedImage image, String watermark, Font font, Color color, float alpha) {
Graphics2D g2d = (Graphics2D) image.getGraphics();
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2d.setComposite(alphaComposite);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setFont(font);
g2d.setColor(color);
// 计算水印宽度和高度
FontMetrics fontMetrics = g2d.getFontMetrics(font);
int textWidth = fontMetrics.stringWidth(watermark);
int textHeight = fontMetrics.getHeight();
// 计算图片中心坐标
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();
int centerX = imageWidth / 2;
int centerY = imageHeight / 2;
int spacingX = (int) (1.5 * textWidth);
int spacingY = 5 * textHeight;
// 调整旋转角度
g2d.rotate(Math.toRadians(-30), centerX, centerY);
// 在图片上多个位置添加水印
log.info("{}====imageHeight:{},====imageWidth:{},====spacingX:{},====spacingY:{},", DateUtil.getDefaultTime(), imageHeight, imageWidth, spacingX, spacingY);
for (int y = 0; y < imageHeight; y += spacingY) {
for (int x = -imageWidth; x < imageWidth * 2; x += spacingX) {
g2d.drawString(watermark, x, y);
}
}
return g2d;
}
6. 文件转图片并添加水印
/**
* 文件转图片
*
* @param file 目标文件
* @param fileType 文件类型
* @param loginUser 当前系统登录的用户
* @param response
*/
@Override
public void fileToImage(File file, String fileType, User loginUser, HttpServletResponse response) {
response.setContentType(MimeTypeUtils.IMAGE_PNG_VALUE);
FileConvert convert = createFileFactory.createConvert(fileType);
BufferedImage bufferedImage = convert.convertToImageStream(file);
// 添加水印
String watermark = String.format("My Logo %s %s %s", loginUser.getUserName(), loginUser.getJobNum(), DateUtil.getDay());
Font font = new Font("微软雅黑", Font.BOLD, 40);
Graphics2D g2d = ImageUtil.addMultipleWatermarkToImage(bufferedImage, watermark, font, Color.RED, 0.1f);
OutputStream os = null;
try {
os = response.getOutputStream();
ImageIO.write(bufferedImage, "png", os);
g2d.dispose();
os.flush();
os.close();
log.info("{} 文件转图片成功!", fileType);
} catch (IOException e) {
log.info("{} 文件转图片失败!", fileType);
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
7. 控制器调用测试
@GetMapping("/fileToImg")
@ApiOperation("测试文件转图片进行展示")
private void fileToImg(HttpServletResponse response, @RequestParam("filePath") String filePath) {
File file = new File(filePath);
String fileType = filePath.substring(filePath.lastIndexOf(".") + 1);
fileHandlerService.fileToImg(file, response, fileType);
}