PPT文件,Wor文件,Excel文件,TxT文件转PDF,PDF转图片,并添加水印

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);
    }

自此,Word(.dox, .doxc), Excel(.xls,.xlsx), PPT(.ppt, .pptx), Txt(.txt)文件转图片,并添加水印展示完毕,感谢。

Demo的GitHub地址:https://github.com/Deyi3417/JavaPractice.git

展示效果,请求连接:http://localhost:9080/api/picture/fileToImg?filePath=D:\tmp\usercenter\tempFile\liudy23.docx

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值