使用pdfbox 为 PDF 增加水印

使用pdfbox 为 PDF增加水印icon-default.png?t=N7T8https://www.jylt.cc/#/detail?activityIndex=2&id=bd410851b0a72dad3105f9d50787f914

引入依赖

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>3.0.1</version>
</dependency>
<!--下面操作图片的时候需要用到该工具类-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.8.25</version>
</dependency>

具体代码实现

public static void main(String[] args) throws Exception {// 读取原始 PDF 文件PDDocument document = PDDocument.load(new File("/Users/a58/Downloads/test.pdf"));File file = new File("/Users/picture/Downloads/waterMark.png");BufferedOutputStream outputStream = FileUtil.getOutputStream(file);FileImageOutputStream fileImageOutputStream = new FileImageOutputStream(file);// 创建文字图片Font font = new Font("宋体", Font.PLAIN, 12);Color fontColor = new Color(100, 100, 100, 60);ImgUtil.createImage("水印", font, null, fontColor, fileImageOutputStream);// 旋转图片,使水印倾斜ImgUtil.rotate(file, -20, file);// 遍历 PDF 中的所有页面for (int i = 0; i < document.getNumberOfPages(); i++) {PDPage page = document.getPage(i);PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);// PDF页面宽度float pageWidth = page.getMediaBox().getWidth();// PDF页面高度float pageHeight = page.getMediaBox().getHeight();// 4:每页有4列水印int xBegin = (int) (pageWidth / 4);// 8:每页有8行水印int yBegin = (int) (pageHeight / 8);// 加载图片PDImageXObject pdImageXObject = PDImageXObject.createFromFile(file.getAbsolutePath(), document);float width = pdImageXObject.getWidth();float height = pdImageXObject.getHeight();for (int yIndex = 0; yIndex < 8; yIndex++) {for (int xIndex = 0; xIndex < 4; xIndex++) {contentStream.drawImage(pdImageXObject, (xBegin * xIndex) + 5, (yBegin * yIndex), width, height);}yIndex++;}contentStream.close();}// 保存修改后的 PDF 文件document.save(new File("/Users/picture/Downloads/testout.pdf"));document.close();System.out.println("完成");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cesiumlab切片通过arcgisjs加载

cesiumlab切片通过arcgisjs加载 需要注意2个地方&#xff0c;一个是tileInfo&#xff0c;一个是getTileUrl&#xff0c; 在tileInfo中定义好cesiumlab切片的相关信息。 getTileUrl 格式化url的格式。 注意设置编辑&#xff0c;避免超出范围报404。 <html lang"en"…

【栈】【字符串和int类型转化】Leetcode 150 逆波兰表达式求值

【栈】【字符串和int类型转化】Leetcode 150 逆波兰表达式求值 解法1 栈 ---------------&#x1f388;&#x1f388;题目链接 Leetcode 150 逆波兰表达式求值 &#x1f388;&#x1f388;------------------- 解法1 栈 字符串转化为int类型数据: Integer.parseInt(s) Long.p…

java多线程传参数

package com.myThread;public class AdminThread extends Thread{private String name;public void AdminThread(String name){this.name name;}Overridepublic void run() {//线程开始之后执行的代码for (int i 0; i < 100; i) {System.out.print(getName()"线程…

Web前端-移动web开发——flex布局

移动web开发——flex布局 1.0传统布局和flex布局对比 1.1传统布局 兼容性好布局繁琐局限性&#xff0c;不能再移动端很好的布局 1.2 flex布局 操作方便&#xff0c;布局极其简单&#xff0c;移动端使用比较广泛pc端浏览器支持情况比较差IE11或更低版本不支持flex或仅支持部…

ChatGPT 与生成式 AI 的崛起:第二十六章到第三十三章

原文&#xff1a;Rise of Generative AI and ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第二十五章&#xff1a;ChatGPT 用于国家网络安全和技术政策 介绍 恐怖分子、罪犯、警察、国防、执法机构、工程师、作家和学生等都在使用 ChatGPT&#xff0c;这是…

如何进行产品的人机交互设计?

产品的人机交互设计是指通过用户界面和用户体验设计来优化产品与用户之间的交互过程&#xff0c;从而提高产品的易用性、可用性和用户满意度。人机交互设计需要考虑用户的需求、行为模式、心理感受以及技术实现&#xff0c;下面我将介绍如何进行产品的人机交互设计。 首先&…

蓝桥备战 每日一题 (1)

二分法 代码如下&#xff1a; #include<iostream> #define ll long long using namespace std;ll query(ll n) {ll ret 0;while (n > 0) {ret n / 5; // 要计算 从 1 到 n 中 是 5 的倍数的个数&#xff0c;但是要注意 如果是 25 &#xff0c;要计算两次n / 5;}r…

kubeadm常用命令

一 kubeadm token 命令 "kubectl和kubeadm命令执行的时候" 默认情况下,kubectl 在 $HOME/.kube 目录下查找名为config的文件可以通过设置KUBECONFIG环境变量或设置--kubeconfig参数来指定其他Kubeconfig文件 ​ 解决1&#xff1a; k8s token 过期 的解决方法 ① 总…

【学习笔记】[AGC063E] Child to Parent

提供一个多项式做法。 分别设 f u , i , g u , i f_{u,i},g_{u,i} fu,i​,gu,i​表示以 u u u为根时&#xff0c; a u i a_ui au​i和 a u ≥ i a_u\ge i au​≥i的方案数&#xff0c;合并子树 v v v时&#xff0c;转移如下&#xff1a; f u , i ∑ f u , i − k r g v . k…

达梦报错:无效IP,设置达梦访问IP白名单

管理工具连接远程库&#xff0c;报错&#xff1a;无效IP 1.:关闭防火墙 systemctl status firewalld service iptables status 2.查看用户和用户状态 select username,ACCOUNT_STATUS from dba_users;3.查看用户 访问ip限制和资源限制 select id,failed_num,allow_addr fro…

倒排索引介绍

1.简介 倒排索引&#xff08;Inverted Index&#xff09;是信息检索系统中最常用的数据结构之一&#xff0c;它用来存储在全文搜索下某个单词存在于哪些文档或数据记录中。与传统的正排索引&#xff08;文档到关键词的映射&#xff09;不同&#xff0c;倒排索引建立了从关键词…

目标检测开源数据集——道路坑洼

一、危害 对车辆的影响&#xff1a;道路坑洼会导致车辆行驶不稳&#xff0c;增加车辆的颠簸&#xff0c;不仅影响乘坐舒适度&#xff0c;还可能对车辆的悬挂系统、轮胎等造成损害。长期在坑洼路面上行驶&#xff0c;车辆的减震系统、悬挂系统等关键部件容易受损&#xff0c;进…

Redis和MySQL如何保持数据一致性

前言 在高并发的场景下&#xff0c;大量的请求直接访问Mysql很容易造成性能问题。所以&#xff0c;我们都会用Redis来做数据的缓存&#xff0c;削减对数据库的请求。但是&#xff0c;Mysql和Redis是两种不同的数据库&#xff0c;如何保证不同数据库之间数据的一致性就非常关键…

【封装一个日志库(linux)】【转载】

原文链接&#xff1a; 工具库1&#xff1a;封装一个日志库&#xff08;linux)-CSDN博客 一、&#xff0c;需求 &#xff08;1&#xff09;封装一个c/c日志库&#xff0c;提供格式打印接口&#xff0c;编写程序代码时方便使用&#xff1b; &#xff08;2&#xff09; 格式打印…

Mybatis----面向接口

让mybatis自动生成dao层接口的实现类 这是dao层接口的实现类&#xff0c;在mybatis中我们可以省略这种实现接口的方式&#xff0c;直接面向接口操作数据库&#xff0c;mybatis可以帮我们自动生成接口的实现类&#xff0c;也就是下面这个实现类mybatis帮我们生成了。 1、修改se…

检测射线与边界盒AABB相交(C#代码Unity环境下测试通过)

说明&#xff1a;如果仅仅是再Unity环境下使用的话&#xff0c;直接使用Bounds.IntersectRay方法就好了&#xff0c;这里仅仅探索其算法。 上代码&#xff1a; bool RayCrossBounds(Ray ray, Bounds bounds) {if (bounds.Contains(ray.origin)) return true;//float tMinX fl…

P3952 [NOIP2017 提高组] 时间复杂度————C++

目录 [NOIP2017 提高组] 时间复杂度题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 解题思路Code运行结果 [NOIP2017 提高组] 时间复杂度 题目背景 NOIP2017 提高组 D1T2 题目描述 小明正在学习一种新的编程语言 A&#xff0c;刚学会循环语句的他激动…

openssl3.2 - 官方demo学习 - guide - tls-client-block.c

文章目录 openssl3.2 - 官方demo学习 - guide - tls-client-block.c概述记录问题server和client IP都为localhostserver和client IP都为127.0.0.1想到解决问题的方法1想到解决问题的方法2笔记END openssl3.2 - 官方demo学习 - guide - tls-client-block.c 概述 tls 客户端 官…

QT5构建套件检测不到MSVC2017解决方法

文章目录 前言一、本地环境二、现象三、解决办法 前言 记录一下 QT5 构建套件检测不到 MSVC2017 解决方法 。Qt Creator MSVC开发环境搭建&#xff08;Qt Creator 集成工具 MSVC编译&#xff09; 一、本地环境 电脑操作系统&#xff1a;Win11Qt 版本&#xff1a;Qt 5.14.2 …

linux基础学习(2):磁盘管理、分区、格式化

1.一些基本概念 一块磁盘从加入到可使用&#xff0c;需要经过3个阶段&#xff1a;分区-格式化-挂载。 1.1分区方式 linux有2种分区方式&#xff1a; &#xff08;1&#xff09;mbr&#xff1a;最大支持2.1T硬盘&#xff0c;最多支持4个分区。这4个分区可以全部为主分区&…