Java 在PDF中插入页眉、页脚

在处理PDF文档时,有时需要为文档中的每一页添加页眉和页脚,以包含一些有用的信息,如文档标题、章节名称、日期、页码等。对于需要自动化处理的场景,或者需要在大量文档中添加一致的页眉和页脚,可以通过编程的方式来实现。本文将介绍如何使用Java为PDF文件添加页眉、页脚。

所需工具:Free Spire.PDF for Java 免费库。可以点击链接下载最新版本并手动添加引用到你的Java项目中,同时也支持通过Mave仓库安装。

方法简介:

在以下示例中,我们用到了 PdfCanvas 类的DrawString()DrawImage() DrawLine() 方法,分别用于在PDF页面上指定位置绘制文本、图片和线条。

如果要添加动态的信息如页码、页数、章节编号等,则可以使用Free Spire.PDF for Java提供的PdfPageNumberFieldPdfPageCountFieldPdfSectionNumberField 类,然后再使用Draw() 方法将其绘制到PDF页眉或页脚位置。

示例代码:

1. 使用Java在PDF中插入页眉

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.*;import java.awt.*;public class PDFHeader {public static void main(String[] args) {//加载PDF文档PdfDocument pdf = new PdfDocument();pdf.loadFromFile("考核.pdf");//加载图片PdfImage headerImage = PdfImage.fromFile("logo.jpg");//获取图片宽度float width = headerImage.getWidth();PdfUnitConvertor unitCvtr = new PdfUnitConvertor();float pointWidth = unitCvtr.convertUnits(width, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point);//指定页眉文本String headerText = "年度绩效考核\nAAA有限责任公司";//创建字体PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", Font.BOLD, 12),true);//创建画笔PdfBrush brush = PdfBrushes.getRed();PdfPen pen = new PdfPen(PdfBrushes.getBlack(), 1.0f);//遍历所有PDF页面for (int i = 0; i < pdf.getPages().getCount(); i++){//获取指定页面PdfPageBase page = pdf.getPages().get(i);//在顶部空白区域绘制图像page.getCanvas().drawImage(headerImage, page.getActualSize().getWidth() - pointWidth - 55, 20);//在顶部空白区域绘制文本page.getCanvas().drawString(headerText, font, brush, 55, 30);//在顶部空白区域绘制一条线page.getCanvas().drawLine(pen, new Point(55, 70), new Point((int)page.getActualSize().getWidth() - 55, 70));}//保存生成PDF文件pdf.saveToFile("PDF页眉.pdf");pdf.dispose();}
}

 以上代码遍历了PDF文档的所有页面,并在每一页的页眉位置添加了文本、图片和分隔线,运行后效果图如下:

2. 使用Java在PDF中插入页脚

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.automaticfields.PdfCompositeField;
import com.spire.pdf.automaticfields.PdfPageCountField;
import com.spire.pdf.automaticfields.PdfPageNumberField;
import com.spire.pdf.graphics.*;import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;public class PDFFooter {public static void main(String[] args) {//加载PDF文档PdfDocument pdf = new PdfDocument();pdf.loadFromFile("考核.pdf");//创建字体PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", Font.BOLD, 12),true);//创建画笔PdfBrush brush = PdfBrushes.getBlack();PdfPen pen = new PdfPen(PdfBrushes.getBlack(), 1.0f);//创建页码字段PdfPageNumberField pageNumberField = new PdfPageNumberField();//创建页数字段PdfPageCountField pageCountField = new PdfPageCountField();//创建一个复合字段,将页数字段和页码字段合并为一个字符串PdfCompositeField compositeField = new PdfCompositeField(font, brush, "第{0}页/共{1}页", pageNumberField, pageCountField);//获取文本尺寸Dimension2D fontSize = font.measureString(compositeField.getText());//获取页面尺寸Dimension2D pageSize = pdf.getPages().get(0).getSize();//设置复合字段的位置compositeField.setLocation(new Point2D.Double((pageSize.getWidth() - fontSize.getWidth())/2,  pageSize.getHeight() - 45));//遍历PDF页面for (int i = 0; i < pdf.getPages().getCount(); i++){//获取指定页PdfPageBase page = pdf.getPages().get(i);//在底部空白区域绘制一条线page.getCanvas().drawLine(pen, new Point(72, (int) (pageSize.getHeight() - 60)), new Point((int)pageSize.getWidth() - 72, (int) pageSize.getHeight()- 60));//在底部空白区域绘制复合字段compositeField.draw(page.getCanvas());}//保存生成PDF文件pdf.saveToFile("PDF页脚.pdf");pdf.dispose();}
}

以上代码遍历了PDF文档的所有页面,并在每一页的页脚位置添加了对应的页码、页数信息以及一条分隔线,运行后效果图如下:

小结:

在不破坏PDF文档布局的情况下,我们可以使用Free Spire.PDF for Java免费库将所需的元素绘制到PDF页面顶部和底部的指定位置来生成自定义页眉页脚,提高PDF文档的可读性和专业性。

此外,Free Spire.PDF for Java免费库还支持其他一些操作PDF文档的功能,更多示例可以点击了解:

Spire.PDF for Java 中文教程Spire.PDF for Java 是一款专门对 PDF 文档进行操作的 Java 类库。该类库的主要功能在于帮助开发人员在 Java 应用程序(J2SE 和 J2EE)中生成 PDF 文档和操作现有 PDF 文档,并且运行环境无需安装 Adobe Acrobat。同时兼容大部分国产操作系统,能够...icon-default.png?t=N7T8https://www.e-iceblue.cn/spirepdfjava/spire-pdf-for-java-program-guide-content.html

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

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

相关文章

Django日志(三)

内置TimedRotatingFileHandler 按时间自动切分的log文件,文件后缀 %Y-%m-%d_%H-%M-%S , 初始化参数: 注意 发送邮件的邮箱,开启SMTP服务 filename when=h 时间间隔类型,不区分大小写 S:秒 M:分钟 H:小时 D:天 W0-W6:星期几(0 = 星期一) midnight:如果atTime未指定,…

C++的内存管理

目录 1. C/C内存分布 2. C语言中动态内存管理方式 3. C内存管理方式 3.1 new/delete操作内置类型 4. operator new与operator delete函数 4.1 连续开辟空间(尽力了解) 5. new和delete的实现原理 5.1 内置类型 5.2 自定义类型 6. 深入理解 6.1malloc/free和new/delete的区…

SLAM 求解IPC算法

基础知识&#xff1a;方差&#xff0c;协方差&#xff0c;协方差矩阵 方差&#xff1a;描述了一组随机变量的离散程度 方差 每个样本值 与 全部样本的平均值 相差的平方和 再求平均数&#xff0c;记作&#xff1a; 例如&#xff1a;计算数字1-5的方差&#xff0c;如下 去中心化…

调试嵌入式linux时,出现ssh不能远程登录的解决方法

如题&#xff0c;最近在调试stm32mp157的板卡时&#xff0c;出现了ssh不能登录的问题&#xff0c;主要有两种情况&#xff0c;表现的都是不能ssh登录&#xff0c;现在具体描述一下&#xff0c;记录一下过程&#xff1a; 情况一&#xff1a; 调试过程中&#xff0c;使用ssh登录…

Power BI ----SVG(圆环图)

圆环图助力矩阵图 定义度量值放置视觉对象 SVG是什么鬼&#xff0c;在现在的Web世界中越来越凸显这一标准的优势。关于SVG&#xff0c;我们只需要知道一点就好 ---- SVG 意为可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff09;。它是使用 XML 格式定义的图像。 由…

【LeetCode 算法刷题笔记-路径篇】

1.0112. 路径总和 1.1 题目大意 描述&#xff1a;给定一个二叉树的根节点 root 和一个值 targetSum。 要求&#xff1a;判断该树中是否存在从根节点到叶子节点的路径&#xff0c;使得这条路径上所有节点值相加等于 targetSum。如果存在&#xff0c;返回 True&#xff1b;否则…

docker-compose(mysql5.6、mysql8、neo4j3.5、redis)

docker-compose常用配置 docker-compose.ymlmysql5.6 配置文件 my.cnfmysql8 配置文件 my.cnfredis 配置文件 redis.conf docker-compose.yml version: 3 services: # 所有卷挂载在/home/docker/vol目录&#xff0c;不同应用建立不同子目录存放挂载数据 # 图数据库 neo4j:cont…

elementUI Tree 树形控件单选实现

文章目录 展示效果代码实现elementui Tree树形控件其他详细数据 在Element UI中&#xff0c;树形控件&#xff08;el-tree&#xff09;本身不支持单选功能。但是&#xff0c;你可以通过监听节点点击事件并手动更新选中状态来实现单选树。 以下是一个简单的例子&#xff0c;展示…

vue3中reactive详解

在Vue 3中&#xff0c;reactive函数是一个非常重要的工具&#xff0c;它用于将普通的JavaScript对象或数组转换为响应式对象。这意味着当这些对象的属性发生变化时&#xff0c;Vue可以自动检测和更新相关的DOM。 使用方法 使用reactive函数&#xff0c;你可以将任意对象或数组…

底盘运动模型及里程计

主要研究底盘运动模型及里程计 目录 1.底盘模型1.1 两轮差分底盘的运动学模型1.2 二、三轮全向底盘的运动学模型2.航迹推算1.3 阿克曼底盘运动学模型1.3.1 阿克曼结构1.3.2 阿克曼结构运动学模型3.里程计标定3.1 线性最小二乘的基本原理3.1 最小二乘在里程计标定中的应用1.底盘…

Go 语言Web开发-模板(template)快速入门教程

模板基础 Go语言模板包是用于生成文本输出的工具&#xff0c;它通过解析模板文本并结合数据生成最终的输出文本。模板语法简洁而强大&#xff0c;包括模板标记、变量输出、控制结构和模板函数等。模板对象表示已解析和编译的模板&#xff0c;可以执行并输出最终文本。模板包的…

React【Day1】

B站视频链接 一、React介绍 React由Meta公司开发&#xff0c;是一个用于 构建Web和原生交互界面的库 React的优势 相较于传统基于DOM开发的优势 组件化的开发方式不错的性能 相较于其它前端框架的优势 丰富的生态跨平台支持 React的市场情况 全球最流行&#xff0c;大…

nginx的location规则与其他功能

1. nginx中location规则&#xff1a; 规则描述~表示执行一个正则匹配&#xff0c;区分大小写~*表示执行一个正则匹配&#xff0c;不区分大小写^~表示普通字符匹配&#xff0c;如果该选项匹配&#xff0c;只匹配该选项&#xff0c;不匹配别的选项&#xff0c;一般用来匹配目录进…

pandas读写excel,csv

1.读excel 1.to_dict() 函数基本语法 DataFrame.to_dict (self, orientdict , into ) --- 官方文档 函数种只需要填写一个参数&#xff1a;orient 即可 &#xff0c;但对于写入orient的不同&#xff0c;字典的构造方式也不同&#xff0c;官网一共给出了6种&#xff0c…

API(时间类)

一、Date类 java.util.Date类 表示特定的瞬间&#xff0c;精确到毫秒。 Date常用方法&#xff1a; public long getTime() 把日期对象转换成对应的时间毫秒值。 public void setTime(long time) 把方法参数给定的毫秒值设…

python网络爬虫实战教学——requests的使用(1)

文章目录 专栏导读1、前言2、get请求3、抓取网页4、抓取二进制数据5、请求头 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

部署Prometheus+grafana详解

目录 一、prometheus 介绍 二、prometheus 对比 zabbix 三、prometheus 监控插件 四、部署 1、下载所需的包 2.编辑prometheus的配置文件 3、编辑alertmanager 的配置文件 4、tmpl 模板&#xff08;将此文件创建在/opt/alertmanager/tmpl/&#xff09; 5.启动&#xff0…

探索国内ip切换App:打破网络限制

在国内网络环境中&#xff0c;有时我们会遇到一些限制或者屏蔽&#xff0c;使得我们无法自由访问一些网站或服务。而国内IP切换App的出现&#xff0c;为解决这些问题提供了非常便捷的方式。这些App可以帮助用户切换IP地址&#xff0c;让用户可以轻松地访问被限制或屏蔽的网站&a…

leetcode刷题(javaScript)——BFS广度优先遍历相关场景题总结

广度优先搜索&#xff08;BFS&#xff09;在JavaScript编程中有许多实际应用场景&#xff0c;特别是在解决图、树等数据结构相关问题时非常常见。在JavaScript中&#xff0c;可以使用队列来实现广度优先搜索算法。通过将起始节点加入队列&#xff0c;然后迭代地将节点的邻居节点…

css background-color属性无效

因为工作需要&#xff0c;最近在帮H5同事开发几个页面&#xff0c;在使用H5进行如下布局的时候&#xff0c;发现设置 background-color为白色无效。 代码如下&#xff1a; <div class "bottomBar"><div style"position: fixed; left: 20px;">…