pdf添加水印

现需要给pdf文件添加水印,因为我想将参数动态调整,所以方法是非静态的,参数都是通过配置文件传过来,其次,我需要两种输出方式,一种是文件输出到指定位置,一种是以响应体的形式输出,通过传参的形式解决这个问题,

需要使用到的Maven如下:

<!-- iText,export pdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

代码如下:

import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.FileOutputStream;
import java.io.OutputStream;

@Slf4j
@Component
@RefreshScope
public class FileUtil {

    @Value("${watermark.textName:合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效                      合同条款,手写无效}")
    private String textName;

    @Value("${watermark.fontSize:9}")
    private int fontSize;

    @Value("${watermark.rotate:20}")
    private int rotate;

    @Value("${watermark.opacity:0.3}")
    private float opacity;

    @Value("${watermark.textX:500}")
    private int X;

    @Value("${watermark.textY:100}")
    private int Y;
    @Value("${watermark.position:1}")
    private int position;
    @Value("${watermark.numberOfPage:10}")
    private int numberOfPage;

    /**
     *
     * @param input 输入字节数组
     * @param path 文件输出路径
     * @param response 文件一流的形式输出
     */
    public void waterMarkPdf(byte[] input,String path,HttpServletResponse response) {
        log.info("开始对PDF进行添加文字水印--->textName{}",textName);
        try {

            PdfReader reader = new PdfReader(input);
            OutputStream os ;
            if (StringUtils.isNotBlank(path)){
                os = new FileOutputStream(path);
            } else {
                os = response.getOutputStream();
            }
            //最终输出位置
            PdfStamper stamper = new PdfStamper(reader, os);
            //设置文字样式
            com.itextpdf.text.pdf.BaseFont font = com.itextpdf.text.pdf.BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", com.itextpdf.text.pdf.BaseFont.NOT_EMBEDDED);
            PdfGState gs = new PdfGState();
            //设置透明度
            gs.setFillOpacity(opacity);
            int total = reader.getNumberOfPages() + 1;
            JLabel label = new JLabel();
            //设置自定义水印
            label.setText(textName);
            //得到文字的宽高
            PdfContentByte under = null;

            for (int i = 1; i < total; i++) {
                under = stamper.getOverContent(i);
                under.saveState();
                under.setGState(gs);
                under.beginText();
                under.setFontAndSize(font, fontSize);
                //numberOfPage 水印条数
                for (int j = 0; j < numberOfPage; j++) {
                    //
                    /**
                     * position 左、右、居中(ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT)
                     * text	要输出的文本
                     * x文本输入的X坐标  y	文本输入的Y坐标
                     * rotate 文本的旋转角度
                     */
                    under.showTextAligned(position, textName, X, Y * (j + 1), rotate);
                }
                // 添加水印文字
                under.endText();
            }
            //关闭流
            stamper.close();
            os.close();
            reader.close();
            log.info("pdf添加文字水印结束。");
        } catch (Exception e) {
            log.error("pdf添加文字水印异常。",e);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值