java 图片及pdf 加文字水印

本文介绍了两个工具类:ImageRemarkUtil用于图片添加水印,支持文字旋转;PdfRemarkUtil用于PDF文件加水印,利用iTextPDF库实现。通过这两个工具,可以批量为图片和PDF文件添加定制化的水印效果。
摘要由CSDN通过智能技术生成

1.图片加水印

package com.demo.util;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.Date;

/**
 * Description: 图片水印工具类 
 * @version 1.0
 */
public class ImageRemarkUtil {

	// 水印透明度
	private static float alpha = 0.5f;
	// 水印文字字体
	private static Font font = new Font("宋体", Font.BOLD, 20);
	// 水印文字颜色
	private static Color color = Color.gray;



	/**
	 * 给图片添加水印文字、可设置水印文字的旋转角度
	 * 
	 * @param logoText
	 * @param srcImgPath
	 * @param targerPath
	 * @param degree
	 */
	public static void markImageByText(String logoText, String srcImgPath,String imgType,
			String targerPath, Integer degree) {

		InputStream is = null;
		OutputStream os = null;
		try {
			// 1、源图片
			URL urlfile = new URL(srcImgPath);
			Image srcImg = ImageIO.read(urlfile);

			BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
					srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

			setImage(buffImg,srcImg,degree,logoText);
			// 10、生成图片
			os = new FileOutputStream(targerPath);
			ImageIO.write(buffImg, imgType, os);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != is)
					is.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (null != os)
					os.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * 给图片添加水印文字、可设置水印文字的旋转角度
	 *
	 * @param logoText
	 * @param srcImgPath
	 * @param is
	 * @param degree
	 */
	public static InputStream markImageByText(String logoText, String srcImgPath,String imgType,
									   InputStream is, Integer degree) {

		try {

			ByteArrayOutputStream bs = new ByteArrayOutputStream();
			ImageOutputStream imOut;
			imOut = ImageIO.createImageOutputStream(bs);
			// 1、源图片
			URL urlfile = new URL(srcImgPath);
			Image srcImg = ImageIO.read(urlfile);
			BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
					srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

			setImage(buffImg,srcImg,degree,logoText);
			// 10、生成图片
			ImageIO.write(buffImg, imgType, imOut);
			is = new ByteArrayInputStream(bs.toByteArray());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return is;
	}

	private static void setImage(BufferedImage buffImg,	Image srcImg,Integer degree,String logoText){


		// 2、得到画笔对象
		Graphics2D g = buffImg.createGraphics();
		// 3、设置对线段的锯齿状边缘处理
		g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g.drawImage(
				srcImg.getScaledInstance(srcImg.getWidth(null),
						srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
				null);
		// 4、设置水印旋转
		if (null != degree) {
			g.rotate(Math.toRadians(degree),
					(double) buffImg.getWidth() / 2,
					(double) buffImg.getHeight() / 2);
		}
		// 5、设置水印文字颜色
		g.setColor(color);
		// 6、设置水印文字Font
		g.setFont(font);
		// 7、设置水印文字透明度
		g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
				alpha));
		// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
		for (int i = 0; i < buffImg.getHeight() / 120; i++) {
			for (int j = 0; j < buffImg.getWidth() / 50; j++) {
				g.drawString(logoText, i * 300, j * 200);
			}
		}
		// 9、释放资源
		g.dispose();
	}

	public static void main(String[] args) {

		for (int i = 0; i < 10; i++) {
			int finalI = i;
			ThreadUtils.execute(() -> test(finalI));
		}
	}

	public static void test(int i){
		System.out.println("第"+i+"张图片添加水印文字开始... "+ new Date());
		String srcImgPath = "https://c-ssl.duitang.com/uploads/item/202006/24/20200624135159_zcwoi.jpg";
		String logoText = "复印无效";
		String targerTextPath2 = "D:/image/AAb"+i+".jpg";

		// 给图片添加水印文字,水印文字旋转-45
		markImageByText(logoText, srcImgPath,"jpg", targerTextPath2, -45);
		System.out.println("第"+i+"张图片添加水印文字结束... "+new Date());
	}

}

2.pdf加水印
引入依赖

