java pdf水印排布问题_java实现图片和pdf添加铺满文字水印

这篇博客介绍了如何使用Java来为PDF和图片添加水印。针对图片,通过ImageWatermarkUtil类实现文字水印的添加,可以调整水印的透明度、字体大小和颜色。对于PDF,通过PdfFilePWartermark类实现文字水印的铺满添加,水印呈30度角倾斜,并能控制页面覆盖范围。
摘要由CSDN通过智能技术生成

依赖jar包

com.itextpdf

itextpdf

5.3.2

com.itextpdf

itext-asian

5.2.0

一,图片添加铺满水印

====================================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========================================

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值