pdf 添加页眉页脚,获取前五页
test
/*** 加水印、页眉、页脚*/
@Test
void d1() throws IOException {//水印 样式调整String file = "D:\\test\\2\\GB1.pdf";PdfUtil.WatermarkPDF(file);
}
/*** 获取前五页*/
@Test
void d2() throws IOException {String file = "E:\\test\\2\\3.pdf";PdfUtil.getPdfSs(file);
}
PdfUtil
package com.wlq.demo.uitls;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.text.TextPosition;
import org.apache.pdfbox.util.Matrix;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.core.io.ClassPathResource;import java.io.*;/*** @author csb* @description: TODO* @date 2023/11/20 17:05*/
public class PdfUtil {public static void two (String in) throws IOException {// 加载PDF文件PDDocument document = PDDocument.load(new File(in));// 创建访问权限对象AccessPermission accessPermission = new AccessPermission();accessPermission.setCanPrint(true);accessPermission.setCanModify(false);accessPermission.setCanFillInForm(false);accessPermission.setCanExtractContent(false);// 创建保护策略对象StandardProtectionPolicy protectionPolicy = new StandardProtectionPolicy("password", "123456", accessPermission);// 应用保护策略到文档document.protect(protectionPolicy);PDType0Font font = PDType0Font.load(document, new File("D:\\test\\pdf\\11.ttf"));// 加水印 遍历每一页for (PDPage page : document.getPages()) {// 创建内容流以在页面上绘制文本PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);// 设置字体、颜色和透明度contentStream.setFont(font, 36);contentStream.setNonStrokingColor(200, 200, 200); // 灰色contentStream.setLineWidth(5);// 计算水印位置(居中)float x = page.getMediaBox().getWidth() / 2;float y = page.getMediaBox().getHeight() / 2;// 添加水印文本contentStream.beginText();contentStream.newLineAtOffset(x, y);contentStream.showText("水印");contentStream.endText();// 关闭内容流并保存更改contentStream.close();}// 保存加密后的PDF文件document.save("D:\\test\\pdf\\22.pdf");// 关闭文档document.close();}public static void WatermarkPDF(String in) throws IOException {// 加载PDF文档PDDocument document = PDDocument.load(new File(in));// PDType0Font font = PDType0Font.load(document, new File("D:\\test\\pdf\\11.ttf"));PDType0Font font = PDType0Font.load(document, new ClassPathResource("/static/MC.ttf").getInputStream());
// PDType1Font font = PDType1Font.HELVETICA_BOLD;
// PDImageXObject image = PDImageXObject.createFromFile("D:\\test\\2\\logo.png", document);PDImageXObject image = PDImageXObject.createFromFileByExtension(new ClassPathResource("/static/logo.png").getFile(), document);float pageHeight = 0;float pageWidth = 0;float margin = 40;// 遍历每一页for (PDPage page : document.getPages()) {// 计算水印位置(居中)pageHeight = page.getMediaBox().getHeight();pageWidth = page.getMediaBox().getWidth();// 创建内容流以在页面上绘制文本PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);// 设置字体、颜色和透明度contentStream.setFont(font, 18);contentStream.setNonStrokingColor(153, 153, 153); // 灰色contentStream.setLineWidth(5);// 设置水印透明度PDExtendedGraphicsState extendedGraphicsState = new PDExtendedGraphicsState();extendedGraphicsState.setNonStrokingAlphaConstant(0.8f);contentStream.setGraphicsStateParameters(extendedGraphicsState);// 添加水印文本contentStream.beginText();for (int h = 10; h < pageHeight; h = h + 250) {for (int w = -10; w < pageWidth; w = w + 200) {contentStream.setTextMatrix(Matrix.getRotateInstance(0.7, w, h));contentStream.showText("5555奶饼@163.com");}}contentStream.endText();contentStream.restoreGraphicsState();// 关闭内容流并保存更改contentStream.close();//添加页眉// 计算图片位置float imageWidth = image.getWidth() / 2;float imageHeight = image.getHeight() / 2;float x = margin + 20;float y = page.getMediaBox().getHeight() - imageHeight - margin;contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, true);contentStream.drawImage(image, x, y, imageWidth, imageHeight);contentStream.close();// 添加页脚contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, true);contentStream.setFont(font, 12);contentStream.setNonStrokingColor(51, 0, 0); // 灰色contentStream.beginText();contentStream.moveTextPositionByAmount(pageWidth - 350, margin);contentStream.drawString("STEM标准译文商城:https://client.mt.sunther.com/mall");contentStream.endText();contentStream.close();}// 保存带有水印的PDF文档document.save("D:\\test\\2\\GB16.pdf");// 关闭文档document.close();}public static void SetPdfPassword (String in){try {// 加载PDF文件PDDocument document = PDDocument.load(new File(in));// 创建访问权限对象AccessPermission accessPermission = new AccessPermission();accessPermission.setCanPrint(true);accessPermission.setCanModify(false);accessPermission.setCanFillInForm(false);accessPermission.setCanExtractContent(false);// 创建保护策略对象StandardProtectionPolicy protectionPolicy = new StandardProtectionPolicy("password", "123456", accessPermission);// 应用保护策略到文档document.protect(protectionPolicy);// // 保存加密后的PDF文件document.save("D:\\test\\pdf\\2.pdf");// 关闭文档document.close();} catch (IOException e) {e.printStackTrace();}}/*** 截取PDF前五页*/public static void getPdfSs (String in){try (PDDocument document = PDDocument.load(new File(in))) {if (document.getNumberOfPages() > 5) {// 截取前五页for (int i = document.getNumberOfPages() - 1; i >= document.getNumberOfPages() - 5; i--) {PDPage page = document.getPage(i);document.removePage(i);if (i < 5){document.addPage(page);}}}// 保存修改后的文档document.save("E:\\test\\2\\GB456.pdf");} catch (IOException e) {e.printStackTrace();}}
}相关文章:
pdf 添加页眉页脚,获取前五页
test /*** 加水印、页眉、页脚*/ Test void d1() throws IOException {//水印 样式调整String file "D:\\test\\2\\GB1.pdf";PdfUtil.WatermarkPDF(file); } /*** 获取前五页*/ Test void d2() throws IOException {String file "E:\\test\\2\\3.pdf";P…...
SQL 实战问题解析
在数据分析和数据库操作中,SQL 查询是至关重要的一环。本文将通过分析四道典型的 SQL 题目,深入探讨如何从复杂的业务需求中构建准确高效的 SQL 查询。 一、删除学生表冗余信息 需求解读 给定一个学生表,其中包含自动编号、学号、姓名、课程编…...
Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)
使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成 玩Android 开放API-玩Android - wanandroid.com 接口使用的是下面的两个: https://www.wanandroid.com/banner/jsonhttps://www.wan…...
python的安装环境Miniconda(Conda 命令管理依赖配置)
这一段时间,对AI大模型 有了兴趣就想研究一下。 在研究之前肯定要先把需要的编程技能掌握了。经过我查阅资料,今天就先学一下 python的 环境安装。 Node.js 包管理工具:npm 依赖配置文件:package.json 环境管理:nvm&am…...
【LeetCode】【算法】128. 最长连续序列
LeetCode 128. 最长连续序列 题目描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例: 输入:nums [10…...
【dvwa靶场:XSS系列】XSS (Reflected)低-中-高级别,通关啦
一、低级low 简单拿捏 <script>alert(123)</script>二、中级middle 源码过滤了script但是没有过滤大小写,改成大写S <Script>alert(123)</script>三、高级high 比中级高,过滤了script并且以及大小写,使用其他标…...
imu_tk配置教程(锁死ubuntu18.04,不要22.04)
在ubuntu18.04上安装。 imu_tk 的 cmake 必须要qt4.x,但 ubuntu22.04 和qt4.x不适配。 1、安装 ceres-solver 下载路径:http://ceres-solver.org/installation.html (需要梯子,核心内容记录如下。需下载 ceres-solver 安装包&am…...
Vue 的 keep-alive
什么是 keep-alive? <keep-alive> 是一个内置组件,用于缓存组件实例,从而提高应用的性能。当包裹动态组件时,<keep-alive> 会缓存不活跃的组件实例,而不是销毁它们。这使得当组件重新激活时,可…...
linux进程的状态之环境变量
我们在前面了解了进程的状态及相关概念 接下来我们接着上一篇进程的状态接着了解环境变量 进程的状态 文章目录 目录 文章目录 前言 二、环境变量 1、常见环境变量 2、查看环境变量 3、修改PATH 4、HOME 5、PATH 编辑 6、和环境变量相关的命令 三、环境变量的组织…...
【系统架构设计师】预测试卷一:论文(包括4篇论文主题对应的写作要点分析)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 试题一:论面向服务的架构设计与应用试题一写作要点试题二:论软件架构的脆弱性试题二 写作要点试题三:论分布式存储系统架构设计试题三 写作要点试题四:论网络安全体系架构设计及应用试题四 写作要点试题一:论面…...
东胜物流软件 AttributeAdapter.aspx SQL 注入漏洞复现
0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…...
2024年网鼎杯青龙组|MISC全解
转载或摘抄时请标明出处 MISC01 wdbflag{22226aba1d98c4302a6f508cad7da5d8} MISC02 一把梭工具没有任何结果,估计缺少符号表,直接strings flag > out.txt导出后慢慢找线索 在桌面上发现了png和txt文件,用文件名做一次筛选 第一行发现bas…...
查询引擎的演变之旅 | OceanBase原理解读
在关系型数据库中,查询调度器与计划执行器,有着与查询优化器同样重要的地位,随着计算机硬件技术的飞速进步,这两大模块的重要性日益凸显,成为提升数据库性能的关键所在。接下来,本文将由来自 OceanBase 的技…...
轻松理解操作系统 - Linux 软硬链接是什么?
Linux 由于其开源、比较稳定等特点统治了服务端领域。也因此,学习Linux 系统相关知识在后端开发等岗位中变得越来越重要,甚至可以说是必不可少的。 因为它的广泛应用,所以在程序员的日常工作和面试中,它都是经常出现的。它的开源特…...
Redis - 数据库管理
Redis 提供了⼏个⾯向Redis数据库的操作,分别是dbsize、select、flushdb、flushall命令, 本机将通过具体的使⽤常⻅介绍这些命令。 一、切换数据库 select dbIndex 许多关系型数据库,例如MySQL⽀持在⼀个实例下有多个数据库存在的&#…...
VBA02-初识宏——EXCEL录像机
一、录制宏 录制宏其实就是将一系列操作结果录制下来,并命名存储。这些操作可以是关于数据的处理、格式的设置、函数的运用等,相当于在编程语言(如VB)中定义的一个子程序。 在录制宏时,软件会记录用户执行的一系列操…...
Unity网络开发基础(part5.网络协议)
目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…...
forEach可以遍历不可枚举属性吗
首先第一个问题,forEach能不能遍历对象的属性 const obj { a: 1, b: 2, c: 3 }; obj.forEach((item) > console.log(item))运行这段代码我们发现发生了一个错误 这说明forEach是不可以遍历对象的属性的 在js中,forEach 方法用于遍历数组或类数组对象(如 NodeL…...
Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问
文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器,并即时生成您的文档博客网站,结合…...
索引基础篇
前言 通过本篇博客的学习,我希望大家可以了解到 “索引” 是为了提高数据的查询效率。 索引的介绍 索引是为了提高查询数据效率的数据结构 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着…...
如何使用谷歌全新AI智能体,实现超越普通搜索的信息追踪
在谷歌 I/O 2026 开发者大会主题演讲中,这家科技巨头宣布了搜索功能中全新的智能体能力。用户现在可以创建、自定义并管理多个 AI 智能体,以便持续获取感兴趣话题的最新动态。此次发布是谷歌大力推进智能体 AI 系统战略的重要组成部分,这类系…...
阿里云服务器上fastText安装踩坑记:从C++11报错到模型量化压缩的完整避坑指南
阿里云ECS实战:fastText从编译报错到模型量化的全流程解决方案 当你在阿里云ECS上部署fastText模型时,是否遇到过那个令人头疼的"C11编译错误"?这仅仅是开始——内存占用过高、磁盘空间不足、推理速度慢等问题会接踵而至。本文将带…...
MySql学习杂谈 --- “连接“”
第一步:忘掉所有术语,记住一个生活场景 想象你要做一件事:查全班同学的考试成绩 表A(同学名单):张三,李四,王五,赵六 表B(考试成绩)࿱…...
集团化全员学习企业在线学习平台选型指南|政企专属解决方案
在数字化人才培养浪潮下,集团化全员学习已成为央企、国企、大型上市公司的核心战略,而一款稳定、可管控、高合规的企业在线学习平台,是支撑万人级培训的核心底座。传统分散式培训存在管理混乱、标准不统一、效果不可追溯等痛点,本…...
iPaaS厂商:五家主流集成平台的技术与市场观察
在数字化转型的深水区,企业级集成平台即服务(iPaaS)正在成为IT架构的“神经系统”。国内外众多厂商纷纷布局,形成了从全域智能集成到轻量SaaS连接的多极化格局。本文基于公开资料,对五家具有代表性的iPaaS厂商及其核心…...
后悔没早装!iPhone装上这8个APP,生产力瞬间拉满
有了iPhone之后,很多人都会遇到同一个问题——软件商店里应用浩如烟海,到底哪些才是真正值得装的?有的软件看起来花里胡哨,装上后却很少打开;有的工具看似简单,用惯了才发现离不开了。作为一个从“有了它只…...
RT-Thread v5.2.2内核与驱动深度优化:调度、CAN、串口与生态工具全面解析
1. 项目概述:RT-Thread v5.2.2 版本深度解析作为一名在嵌入式领域摸爬滚打多年的开发者,每次看到像RT-Thread这样的主流实时操作系统发布新版本,我都会习惯性地去“扒一扒”更新日志。这不仅仅是看热闹,更是为了评估它能否解决我手…...
语法错误秒级定位,Perplexity查询调试实战手册,一线SRE团队内部流出!
更多请点击: https://intelliparadigm.com 第一章:Perplexity语法查询功能概览 Perplexity 是一款面向开发者与数据分析师设计的轻量级语法感知型查询工具,其核心能力在于对结构化与半结构化文本(如 SQL、JSON Schema、YAML 配置…...
利用 Taotoken 为 AIGC 应用构建高可用的模型调度中间层
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 Taotoken 为 AIGC 应用构建高可用的模型调度中间层 在构建图像或文本生成类应用时,开发者常常面临一个核心挑战&a…...
告别Chrome依赖:在Edge上完美复刻XPath Helper,打造你的爬虫元素定位工作流
告别Chrome依赖:在Edge上完美复刻XPath Helper,打造你的爬虫元素定位工作流 浏览器工具链的迁移从来不是简单的插件替换,而是一场关于开发习惯与效率的深度重构。当微软Edge凭借Chromium内核的稳定性和内存优化逐渐成为技术工作者的新宠&…...