       <!-- pdf加水印 start -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <!-- pdf加水印 end -->
package com.demo.util;


import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.Date;

public class PdfRemarkUtil {


    public static void main(String[] args) throws DocumentException, IOException {

        for (int i = 0; i < 10; i++) {
            int finalI = i;
            ThreadUtils.execute(() -> test(finalI));
        }

    }
    private static void test(int i){

        // 将pdf文件先加水印然后输出
        System.out.println("第"+i+"张pdf开始加水印"+new Date());
        try {
            setWatermarkByUrl("网址.pdf","D:/image/"+i+".pdf",  "测试水印");
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("第"+i+"张pdf结束加水印"+new Date());
    }

    /**
     *
     * @param output
     * @param input
     *            原PDF位置
     * @param waterMarkName
     *            页脚添加水印
     * @throws DocumentException
     * @throws IOException
     */
    public static void setWatermark(String input,String output,  String waterMarkName)
            throws DocumentException, IOException {

        PdfReader reader = new PdfReader(input);
        PdfReader.unethicalreading = true;
        //PdfStamper stamper = new PdfStamper(reader, bos);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
                output));
        setPdf(reader,stamper,waterMarkName);
    }

    private static void setPdf(PdfReader reader,PdfStamper stamper,  String waterMarkName ) throws IOException, DocumentException {
        try {
            // 获取总页数 +1, 下面从1开始遍历
            int total = reader.getNumberOfPages() + 1;
            // 使用classpath下面的字体库
            BaseFont base = null;
            try {
                base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            } catch (Exception e) {
                // 日志处理
                e.printStackTrace();
            }

            // 获取水印文字的高度和宽度
            int textH = 0, textW = 0;
            JLabel label = new JLabel();
            label.setText(waterMarkName);
            FontMetrics metrics = label.getFontMetrics(label.getFont());
            textH = metrics.getHeight();
            textW = metrics.stringWidth(label.getText());

            // 设置水印透明度
            PdfGState gs = new PdfGState();
            gs.setFillOpacity(0.4f);
            gs.setStrokeOpacity(0.4f);

            Rectangle pageSizeWithRotation = null;
            PdfContentByte content = null;
            for (int i = 1; i < total; i++) {
                // 在内容上方加水印
                content = stamper.getOverContent(i);
                // 在内容下方加水印
                // content = stamper.getUnderContent(i);
                content.saveState();
                content.setGState(gs);

                // 设置字体和字体大小
                content.beginText();
                content.setFontAndSize(base, 20);

                // 获取每一页的高度、宽度
                pageSizeWithRotation = reader.getPageSizeWithRotation(i);
                float pageHeight = pageSizeWithRotation.getHeight();
                float pageWidth = pageSizeWithRotation.getWidth();

                // 根据纸张大小多次添加, 水印文字成45度角倾斜
                for (int k = 0; k < pageHeight / 120; k++) {
                    for (int j = 0; j < pageWidth / 50; j++) {
                        content.showTextAligned(Element.ALIGN_LEFT, waterMarkName, k * 120+textW, j * 150+textH, 45);
                    }
                }
                content.endText();
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 关流
            stamper.close();
            reader.close();
        }
    }
    public static void setWatermarkByUrl(String inputUrl,String output,  String waterMarkName)
            throws DocumentException, IOException {
        URL urlfile = new URL(inputUrl);
        PdfReader reader = new PdfReader(urlfile);
        PdfReader.unethicalreading = true;
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
                output));
        setPdf(reader,stamper,waterMarkName);
    }
    public static InputStream setWatermarkByUrlAndOutputStream(String inputUrl, InputStream inputStream, String waterMarkName)
            throws DocumentException, IOException {
        URL urlfile = new URL(inputUrl);
        PdfReader reader = new PdfReader(urlfile);
        PdfReader.unethicalreading = true;
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        PdfStamper stamper = new PdfStamper(reader, bs);

        setPdf(reader,stamper,waterMarkName);

        inputStream = new ByteArrayInputStream(bs.toByteArray());
        return inputStream;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值