poi完成word、excel、pdf添加斜体水印

-1.示意图

 

 

 

0、maven依赖

 <!--word excel-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.0</version>
        </dependency>
  <!-- 对PDF文件的操作额外添加 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.1</version>
        </dependency>
  <!-- PDF文件 字体 防止中文乱码 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

一、给word添加斜体水印

package com.example.pdfshuiying.word;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlObject;

import javax.xml.namespace.QName;
import java.io.*;
import java.util.regex.Pattern;

public class WordUtil {
    /**
     * word文件添加文字水印
     *
     * @param fileData      原始文件字节数组
     * @param outputSrc     文件输出路径
     * @param waterMarkName 水印内容
     */
    public static void addWordWaterMark(byte[] fileData, String outputSrc, String waterMarkName) throws Exception {

        InputStream input = new ByteArrayInputStream(fileData);
        XWPFDocument doc = new XWPFDocument(input);
        XWPFHeaderFooterPolicy headerFooterPolicy = doc.createHeaderFooterPolicy();
        //添加文字水印
        headerFooterPolicy.createWatermark(waterMarkName);
        XWPFHeader header = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT);
        XWPFParagraph paragraph = header.getParagraphArray(0);
        paragraph.getCTP().newCursor();
        XmlObject[] xmlobjects = paragraph.getCTP().getRArray(0).getPictArray(0).selectChildren(new QName("urn:schemas-microsoft-com:vml", "shape"));
        if (xmlobjects.length > 0) {
            com.microsoft.schemas.vml.CTShape ctshape = (com.microsoft.schemas.vml.CTShape) xmlobjects[0];
            //设置水印颜色
            ctshape.setFillcolor("#404040");
            //修改水印样式 //设置水印的样式  获取默认样式和旋315度
            ctshape.setStyle(getWaterMarkStyle(ctshape.getStyle(), 23) + ";rotation:315");

        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            doc.write(out);

        } finally {
            out.close();
            doc.close();
            input.close();
        }
        out.writeTo(new BufferedOutputStream(new FileOutputStream(outputSrc)));
    }

    /**
     * 设置水印格式
     * word
     *
     * @param styleStr
     * @param height
     * @return
     */
    public static String getWaterMarkStyle(String styleStr, double height) {
        Pattern p = Pattern.compile(";");
        String[] strs = p.split(styleStr);
        for (String str : strs) {
            if (str.startsWith("height:")) {
                String heightStr = "height:" + height + "pt";
                styleStr = styleStr.replace(str, heightStr);
                break;
            }
        }


        return styleStr;
    }


  public static void main(String[] args) throws Exception {
        String   y="C:\\Users\\zhyyds\\Desktop\\ik\\test.doc";
        String   x="C:\\Users\\zhyyds\\Desktop\\ik\\test1.doc";
        String   text="ask创作 2022-06-12 23:37:56";
        File file = new File(y);
        byte[] bytes = FileUtils.readFileToByteArray(file);
        WordUtil.addWordWaterMark(bytes,x,text);
    }
}

二、给pdf添加斜体水印

package com.example.pdfshuiying.pdf;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;

import java.io.FileOutputStream;

public class PdfUtil {

    public static void main(String[] args) {
        /**1.源文件地址
         * 2.出参地址
         * 3.水印文字*/
        PdfUtil.addWaterMark2("C:\\Users\\zhyyds\\Desktop\\ik\\1.pdf", "C:\\Users\\zhyyds\\Desktop\\ik\\2.pdf"
                , "ask 创造");

    }

    /**
     * @param inputFile
     * @param outputFile
     * @param text
     */
    //pdf格式 动态 xy坐标轴 斜体居中
    public static void addWaterMark2(String inputFile, String outputFile, String text) {

        try {
            PdfReader reader = new PdfReader(inputFile);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
            //这里的字体设置比较关键,这个设置是支持中文的写法
            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 使用系统字体
            int total = reader.getNumberOfPages() + 1;
            PdfContentByte under;
            Rectangle pageRect = null;
            for (int i = 1; i < total; i++) {
                pageRect = stamper.getReader().getPageSizeWithRotation(i);
                // 计算水印X,Y坐标
                float x = pageRect.getWidth() / 2;
                float y = pageRect.getHeight() / 2;
                // 获得PDF最顶层
                under = stamper.getOverContent(i);
                under.saveState();
                // set Transparency
                PdfGState gs = new PdfGState();
                // 设置透明度为0.8
                gs.setFillOpacity(0.8f);
                under.setGState(gs);
                under.beginText();
                under.setFontAndSize(base, 40);
                under.setColorFill(BaseColor.GRAY);
                // 水印文字成45度角倾斜
                under.showTextAligned(Element.ALIGN_CENTER, text, x, y, 45);
                // 添加水印文字
                under.endText();
                under.setLineWidth(1f);
                under.stroke();
                under.restoreState();
            }
            stamper.close();

        } catch (Exception e) {
            e.printStackTrace();

        }

    }
}

二、给excel添加斜体水印

package com.example.pdfshuiying.excel;

import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

public class news0613 {

