java pdf添加水印文本及图片文本

PDF文件添加文本水印:

    private static int interval = 30;
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.3f);
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, 30); //控制字体间宽度
// 水印文字成30度角倾斜
for (int height = interval + textH; height < pageRect.getHeight(); height = height + textH*8) {
for (int width = interval + textW; width < pageRect.getWidth() + textW; width = width + textW*4) {
under.showTextAligned(Element.ALIGN_LEFT , waterMarkName, width - textW,
height - textH, 30); } }
// 添加水印文字
under.endText();
}
//关闭流
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}

PDF添加图片水印:

private static final float IAMGE_HEIGHT = 110f; // 水印图片的的高度
private static final float IAMGE_WIDTH = 110f; // 水印图片的的宽度
public static void addPdfMark(String pdfPath,String logoPath, String outPath) throws Exception { PdfReader reader = new PdfReader(pdfPath, "PDF".getBytes());
// 如果是web项目,直接下载应该放到response的流里面
// PdfStamper stamp = new PdfStamper(reader,response.getOutputStream());
// 添加水印之后的pdf文件
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outPath));
int pageSize = reader.getNumberOfPages(); float pageHeight = reader.getPageSize(1).getHeight();
float pageWidth = reader.getPageSize(1).getWidth();
try {
// 每两行显示两个 左边一个,右边一个
int lineNum = (int) (pageHeight / IAMGE_HEIGHT); // 行数
int middleY = (int) pageWidth / 2;
for (int i = 1; i <= pageSize; i++) {
for (int j = 0, k = 0; j < lineNum; j = j + 4, k++) {
Random random = new Random();
// 放入水印
Image img = Image.getInstance(logoPath);
img.scaleAbsolute(IAMGE_WIDTH, IAMGE_HEIGHT * 184 / 455);
// 将水印显示到最底层
img.setAlignment(Image.UNDERLYING);
int trueY;
while (true) {
trueY = random.nextInt(middleY);
if (trueY > IAMGE_WIDTH / 2 && trueY < (middleY - IAMGE_WIDTH)) {
break;
}
}
// 水印的位置
img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT + (float) random.nextInt((int) IAMGE_HEIGHT) - (k % 2) * 10);
// 旋转 角度
img.setRotationDegrees(random.nextInt(360));
PdfContentByte under = stamp.getUnderContent(i); PdfGState gs = new PdfGState();
// 设置透明度为0.5
gs.setFillOpacity(0.5f);
under.setGState(gs);
under.addImage(img);
while (true) {
trueY = random.nextInt(middleY) + middleY;
if (trueY > middleY + IAMGE_WIDTH / 2 && trueY < (2 * middleY - IAMGE_WIDTH)) {
break;
}
}
// 水印的位置
img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT + (float) random.nextInt((int) IAMGE_HEIGHT) - (k % 2) * 10);
// 旋转角度
img.setRotationDegrees(random.nextInt(360));
under.addImage(img);
}
}
} catch (Exception e) {
throw e;
} finally {
stamp.close();
reader.close();
}

测试--------------------------------------------------------------------------------

public static void main(String[] args) throws Exception {
waterMark("xxx.pdf", "yyy.pdf", "测试工程");
//addPdfMark("xxx.pdf","image.png","yyy.xml");
System.out.println("结束");
}
}

参考了很多前辈的,希望能帮到各位!

模块所需jar包(itextpdf-5.5.13.1.jar)

最新文章

  1. Python list列表的排序
  2. jquery多次上传同一张图片
  3. [旧博客]Python 第一天总结
  4. Eclipse搭建Struts框架,及一个简单的Struts例子
  5. HDU 2546 饭卡
  6. [Machine Learning] Probabilistic Graphical Models:二、Bayes Network Fundamentals(1、Semantics &amp; Factorization)
  7. kvc简单实现
  8. 「30天自制操作系统」 Stop &amp; 「OS67 」 Start
  9. 分布式文件系统FastDFS介绍和配置过程
  10. Hugo快速搭建Blog
  11. Caused by: The Result type [json] which is defined in the Result annotation on the class
  12. 关于Kafka配额的讨论(2)
  13. 用递归方法求n的阶乘
  14. C#邮件发送类 简单实用 可自定义发件人名称
  15. luke下载使用
  16. K8s之配置文件kubeconfig生成
  17. DataWorks使用小结(一)——概述
  18. PyQt+Html+Js
  19. VS 插件 Productivity Power Tools - 更改 选项卡组件位置
  20. python怎么生成requirements.txt文件

热门文章

  1. getline()与get()(c++学习笔记)
  2. Liunx学习总结(六)--进程
  3. .NET CORE 怎么样从控制台中读取输入流
  4. Unity的UGUI在SetParent后修改UI的localposition问题
  5. leetcode9 Palindrome Number(按进阶要求)
  6. HTML 画布(摘自菜鸟教程)
  7. (数据科学学习手札68)pandas中的categorical类型及应用
  8. 浅谈TCP协议,总算明白它是干什么的了
  9. ASP.NET Core 3.0中使用动态控制器路由
  10. C++中的I/O输入输出问题