zoukankan      html  css  js  c++  java
  • java实现图片和pdf添加铺满文字水印

    依赖jar包

    <!-- pdf start -->

    <dependency>

        <groupId>com.itextpdf</groupId>

        <artifactId>itextpdf</artifactId>
        <version>5.3.2</version>
    </dependency>

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>

    <!-- pdf end -->

    一,图片添加铺满水印

    ====================================start========================================

    package cn.*.*.*;

    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;

    import javax.imageio.ImageIO;

    /**
    *
    * @Title ImageWatermarkUtil
    * @Description
    * @author Zheng.Zeng
    * @date 2018年8月29日 下午4:47:38
    */
    public class ImgFilePWartermark {
    // 水印透明度
    private static float alpha = 0.6f;
    // 水印文字大小
    public static final int FONT_SIZE = 18;
    // 水印文字字体
    private static Font font = new Font ("宋体", Font.PLAIN, FONT_SIZE);
    // 水印文字颜色
    private static Color color = Color.white;
    // 水印之间的间隔
    private static final int XMOVE = 80;
    // 水印之间的间隔
    private static final int YMOVE = 80;

    /**
    * 给图片添加水印文字
    * @param logoText 水印文字
    * @param srcImgPath 源图片路径
    * @param targerPath 目标图片路径
    */
    public static void ImageByText (String logoText, String srcImgPath, String targerPath) {
    ImageByText (logoText, srcImgPath, targerPath, null);
    }


    /**
    * 获取文本长度。汉字为1:1,英文和数字为2:1
    */
    private static int getTextLength (String text) {
    int length = text.length ();
    for (int i = 0; i < text.length (); i++) {
    String s = String.valueOf (text.charAt (i));
    if (s.getBytes ().length > 1) {
    length++;
    }
    }
    length = length % 2 == 0 ? length / 2 : length / 2 + 1;
    return length;
    }


    /**
    * 给图片添加水印文字、可设置水印文字的旋转角度
    *
    * @param logoText
    * @param srcImgPath
    * @param targerPath
    * @param degree
    */
    public static void ImageByText (String logoText, String srcImgPath, String targerPath, Integer degree) {

    InputStream is = null;
    OutputStream os = null;
    try {
    // 源图片
    Image srcImg = ImageIO.read (new File (srcImgPath));
    int width = srcImg.getWidth (null);// 原图宽度
    int height = srcImg.getHeight (null);// 原图高度
    BufferedImage buffImg = new BufferedImage (srcImg.getWidth (null), srcImg.getHeight (null),
    BufferedImage.TYPE_INT_RGB);
    // 得到画笔对象
    Graphics2D g = buffImg.createGraphics ();
    // 设置对线段的锯齿状边缘处理
    g.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g.drawImage (srcImg.getScaledInstance (srcImg.getWidth (null), srcImg.getHeight (null), Image.SCALE_SMOOTH),
    0, 0, null);
    // 设置水印旋转
    if (null != degree) {
    g.rotate (Math.toRadians (degree), (double) buffImg.getWidth () / 2, (double) buffImg.getHeight () / 2);
    }
    // 设置水印文字颜色
    g.setColor (color);
    // 设置水印文字Font
    g.setFont (font);
    // 设置水印文字透明度
    g.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_ATOP, alpha));

    int x = -width / 2;
    int y = -height / 2;
    int markWidth = FONT_SIZE * getTextLength (logoText);// 字体长度
    int markHeight = FONT_SIZE;// 字体高度

    // 循环添加水印
    while (x < width * 1.5) {
    y = -height / 2;
    while (y < height * 1.5) {
    g.drawString (logoText, x, y);

    y += markHeight + YMOVE;
    }
    x += markWidth + XMOVE;
    }
    // 释放资源
    g.dispose ();
    // 生成图片
    os = new FileOutputStream (targerPath);
    ImageIO.write (buffImg, "JPG", os);
    System.out.println ("添加水印文字成功!");
    } catch (Exception e) {
    e.printStackTrace ();
    } finally {
    try {
    if (null != is)
    is.close ();
    } catch (Exception e) {
    e.printStackTrace ();
    }
    try {
    if (null != os)
    os.close ();
    } catch (Exception e) {
    e.printStackTrace ();
    }
    }
    }

    public static void main (String[] args) {
    String srcImgPath = "C:\Users\Administrator\Pictures\Saved Pictures\太阳系星体桌面壁纸-ZOL桌面壁纸_files\ChMkJlmhRcaIf3kwAAGdeRjj2I0AAf_UAJJWF4AAZ2R574.jpg";
    // 水印文字
    String logoText = "打印无效";
    String targerTextPath2 = "C:\Users\Administrator\Pictures\Saved Pictures\123123.jpg";
    System.out.println ("给图片添加水印文字开始...");
    // 给图片添加正水印文字
    //ImgFilePWartermark.ImageByText (logoText, srcImgPath, targerTextPath2, -40);
    // 给图片添加斜水印文字
    ImgFilePWartermark.ImageByText (logoText, srcImgPath, targerTextPath2, -40);
    System.out.println ("给图片添加水印文字结束...");
    }
    }

    ====================================end========================================

    二.pdf添加铺满文字水印

    ====================================start========================================

    package cn.cnnho.wartmark.startegy;
    import java.awt.FontMetrics;
    import java.io.FileOutputStream;
    import javax.swing.JLabel;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Rectangle;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfGState;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;

    public class PdfFilePWartermark {

    public static void main(String[] args) {
    waterMark("F://公告内容//关于结合中国特殊消费习惯的星优选供应链上游、下游业务指导.pdf", "F://公告内容//111.pdf", "打印无效");
    }


    private static int interval = -5;
    public static void waterMark(String inputFile,
    String outputFile, String waterMarkName) {
    try {
    PdfReader reader = new PdfReader(inputFile);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
    outputFile));

    BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);

    Rectangle pageRect = null;
    PdfGState gs = new PdfGState();
    gs.setFillOpacity(0.3f);
    gs.setStrokeOpacity(0.4f);
    int total = reader.getNumberOfPages() + 1;

    JLabel label = new JLabel();
    FontMetrics metrics;
    int textH = 0;
    int textW = 0;
    label.setText(waterMarkName);
    metrics = label.getFontMetrics(label.getFont());
    textH = metrics.getHeight();
    textW = metrics.stringWidth(label.getText());

    PdfContentByte under;
    for (int i = 1; i < total; i++) {
    pageRect = reader.getPageSizeWithRotation(i);
    under = stamper.getOverContent(i);
    under.saveState();
    under.setGState(gs);
    under.beginText();
    under.setFontAndSize(base, 20);

    //水印文字成30度角倾斜
    //你可以随心所欲的改你自己想要的角度
    for (int height = interval + textH; height < pageRect.getHeight();
    height = height + textH*3) {
    for (int width = interval + textW;
    width < pageRect.getWidth() + textW;
    width = width + textW*2)
    { under.showTextAligned(Element.ALIGN_LEFT,waterMarkName, width - textW,
    height - textH, 30);
    }
    }
    // 添加水印文字
    under.endText();
    }
    //说三遍
    //一定不要忘记关闭流
    //一定不要忘记关闭流
    //一定不要忘记关闭流
    stamper.close();
    reader.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }


    }

    ====================================end========================================

  • 相关阅读:
    最小移动次数使数组元素相等
    计算几何
    北校门外的回忆
    洗衣服
    HDU1046:Gridland
    注册机的实现如(istarMenu CORE Keygen)
    是你吗?
    (译)KVO的内部实现
    通过UIColor转换为UIImage
    Palindrome Number 解题报告
  • 原文地址:https://www.cnblogs.com/guangxiang/p/10892530.html
Copyright © 2011-2022 走看看