Java生成pdf工具——openPdf加图片水印功能介绍

Java生成pdf工具——openPdf加图片水印功能介绍

继上一篇Java生成pdf工具——openPdf加文字水印功能介绍后,这里主要介绍使用openPdf 生产pdf,给pdf加图片水印的功能,希望对大家有所帮助!

1、增加相应的依赖
<dependency>
  <groupId>com.github.librepdf</groupId>
  <artifactId>openpdf</artifactId>
  <version>1.3.34</version>
</dependency>
<dependency>
  <groupId>com.github.librepdf</groupId>
  <artifactId>openpdf-fonts-extra</artifactId>
  <version>1.3.34</version>
</dependency>

这个版本是最后支持jdk1.8, 后续的版本需要jdk9+,使用时,根据jdk版本进行相应的选择。

2、针对中文的支持,必须创建支持中文字符的基础字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font docFont = new Font(bfChinese, 12, Font.UNDEFINED, Color.BLACK);
3、具体代码实现
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.*;

import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;


public class Test6 {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        try {
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Font docFont = new Font(bfChinese, 12, Font.UNDEFINED, Color.BLACK);

            Document document = new Document();
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(new File("D:/example6.pdf")));
            writer.setPageEvent(new PdfPageEventHelper() {
                @Override
                public void onEndPage(PdfWriter writer, Document document) {
                    PdfContentByte waterMar = writer.getDirectContentUnder();
                    String text = "光与松果";
                    addImgAndTextWaterMark(waterMar, text, bfChinese);
                }
            });

            document.open();

            Paragraph paragraph = new Paragraph("心中所属唯独你\n" +
                    "不管天似海深\n" +
                    "今生再没遗憾\n" +
                    "即使分开仍念记\n" +
                    "伤心得你恻隐\n" +
                    "温馨我这半生\n" +
                    "若某天 风花雪月似金\n" +
                    "我倾心 只等你回来时贴近\n" +
                    "俗世间 江山雨落无尽放任\n" +
                    "与沧海 未尽缘分\n" +
                    "愿晚风将我吹 吹进你心内\n" +
                    "晚灯映花正开\n" +
                    "月映照伤我心 痴情难自禁\n" +
                    "夜半莺歌叹息我孤身\n" +
                    "愿晚风心里吹 吹散我的泪\n" +
                    "似风筝把你追\n" +
                    "愿等你一辈子 真情留住你\n" +
                    "梦里归家那一扇灯\n" +
                    "心中所属唯独你\n" +
                    "不管分隔千里\n" +
                    "痴心也在原地\n" +
                    "旧日片段曾属你\n" +
                    "紧紧拥抱不弃\n" +
                    "终于再没逃避\n" +
                    "若某天 风花雪月如泪\n" +
                    "我等你 悲欢过后 如愿再聚\n" +
                    "俗世间 江山雨落 无尽唏嘘\n" +
                    "与沧海 一生回味\n" +
                    "愿晚风将我吹 吹进你心内\n" +
                    "晚灯映花正开\n" +
                    "月映照伤我心 痴情难自禁\n" +
                    "夜半莺歌叹息我孤身\n" +
                    "愿晚风心里吹 吹散我的泪\n" +
                    "似风筝把你追\n" +
                    "愿等你一辈子 真情留住你\n" +
                    "梦里归家那一扇灯\n" +
                    "愿晚风心里吹 吹散我的泪\n" +
                    "似风筝把你追\n" +
                    "愿等你一辈子 真情留住你\n" +
                    "梦里归家那一扇灯\n" +
                    "愿等你一辈子 真情留住你\n" +
                    "梦里归家那一扇灯", docFont);
            paragraph.setAlignment(Element.ALIGN_CENTER);
            document.add(paragraph);

            document.close();
            System.out.println("PDF file created successfully." + (System.currentTimeMillis() - startTime));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void addTextWaterMark(PdfContentByte waterMar, String text, BaseFont bfChinese) {
        waterMar.beginText();

        PdfGState gs = new PdfGState();
        // 设置填充字体不透明度为0.2f
        gs.setFillOpacity(0.2f);
        waterMar.setFontAndSize(bfChinese, 40);
        // 设置透明度
        waterMar.setGState(gs);
        // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
        waterMar.showTextAligned(Element.ALIGN_RIGHT, text, 475, 600, 45);

        // 设置水印颜色
        waterMar.setColorFill(Color.GRAY);

        //结束设置
        waterMar.endText();
        waterMar.stroke();
    }

    public static void addTextFullWaterMark(PdfContentByte waterMar, String text, BaseFont bfChinese) {
        waterMar.beginText();

        PdfGState gs = new PdfGState();
        // 设置填充字体不透明度为0.2f
        gs.setFillOpacity(0.2f);
        waterMar.setFontAndSize(bfChinese, 40);
        // 设置透明度
        waterMar.setGState(gs);
        // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
        for (int x = 0; x <= 700; x += 200) {
            for (int y = 0; y <= 800; y += 200) {
                waterMar.showTextAligned(Element.ALIGN_RIGHT, text, x, y, 35);
            }
        }

        // 设置水印颜色
        waterMar.setColorFill(Color.GRAY);

        //结束设置
        waterMar.endText();
        waterMar.stroke();
    }

    public static void addImgAndTextWaterMark(PdfContentByte waterMar, String text, BaseFont bfChinese) {
        waterMar.beginText();

        PdfGState gs = new PdfGState();
        // 设置填充字体不透明度为0.2f
        gs.setFillOpacity(0.2f);
        waterMar.setFontAndSize(bfChinese, 40);
        // 设置透明度
        waterMar.setGState(gs);
        // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
        for (int x = 0; x <= 700; x += 200) {
            for (int y = 0; y <= 800; y += 200) {
                waterMar.showTextAligned(Element.ALIGN_RIGHT, text, x, y, 35);
            }
        }

        byte[] byteArray = new byte[0];
        try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("IMG_20240120_164731.jpg")) {
            if (inputStream != null) {
                byteArray = new byte[inputStream.available()];
                inputStream.read(byteArray);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        com.lowagie.text.Image image = null;
        try {
            image = com.lowagie.text.Image.getInstance(byteArray);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        image.scaleAbsolute(300,400);
        image.setAbsolutePosition(90, 270);
        image.setRotation(30f);
        waterMar.addImage(image);

        // 设置水印颜色
        waterMar.setColorFill(Color.GRAY);

        //结束设置
        waterMar.endText();
        waterMar.stroke();
    }
}


4、代码效果

在这里插入图片描述

希望对你有所帮助!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值