当前位置: 首页 > news >正文

Java pdfbox 给 PDF 添加文字和图片水印 并旋转45度

POM

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version>
</dependency>

代码:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;import java.awt.*;
import java.io.File;public class Test1 {public static void main(String[] args) {// 原始文件路径String sourcePath = "D:\\poi\\11.pdf";// 去c://windows/font下赋值去String fontFilePath = "D:\\poi\\simhei.ttf";String waterMarkText = "水印文字";// log图片的位置String logoFilePath = "D:\\poi\\logo.jpeg";// 输出的PDF文件路径String pdfFile = "D:\\poi\\11-new" + System.currentTimeMillis() + ".pdf";addWaterRemark(sourcePath, pdfFile, fontFilePath, waterMarkText, logoFilePath);}public static void addWaterRemark(String sourcePath, String pdfFile, String fontFilePath, String waterMarkText, String logoFilePath) {try {// 读取原始 PDF 文件PDDocument doc = PDDocument.load(new File(sourcePath));doc.setAllSecurityToBeRemoved(true);//必须是ttf字体PDFont font = PDType0Font.load(doc, new File(fontFilePath));PDImageXObject logoImage = PDImageXObject.createFromFile(logoFilePath, doc);float logoImageWidth = logoImage.getWidth();float logoImageHeight = logoImage.getHeight();float maxX;float maxY;float tempX;float tempY;float xStepLength = 300f;float yStepLength = 200f;float startX = 100f;float startY = 100f;PDPageContentStream cs;// 透明度PDExtendedGraphicsState r0 = new PDExtendedGraphicsState();r0.setNonStrokingAlphaConstant(0.2f);r0.setAlphaSourceFlag(true);for (PDPage page : doc.getPages()) {maxX = page.getBBox().getUpperRightX();maxY = page.getBBox().getUpperRightX();cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);cs.setGraphicsStateParameters(r0);cs.setNonStrokingColor(new Color(200, 200, 200));cs.setFont(font, 36f);// 添加图片,不能在beginText和endText之间加cs.drawImage(logoImage, (maxX - logoImageWidth) / 2, maxY / 2, logoImageWidth * 1.5f, logoImageHeight * 1.5f);cs.beginText();tempX = startX;while (tempX < maxX) {tempY = startY;while (tempY < maxY) {cs.setTextMatrix(Matrix.getRotateInstance(45, tempX, tempY));cs.showText(waterMarkText);tempY += yStepLength;}tempX += xStepLength;}cs.endText();// 关闭流cs.close();}// 保存修改后的 PDF 文件doc.save(new File(pdfFile));doc.close();} catch (Exception e) {e.printStackTrace();}}
}

http://www.lryc.cn/news/330580.html

相关文章:

  • 微信小程序中路由跳转方式
  • Flutter应用发布前的关键iOS设备测试策略
  • 深入理解Linux环境配置文件:.bashrc、.bash_profile和.profile
  • 数据库设计规范(三大范式)
  • 图论模板详解
  • ArcGIS Pro打不开Excel?Microsoft驱动程序安装不上?
  • 简单了解裸眼3D呈现技术
  • 单元测试——Junit (断言、常用注解)
  • 【蓝桥杯每日一题】4.2 全球变暖
  • ffmpeg点对点音视频udp协议传输
  • ensp华为AC+AP上线配置
  • JAVA基础02-Java语言基础以及编译准备工作
  • Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意
  • 【MySQL系列】使用 ALTER TABLE 语句修改表结构的方法
  • ElementUI 表格横向滚动条时滚动到指定位置
  • 【论文阅读】DETR 论文逐段精读
  • 负载均衡:实现高效稳定的网络服务
  • 2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)
  • 极简7照训练法,奇趣相机引领儿童AI摄影潮流
  • Flink应用
  • C# 委托与事件 终章
  • MySQL-linux安装-万能RPM法
  • elment UI el-date-picker 月份组件选定后提交后台页面显示正常,提交后台字段变成时区格式
  • 基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站
  • C++经典面试题目(二十)
  • vue3+uniapp 动态渲染组件,兼容h5、app端
  • CSS层叠样式表学习(2)
  • 【MySQL】DML的表操作详解:添加数据&修改数据&删除数据(可cv例题语句)
  • Docker命令及部署Java项目
  • 深度学习入门:从理论到实践的全面指南