    public static void main(String[] args) throws Exception {
        //图片水印  1.图片存放路径 2.水印文字 3.图片类型
        new news0613().addWatermark("C:\\Users\\zhyyds\\Desktop\\ik\\test\\watermarkImg.png", "ask创作 2022-06-12 23:37:56", "png");
        //放置excel里  1.原地址  2.新存放地址  3.图片地址
        new news0613().addWatermarkExcel(
                "C:\\Users\\zhyyds\\Desktop\\ik\\test\\1.xlsx",
                "C:\\Users\\zhyyds\\Desktop\\ik\\test\\5.xlsx",
                "C:\\Users\\zhyyds\\Desktop\\ik\\test\\watermarkImg.png"
        );


    }

    /**
     * @param in  原路径
     * @param out 放置路径
     * @param img 图片路径
     */
    private void addWatermarkExcel(String in, String out, String img) throws Exception {
        try (FileOutputStream fileOutputStream = new FileOutputStream(new File(out));
             InputStream image = new FileInputStream(img);
             XSSFWorkbook workbook = new XSSFWorkbook(in);) {
            int pictureIdx = workbook.addPicture(image, Workbook.PICTURE_TYPE_PNG);
            POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表
                XSSFSheet sheet = workbook.getSheetAt(i);
                PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
                String relType = XSSFRelation.IMAGES.getRelation();
                //add relation from sheet to the picture data
                PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
                //set background picture to sheet
                sheet.getCTWorksheet().addNewPicture().setId(pr.getId());
            }
            workbook.write(fileOutputStream);

        } catch (Exception e) {
            System.out.println("e" + e);
        }

    }

    /**
     * @param tarImgPath       保存的图片路径
     * @param waterMarkContent 水印内容
     * @param fileExt          图片格式
     * @return void
     * @description
     */
    public void addWatermark(String tarImgPath, String waterMarkContent, String fileExt) {
        //1.创建白色背景板空白图片
        int blankWidth = 1000, blankHeight = 600;// 设置背景宽高.
        BufferedImage bufImg = new BufferedImage(blankWidth, blankHeight, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = bufImg.getGraphics();// 获取图形上下文对象
        graphics.fillRect(0, 0, blankWidth, blankHeight);// 填充
        graphics.fillRect(0, 0, blankWidth, blankHeight);// 填充
        graphics.dispose();// 释放资源
        //2.设置水印基本信息
        Font font = new Font("#404040", Font.BOLD, 34);//水印字体,大小
        Color markContentColor = Color.GRAY;//水印颜色
        Integer degree = -45;//设置水印文字的旋转角度
        float alpha = 0.6f;//设置水印透明度 默认为1.0  值越小颜色越浅

        try (OutputStream outImgStream = new FileOutputStream(tarImgPath);) {
            // 加水印
            Graphics2D g = bufImg.createGraphics();//得到画笔
            g.setColor(markContentColor); //设置水印颜色
            g.setFont(font);              //设置字体
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度
            g.rotate(Math.toRadians(degree), (double) bufImg.getWidth(), (double) bufImg.getHeight());//设置水印旋转
            JLabel label = new JLabel(waterMarkContent);
            FontMetrics metrics = label.getFontMetrics(font);
            int width = metrics.stringWidth(label.getText());//文字水印的宽
            g.drawString(waterMarkContent, 510, -100);
            g.dispose();// 释放资源
            // 输出图片
            ImageIO.write(bufImg, fileExt, outImgStream);
        } catch (Exception e) {
            e.printStackTrace();
            e.getMessage();
        }
    }


}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
在使用POI库操作Excel文件时,可以通过添加水印的方式来给Excel文件添加背景图案或文字标识。下面是一个简单的示例代码来演示如何使用POI添加水印。 首先,我们需要导入POI库的相关类: ``` import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; ``` 然后,我们需要加载Excel文件并创建一个工作簿对象: ``` String filePath = "path/to/excel/file.xlsx"; Workbook workbook = new XSSFWorkbook(filePath); ``` 接下来,创建一个新的工作表对象,并获取当前工作表的绘图对象: ``` Sheet sheet = workbook.createSheet(); Drawing drawing = sheet.createDrawingPatriarch(); ``` 创建一个文本对象,并设置文本内容以及位置: ``` ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 2, 3, 4); TextShape text = drawing.createTextbox(anchor); text.setText("水印文字"); ``` 设置文本样式、字体、颜色等: ``` text.setLineStyle(LineStyle.NONE); text.setNoFill(true); text.setVerticalAlignment(VerticalAlignment.CENTER); text.setHorizontalAlignment(HorizontalAlignment.CENTER); text.setFontFamily("宋体"); text.setFontSize(20); text.setFillColor(IndexedColors.GREY_25_PERCENT.getIndex()); ``` 最后,保存修改并关闭Excel文件: ``` FileOutputStream fileOut = new FileOutputStream("path/to/output/file.xlsx"); workbook.write(fileOut); fileOut.close(); workbook.close(); ``` 通过以上代码,我们可以将"水印文字"添加Excel文件的水印。可以根据自己的需求调整水印的位置、样式和内容等。同时需要注意的是,以上代码适用于POI版本为4.1.2。 希望以上内容对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值