文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java给PDF文档添加水印信息

2023-09-10 12:09

关注

        在word生成pdf后,或者上传pdf文件,用户希望给pdf文档添加水印信息,具体代码如下

  一. 首先pom中需要引入

      com.itextpdf     itextpdf       5.5.13        com.itextpdf     itext-asian     5.2.0 

核心代码如下,写在某个 service 下面

public void signPdf(InputStream is, Supplier os, List signList) {       PdfStamper stamper = null;       PdfReader reader = null;       try {           reader = new PdfReader(is);           stamper = new PdfStamper(reader, os.get());           for (WaterMarkInfoRequest s : signList) {               TextWaterMarkRequest textWaterMark = s.getTextWaterMark();               if (textWaterMark != null) {                   //添加文字                   BaseFont baseFont;                   try {                       baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);                   } catch (DocumentException | IOException e) {                       log.info("pdf签名获取字体信息异常:{}", e.getMessage(), e);                       throw new BusinessException(IO_ERROR.toErrorInfos("pdf签名获取字体信息异常"));                   }                   PdfContentByte content = stamper.getOverContent(textWaterMark.getPageNo());                   PdfGState gState = new PdfGState();                   //设置透明度                   gState.setFillOpacity(textWaterMark.getAlpha());                   content.setGState(gState);                   content.beginText();                   //设置字体                   content.setFontAndSize(baseFont, textWaterMark.getFontSize());                   //设置颜色                   content.setColorFill(new BaseColor(0xFF << 24 | Integer.parseInt(textWaterMark.getFontColor(), 16)));                   //设置水印内容和位置                   content.showTextAligned(Element.ALIGN_MIDDLE, textWaterMark.getText(), textWaterMark.getIntervalVertical(), textWaterMark.getIntervalHorizontal(), 0f);                   content.endText();               }               ImageWaterMarkRequest imageWaterMark = s.getImageWaterMark();               if (imageWaterMark != null) {                   //添加图片                   PdfContentByte content = stamper.getOverContent(imageWaterMark.getPageNo());                   PdfGState gState = new PdfGState();                   //设置透明度                   gState.setFillOpacity(imageWaterMark.getAlpha());                   //image                   Image image = Image.getInstance(EncryptUtil.base64DecoderToBytes(imageWaterMark.getBase64Str()));                   image.setAbsolutePosition(imageWaterMark.getPositionX(), imageWaterMark.getPositionY());                   if (imageWaterMark.getScaleAbsoluteX() != null && imageWaterMark.getScaleAbsoluteY() != null) {                       image.scaleToFit(imageWaterMark.getScaleAbsoluteX(), imageWaterMark.getScaleAbsoluteY());                   } else if (imageWaterMark.getScalePercent() != null && imageWaterMark.getScalePercent() > 0) {                       image.scalePercent(imageWaterMark.getScalePercent());                   }                   content.addImage(image);                   content.stroke();               }           }       } catch (Exception e) {           e.printStackTrace();           log.info("添加签名失败:{}", e.getLocalizedMessage(), e);           WM_WRITE_ERR.throwException();       } finally {           if (null != stamper) {               try {                   stamper.close();               } catch (Exception e) {                   log.info("关闭失败:{}", e.getMessage(), e);               }           }           if (null != reader) {               reader.close();           }       }   }

用到的实体类

public class ImageWaterMarkRequest{    @ApiModelProperty(value = "需要添加的页码,默认所有页码都添加")    private Integer pageNo;    @ApiModelProperty(value = "水平位置  左下角坐标(0,0)")    private Integer positionX;    @ApiModelProperty(value = "垂直位置  左下角坐标(0,0)")    private Integer positionY;    @ApiModelProperty(value = "指定图像宽度  ")    private Integer scaleAbsoluteX;    @ApiModelProperty(value = "指定图像高度 ")    private Integer scaleAbsoluteY;    @ApiModelProperty(value = "缩放比例 与指定尺寸冲突 优先使用指定图像尺寸")    private Integer scalePercent;    @ApiModelProperty(value = "图片的二进制数据")    @NotNull    private String base64Str;    @ApiModelProperty(value = "透明度  0--1")    private Float alpha;    @ApiModelProperty(value = "透明度  0--1",hidden = true)    private Float opacity;    @ApiModelProperty(value = "是否水印打在最顶层  默认true")    private Boolean isTop;}
public class WaterMarkInfoRequest {    @ApiModelProperty(value = "文字水印信息")    private TextWaterMarkRequest textWaterMark;    @ApiModelProperty(value = "图片水印信息")    private ImageWaterMarkRequest imageWaterMark;}

 方法测试

import java.io.InputStream;import java.io.OutputStream;import java.nio.file.Files;import java.nio.file.Paths;import java.util.ArrayList;public class PdfWaterMarkServiceImplTest {    public static void main(String[] args) throws Exception {        InputStream is = Files.newInputStream(Paths.get("/Users/cong/Downloads/a.pdf"));        OutputStream outputStream = Files.newOutputStream(Paths.get("/Users/cong/Downloads/q-5.pdf"));        ArrayList requests = new ArrayList<>();        WaterMarkInfoRequest waterMarkInfo = addSign(1);        WaterMarkInfoRequest waterMarkInfo2 = addSign(1);        requests.add(waterMarkInfo);        requests.add(waterMarkInfo2);        //调用你自己服务的pdf水印方法        new PdfWaterMarkServiceImpl().signPdf(is, () -> outputStream, requests);        outputStream.close();    }    private static WaterMarkInfoRequest addSign(Integer pageNum) {        WaterMarkInfoRequest waterMarkInfo = new WaterMarkInfoRequest();        ImageWaterMarkRequest imageWaterMark = new ImageWaterMarkRequest();        imageWaterMark.setPageNo(pageNum);        imageWaterMark.setPositionY(200);        imageWaterMark.setPositionX(200);        imageWaterMark.setTop(true);        imageWaterMark.setAlpha(1.0f);        imageWaterMark.setBase64Str("图片base64");        waterMarkInfo.setImageWaterMark(imageWaterMark);        TextWaterMarkRequest textWaterMark = new TextWaterMarkRequest();        textWaterMark.setText("我是一个水印");        textWaterMark.setRotation(0);        textWaterMark.setAlpha(1.0f);        textWaterMark.setFontSize(24);        textWaterMark.setIntervalHorizontal(10);        textWaterMark.setIntervalVertical(10);        textWaterMark.setFontColor("800000");        textWaterMark.setTop(true);        textWaterMark.setPageNo(pageNum);        waterMarkInfo.setTextWaterMark(textWaterMark);        return waterMarkInfo;    }}

来源地址:https://blog.csdn.net/huqiankunlol/article/details/131312690

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