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();}}
}
相关文章:
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.pdf…...
微信小程序中路由跳转方式
文章目录 wx.switchTab(Object)wx.reLaunch(Object)wx.redirectTo(Object)wx.navigateTo(Object)wx.navigateBack(Object) 常见的微信小程序页面跳转方式有如下: wx.switchTab(Object):跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面&…...
Flutter应用发布前的关键iOS设备测试策略
本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…...
深入理解Linux环境配置文件:.bashrc、.bash_profile和.profile
在Linux世界中,理解各种shell配置文件如.bashrc、.bash_profile和.profile的作用和区别对于有效地管理和定制你的命令行环境至关重要。许多用户经常对这些文件的功能和使用场景感到困惑。本文旨在详细解释这些配置文件的差异、作用以及它们的正确使用方法。 .bashr…...
数据库设计规范(三大范式)
1、第一范式*(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式。 第一范式的合理遵循需要根据系统给的实际需求来确定。比如某些数据库系统中需要用到“地址”这…...
图论模板详解
目录 Floyd算法 例题:蓝桥公园 Dijkstra算法 例题:蓝桥王国 SPFA算法 例题:随机数据下的最短路问题 总结 最小生成树MST Prim算法 Kruskal算法 例题:聪明的猴子 Floyd算法 最简单的最短路径算法,使用邻接…...
ArcGIS Pro打不开Excel?Microsoft驱动程序安装不上?
刚用ArcGIS pro的朋友们可能经常在打开xls或者xlsx文件的时候都会提示,未安装所需的Microsoft驱动程序。 怎么办呢?当然,按照提示装一下驱动就会好吗?有什么状况会出现?有什么临时替代方案呢? 全文目录&a…...
简单了解裸眼3D呈现技术
裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。 实现裸眼3D呈现的关键步骤包括: 创建立体图像源:首先需要有一…...
单元测试——Junit (断言、常用注解)
单元测试 Junit单元测试框架 使用 断言测试 使用Assert.assertEquals(message, 预期值, 实际值); 这段代码是用于在测试中验证某个方法的返回值是否符合预期。其中,"方法内部有bug"是用于在断言失败时显示的提示信息。4是预期的返回值,index…...
【蓝桥杯每日一题】4.2 全球变暖
原题链接:1233. 全球变暖 - AcWing题库 由题意可知: 需要找到淹没的岛屿的数量淹没的岛屿所具备的条件:咩有“高地”,也就是说岛屿(连通块)中的所有元素的 4 4 4-邻域中均含有’ . ’ 思路1:…...
ffmpeg点对点音视频udp协议传输
参考:https://zhuanlan.zhihu.com/p/636152437?utm_id0 ffmpeg查看可用设备: ffmpeg -list_devices true -f dshow -i dummy1、音频 局域网内两台设备间 设备1-音频: ffmpeg -f dshow -i audio"麦克风阵列 (适用于数字麦克风的英特…...
ensp华为AC+AP上线配置
AR1配置: <Huawei>system-view # 进入系统视图<Huawei>sysname R1 # 设备重命名[R1]dhcp enable # 开启DHCP功能[R1]interface GigabitEthernet0/0/0 # 进入接口 [R1-GigabitEthernet0/0/0]ip address 192.168.0.1 23 # 配置接口地址 [R1-GigabitE…...
JAVA基础02-Java语言基础以及编译准备工作
什么是JAVA语言 Java是一门面向对象的编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用的两个特征。 (可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式…...
Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意
Photoshop 2024是一款功能强大的图像处理软件,以其卓越的性能和广泛的应用领域,赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具,让用户能够轻松进行图片编辑、合成、校色、抠图等操作,实…...
【MySQL系列】使用 ALTER TABLE 语句修改表结构的方法
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
ElementUI 表格横向滚动条时滚动到指定位置
ElementUI 表格横向滚动条时滚动到指定位置 getColumnOffset(columnProp) {this.$nextTick(() > {const table this.$refs.tableRef.$refs.multipleTable;const columns table.columns;const column columns.find((col) > col.property columnProp);if (column) {// …...
【论文阅读】DETR 论文逐段精读
【论文阅读】DETR 论文逐段精读 文章目录 【论文阅读】DETR 论文逐段精读📖DETR 论文精读【论文精读】🌐前言📋摘要📚引言🧬相关工作🔍方法💡目标函数📜模型结构⚙️代码 Ǵ…...
负载均衡:实现高效稳定的网络服务
随着互联网技术的快速发展,网络应用服务的规模和复杂性日益增加。为了满足日益增长的用户需求,确保服务的高可用性和稳定性,负载均衡技术应运而生。本文将详细介绍负载均衡的概念、原理、分类以及应用场景,帮助读者深入了解这一关…...
2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)
一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …...
极简7照训练法,奇趣相机引领儿童AI摄影潮流
近日,奇趣未来推出一款专注于儿童AI摄影市场的微信小程序——奇趣相机,搭载了专为中国儿童精心研发的AIGC大模型,精准捕捉并贴合亚洲儿童人脸特征,让每一个孩子的笑容都能被完美定格。它不仅涵盖了从3岁至12岁各个年龄段的儿童摄影…...
若依分离版集成Activiti7:从零构建企业级流程中心
1. 环境准备与版本兼容性检查 在开始整合之前,我们需要先确认几个关键点。若依分离版是基于SpringBoot的前后端分离架构,而Activiti7作为新一代工作流引擎,两者整合最需要注意的就是版本兼容性。我去年在金融项目里就遇到过因为版本不匹配导致…...
Superpowers 系统学习笔记:AI编程Agent的完整开发方法论
Superpowers 系统学习笔记:AI编程Agent的完整开发方法论 声明: 📝 作者:甜城瑞庄的核桃(ZMJ) 原创学习笔记,欢迎分享,但请保留作者信息及原文链接哦~ 项目地址:https://github.com/obra/superpowers Star数:36.6K+(持续增长中) 工具作者:Jesse Vincent (@obra) …...
取水泵站远程监控物联网系统方案
某取水泵站具备河流/水库双水源取水设计,配置调节池实现水量缓冲,同时包括取水泵、电动蝶阀、潜污泵、送/排风机、原水水质检测仪等设备,实现对泵站设备工况的全面监控与智能控制,保障各个子水厂的供水安全与稳定。通过将现场PLC控…...
Step3-VL-10B-Base模型微调:LSTM时间序列预测实战
Step3-VL-10B-Base模型微调:LSTM时间序列预测实战 用最简单的方式,教你如何用Step3-VL-10B-Base模型做时间序列预测,无需深厚数学背景,跟着做就能上手 1. 前言:为什么选择这个模型做时间序列预测 时间序列预测是个很有…...
MedGemma 1.5效果对比:在线大模型vs本地MedGemma在医学术语解释准确性评测
MedGemma 1.5效果对比:在线大模型vs本地MedGemma在医学术语解释准确性评测 1. 引言:为什么需要本地医疗AI助手? 想象一下,你或者家人身体不舒服,想在网上查查症状,结果搜出来一堆广告、营销号文章&#x…...
nli-distilroberta-base实战教程:使用/app.py启动NLI服务并集成到Flask后端
nli-distilroberta-base实战教程:使用/app.py启动NLI服务并集成到Flask后端 1. 项目概述 自然语言推理(Natural Language Inference, NLI)是自然语言处理中的一项重要任务,用于判断两个句子之间的逻辑关系。nli-distilroberta-base是基于DistilRoBERTa…...
CLAP零样本分类应用场景:无障碍APP中实时环境声文字播报功能
CLAP零样本分类应用场景:无障碍APP中实时环境声文字播报功能 1. 应用场景与需求分析 在日常生活中,视力障碍人士需要通过听觉来感知周围环境。然而,单纯依靠耳朵听声音,有时难以快速准确地识别特定的环境声。比如走在路上&#…...
电气安全三要素:爬电距离、绝缘电阻与绝缘电压的实战解析
1. 电气安全三要素的核心概念解析 第一次接触电气安全设计时,我被各种专业术语搞得晕头转向。直到有次亲眼目睹同事调试设备时因绝缘失效引发的电弧,才真正理解这些参数不仅是纸面数据,更是保命红线。爬电距离、绝缘电阻和绝缘电压就像电气安…...
星图平台双镜像方案:OpenClaw与百川2-13B的隔离部署技巧
星图平台双镜像方案:OpenClaw与百川2-13B的隔离部署技巧 1. 为什么需要双镜像隔离部署 去年我在尝试将OpenClaw接入本地大模型时,踩过一个典型的坑:当模型需要更新或维护时,整个自动化流程就会中断。最严重的一次,模…...
Docker部署Ollama模型
技术背景 前面写过几篇关于DeepSeek大模型的本地部署以及本地Docker部署OpenClaw的教程。但是这里边的Ollama都是直接部署在裸机上的,图个方便,想来还是不妥,于是补充本文,基于Ubuntu Linux的Docker环境中部署Ollama模型的方法。 …...
