java生成图片水印

由于业务需求,文字水印无法满足,需要把文字转化成图片,并加在pdf中生成图片水印
示例:
在这里插入图片描述

package com.chinaunicom.api.utils;


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

/**
 * @Author zhangyy
 * @Date 2021/8/23 19:04
 */
public class FontImage {

    private   final   static   BasicStroke   stokeLine   =   new   BasicStroke(   2.0f   );
    public static void main(String[] args) throws Exception {
        createImage("此件与原件相符,仅供:xxx过程中使用。再复印无效", new File("g:/a.png"));
    }

    /**
     * 根据str,font的样式以及输出文件目录
     * @param str	字符串
     * @param outFile	输出文件位置
     * @throws Exception
     */
    public static void createImage(String str,  File outFile) throws Exception {
        Font font=new Font("宋体", Font.BOLD, 30);
        Integer width=490;
        Integer height=150;
        // 创建图片
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();
        g.setClip(0, 0, width, height);
        //g.setColor(Color.white);
        // 先用黑色填充整张图片,也就是背景
        g.fillRect(0, 0, width, height);
        g.setColor(Color.blue);
        // 设置画笔字体
        g.setFont(font);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setStroke(stokeLine);
        /** 用于获得垂直居中y */
        Rectangle clip = g.getClipBounds();
        FontMetrics fm = g.getFontMetrics(font);
        int ascent = fm.getAscent();
        int descent = fm.getDescent();
        int y = (clip.height - (ascent + descent)) / 2 + ascent;
        // 256 340 0 680
        int length=str.length();
        int con=length/15;
        if (length%15!=0){
            con+=1;
        }
        g.drawLine(0,0,width,0);
        g.drawLine(0,0,0,height);
        g.drawLine(width,height,width,0);
        g.drawLine(width,height,0,height);
        for (int i = 0; i <con; i++) {
            // 画出字符串
            g.drawString(str.substring(i*15,(i+1)*15>length?length:(i+1)*15), 0, y+(i-1)*40);
        }
        g.dispose();
        // 输出png图片
        ImageIO.write(image, "png", outFile);
    }
}



效果:
在这里插入图片描述

您好,可以使用Apache POI库来生成Word图片水印。具体步骤如下: 1. 创建一个Word文档 2. 用addPicture将图片添加到文档中 3. 创建一个文本段落,并设置文本样式 4. 创建一个文字水印,将文本段落设置为水印 5. 将水印添加到文档中 您可以参考以下代码: ```java import java.io.FileOutputStream; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFPicture; import org.apache.poi.xwpf.usermodel.XWPFPictureData; import org.apache.poi.xwpf.usermodel.XWPFPictureFormat; import org.apache.poi.xwpf.usermodel.XWPFPictureRun; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTextCharacterProperties; public class WordWaterMark { public static void main(String[] args) throws Exception { String imagePath = "watermark.png"; String text = "Draft"; // create a new document XWPFDocument doc = new XWPFDocument(); // add picture to the document XWPFPictureData pictureData = doc.addPictureData(new FileInputStream(imagePath), XWPFPictureFormat.PNG); XWPFPicture picture = doc.createPicture(pictureData, doc.getNextPicNameNumber(XWPFPicture.SIGNATURE_PICT_TYPE), 1000, 1000); // set position and size of the picture XWPFPictureRun pictureRun = (XWPFPictureRun) picture.getParagraph().createRun(); pictureRun.addPicture(pictureData); pictureRun.getCTR().getTxbx().addNewTxbxContent().addNewP().addNewR().addNewT().setStringValue(""); pictureRun.getCTR().getTxbx().addNewTxbxContent().addNewPict().set(picture.getCTPicture()); // create a paragraph for the watermark text XWPFParagraph waterMarkParagraph = doc.createParagraph(); waterMarkParagraph.setSpacingBefore(0); waterMarkParagraph.setSpacingAfter(0); waterMarkParagraph.setSpacingBetween(1.5); // create a run for the watermark text XWPFRun run = waterMarkParagraph.createRun(); run.setText(text); // set font and color for the watermark text CTR ct = run.getCTR(); CTText textElement = ct.getTArray(0); CTTextCharacterProperties textProps = textElement.addNewRPr(); textProps.setSz(STMUtils.pt2dxa(48)); textProps.setColor("999999"); textProps.setShadow(null); // create a watermark CTR cTR = CTR.Factory.parse( "<w:p xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:wx=\"http://schemas.microsoft.com/office/word/2003/auxHint\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" mc:Ignorable=\"w14 w15 wx\" w:rsidR=\"00A81A2C\" w:rsidRPr=\"00A81A2C\">" + "<w:pPr>" + "<w:pStyle w:val=\"NoSpacing\"/>" + "<w:rPr>" + "<w:b/>" + "<wx:font wx:val=\"Cambria\"/>" + "<w:color w:val=\"auto\"/>" + "<w:sz w:val=\"20\"/>" + "<w:szCs w:val=\"20\"/>" + "</w:rPr>" + "</w:pPr>" + "<w:r>" + "<w:rPr>" + "<w:b/>" + "<wx:font wx:val=\"Cambria\"/>" + "<w:color w:val=\"auto\"/>" + "<w:sz w:val=\"20\"/>" + "<w:szCs w:val=\"20\"/>" + "</w:rPr>" + "<w:t xml:space=\"preserve\">" + text + "</w:t>" + "</w:r>" + "</w:p>"); XWPFParagraph waterMark = new XWPFParagraph(cTR, doc); waterMark.setAlignment(ParagraphAlignment.CENTER); waterMark.setVerticalAlignment(TextAlignment.CENTER); // set watermark as background of each page for (XWPFParagraph paragraph : doc.getParagraphs()) { for (XWPFRun r : paragraph.getRuns()) { r.getCTR().getTArray(0).insertNewRPr(0).addNewNoProof(); } } doc.addParagraph(waterMark); // write the document to a file FileOutputStream out = new FileOutputStream("watermark.docx"); doc.write(out); out.close(); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值