itextpdf使用:使用PdfReader添加图片水印

gitee参考代码地址:https://gitee.com/wangtianwen1996/cento-practice/tree/master/src/test/java/com/xiaobai/itextpdf

参考文章:https://www.cnblogs.com/wuxu/p/17371780.html

1、生成带有文字的图片

使用java.awt包的相关类生成带文字的图片,代码如下:

java 复制代码
/**
     * 生成带文字的图片
     * @return
     */
    public static String createImage() {
        int imageWidth = 80;
        int imageHeight = 30;
        BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);

        Graphics2D g2 = image.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

        Color c = new Color(255, 255, 255);
        g2.setColor(c);// 设置背景色
        g2.fillRect(0, 0, imageWidth, imageHeight);

        String code = "000153";
        // 设置文字字体
        Font font = new Font(null, Font.PLAIN, 10);
        g2.setFont(font);
        g2.setColor(new Color(0, 0, 0));
        // 文字起始位置
        g2.drawString(code, 5, 15);
        g2.dispose();

        String imagePath = "D:\\usr\\local\\zeus\\resource\\temp/aaa.jpg";
        OutputStream baos = null;
        try {
            baos = new FileOutputStream(new File(imagePath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            ImageIO.write(image, "jpg", baos);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 关闭输出流
        IOUtils.closeQuietly(baos);

        return imagePath;
    }

2、使用itextpdf的PdfReader插入图片水印

java 复制代码
@Test
public void addImage() {
    String pdfPath = "/Users/outenmon/Public/工作资料/公告/aaaa.pdf";
    PdfReader reader = null;
    try {
        reader = new PdfReader(pdfPath, "PDF".getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
    String outPdfFile = "/Users/outenmon/Public/工作资料/公告/bbbb.pdf";
    PdfStamper stamp = null;
    try {
        stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    PdfContentByte under;

//        PdfGState gs1 = new PdfGState();
//        gs1.setFillOpacity(0.3f);// 透明度设置

    String imagePath = ImageUtil.createImage();
    Image img = null;// 插入图片水印
    try {
        img = Image.getInstance(imagePath);
    } catch (BadElementException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Rectangle pageSize1 = reader.getPageSize(1);
    float height = pageSize1.getHeight();
    img.setAbsolutePosition(10, height - 50); // 坐标
    // img.setRotation(-20);// 旋转 弧度
    // img.setRotationDegrees(45);// 旋转 角度
//        img.scaleAbsolute(80, 30);// 自定义大小
    // img.scalePercent(50);//依照比例缩放

//        int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
    /*for (int i = 1; i <= pageSize; i++) {
        under = stamp.getUnderContent(i);// 水印在之前文本下
        // under = stamp.getOverContent(i);//水印在之前文本上
        under.setGState(gs1);// 图片水印 透明度
        try {
            under.addImage(img);// 图片水印
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }*/
    under = stamp.getUnderContent(1);// 水印在之前文本下
    // under = stamp.getOverContent(i);//水印在之前文本上
//        under.setGState(gs1);// 图片水印 透明度
    try {
        under.addImage(img);// 图片水印
    } catch (DocumentException e) {
        e.printStackTrace();
    }

    try {
        stamp.close();// 关闭
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
相关推荐
scott.cgi10 分钟前
Unity直接编译Java文件作为插件,导致失败的两个打包设置
java·unity·unity调用java·unity的java文件·unity的android插件·unity调用android·unity加载java代码
澈2074 小时前
C++并查集:高效解决连通性问题
java·c++·算法
2401_873479406 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD6668889996 小时前
大事件板块一
java
摇滚侠6 小时前
@Autowired 和 @Resource 的区别
java·开发语言
SeaTunnel6 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
吴声子夜歌7 小时前
Java——线程的基本协作机制
java·线程协作
谙弆悕博士7 小时前
【附C++源码】从零开始实现 2048 游戏
java·c++·游戏·源码·项目实战·2048
独自归家的兔8 小时前
OCPP 1.6 协议详解:GetLocalListVersion 获取本地列表版本指令
java·后端·物联网·spring·ocpp1.6
Apache RocketMQ9 小时前
RocketMQ源码解析——秒级定时消息介绍
java·云原生·消息队列·rocketmq·java-rocketmq