pdf和word等文档添加水印

前言

本文介绍了java为pdf, word, excel, ppt等文档添加水印的方法, 详见官方文档



正文

效果图

pdf

在这里插入图片描述

word

注意: wps显示异常, 详见代码注释
在这里插入图片描述

ppt

在这里插入图片描述


maven依赖

e-iceblue.office仓库

可以直接将jar推送到私服无需引入此仓库

<!-- office水印仓库 -->
<repository>
    <id>com.e-iceblue</id>
    <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>

maven依赖

<!-- pdf水印 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.12</version>
</dependency>
<!-- pdf中文水印支持 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>
<!-- office水印依赖包 -->
<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.office.free</artifactId>
    <version>5.3.1</version>
</dependency>

java代码

main函数里有测试用例


import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.HeaderFooter;
import com.spire.doc.Section;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.ShapeLineStyle;
import com.spire.doc.fields.ShapeObject;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.graphics.*;
import com.spire.pdf.widget.PdfPageCollection;
import com.spire.presentation.*;
import com.spire.presentation.collections.SlideCollection;
import com.spire.presentation.drawing.FillFormatType;
import com.spire.xls.ViewMode;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import sun.font.FontDesignMetrics;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 水印工具类
 *
 * @author LSL
 * @date 2022-07-28 22:54:52
 */
@Slf4j
public class WatermarkUtil {
   

    /**
     * 水印相关配置
     */
    private static final int FONT_SIZE = 12;
    private static final Font FONT = new Font("宋体", Font.PLAIN, FONT_SIZE);
    private static final Color FONT_COLOR = new Color(200, 200, 200);
    private static final float TEXT_ROTATION = 30;

    /**
     * 文件类型
     */
    interface FileType {
   
        String PDF = "pdf";
        String DOC = "doc";
        String DOCX = "docx";
        String XLS = "xls";
        String XLSX = "xlsx";
        String PPT = "ppt";
        String PPTX = "pptx";
        String JPG = "jpg";
        String JPEG = "jpeg";
        String PNG = "png";
        String BMP = "bmp";
    }

    /**
     * word格式映射
     */
    private static final Map<String, FileFormat> FILE_FORMAT_WORD_MAP = new HashMap<>();
    /**
     * ppt格式映射
     */
    private static final Map<String, com.spire.presentation.FileFormat> FILE_FORMAT_PPT_MAP = new HashMap<>();

    static {
   
        FILE_FORMAT_WORD_MAP.put(FileType.DOC, FileFormat.Doc);
        FILE_FORMAT_WORD_MAP.put(FileType.DOCX, FileFormat.Docx_2013);

        FILE_FORMAT_PPT_MAP.put(FileType.PPT, com.spire.presentation.FileFormat.PPT);
        FILE_FORMAT_PPT_MAP.put(FileType.PPTX, com.spire.presentation.FileFormat.PPTX_2013);
    }

    /**
     * 添加水印
     *
     * @param inputStream  文件输入流
     * @param outputStream 输出流
     * @param fileType     文件类型
     * @param watermark    水印
     */
    public static boolean watermark(InputStream inputStream, OutputStream outputStream, String fileType, String watermark) {
   
        try {
   
            switch (fileType) {
   
                // office
                case FileType.PDF:
                    WatermarkUtil.pdf(inputStream, outputStream, fileType, watermark);
                    break;
                case FileType.DOC:
                case FileType.DOCX:
                    WatermarkUtil.word(inputStream, outputStream, fileType, watermark);
                    break;
                case FileType.XLS:
                case FileType.XLSX:
                    WatermarkUtil.excel(inputStream, outputStream, fileType, watermark);
                    break;
                case FileType.PPT:
                case FileType.PPTX:
                    WatermarkUtil.ppt(inputStream, outputStream, fileType, watermark);
                    break;
                // 图片
                case FileType.JPG:
                case FileType.JPEG:
                case FileType.PNG:
                case FileType.BMP:
                    WatermarkUtil.picture(inputStream, outputStream, fileType, watermark);
                    break;
                // 其他
                default:
                    WatermarkUtil.other(inputStream, outputStream, fileType, watermark);
                    break;
            }
        } catch (Exception e) {
   
            log.error(fileType + "水印添加失败", e);
            return false;
        } finally {
   
            // 释放资源
            try {
   
                if (outputStream != null) {
   
                    outputStream.close();
                }
            } catch (Exception e) {
   
                e.printStackTrace();
            }
            try {
   
                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值