掌握iText:轻松处理PDF文档-高级篇-添加页眉和页脚

推荐语

本文介绍了如何使用iText编程库为PDF文档添加自定义的页眉和页脚。通过指定位置、大小、字体和颜色等属性,你可以将文本、图像或其他元素添加到每一页的固定位置,实现专业、可读的自定义页眉和页脚效果。这对于需要批量处理大量PDF文档或需要更精细控制的用户来说非常适用。文章提供了详细的代码示例和依赖配置,帮助你快速上手。如果你想要为PDF文档添加页眉和页脚,这篇文章会给你带来很大的帮助。

掌握iText:轻松处理PDF文档-基础篇-CSDN博客

掌握iText:轻松处理PDF文档-进阶篇-CSDN博客

掌握iText:轻松处理PDF文档-高级篇-添加水印-CSDN博客

掌握iText:轻松处理PDF文档-高级篇-加密和解密-CSDN博客

需求描述

在日常工作或学习中,经常会遇到需要给 PDF 文档添加页眉或页脚的需求。无论是为了提高文档的专业性和可读性,还是为了标识文档的来源和版本信息,添加页眉或页脚都是很常见的操作。

为了实现这一目标,你可以选择使用 PDF 编程库(如iText、Apache PDFBox等),通过编写代码来自定义页眉或页脚的内容和样式。通过指定位置、大小、字体和颜色等属性,你可以将文本、图像或其他元素添加到每一页的固定位置,实现自定义的页眉或页脚效果。这种方法非常适用于那些需要批量处理大量 PDF 文档或希望进行更精细控制的用户。

iText的依赖

在maven的pom.xml中配置:

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

添加页眉和页脚

  • 创建一个 Document 对象,这个对象代表了一个 PDF 文档。
Document document = new Document();
  • 创建一个 PdfWriter 对象,并将其与 Document 对象关联;PdfWriter 用于将内容写入到 PDF 文档中,并指定输出路径。
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("e:/pdf-test/test-v3.pdf"));
  • 创建一个自定义的事件处理器 MyHeaderFooter,并将其设置为 PdfWriter 的页面事件处理器;MyHeaderFooter 是一个实现了 PdfPageEventHelper 类的内部类,通过重写 onStartPage 和 onEndPage 方法来实现自定义的页眉和页脚内容。
MyHeaderFooter headerFooter = new MyHeaderFooter();
writer.setPageEvent(headerFooter);
  • 打开文档:开始写入内容之前,需要先打开文档。
document.open();
  • 使用循环向文档中添加内容:这里使用了一个简单的循环,向文档中添加三个段落。在每个段落之间,通过 Paragraph("\n\n") 添加了两个空行。如果不是最后一页,使用 document.newPage() 方法添加一个新的页面。
for (int i = 0; i < 3; i++) {
    // 添加空行
    Paragraph elements1 = new Paragraph("\n\n");
    document.add(elements1);
    
    // 添加段落
    Paragraph elements = new Paragraph("nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. ");
    document.add(elements);

    // 如果不是最后一页,添加新页
    if (i != 2) {
        document.newPage();
    }
}
  • 关闭文档:写入内容完成后,需要关闭文档。
document.close();
  • MyHeaderFooter 类实现了 PdfPageEventHelper 类,并重写了 onStartPage 和 onEndPage 方法来自定义页眉和页脚的内容。
    • onStartPage 方法在每个新页面开始时调用,用于添加自定义的页眉内容。这里使用 ColumnText.showTextAligned() 方法将文本居中显示在页面顶部。
    • onEndPage 方法在每个页面结束时调用,用于添加自定义的页脚内容。这里使用 ColumnText.showTextAligned() 方法将文本居中显示在页面底部,并包含当前页码信息。

通过以上代码,可以生成一个包含自定义页眉和页脚的 PDF 文档。在每个页面的顶部会显示 "My Header",而底部会显示 "My Footer - Page X"(X 表示当前页码)。

下面是完整的示例:

@Test
public void test3() {
    Document document = new Document();
    try {
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("e:/pdf-test/test-v3.pdf"));
        // 设置事件处理器
        MyHeaderFooter headerFooter = new MyHeaderFooter();
        writer.setPageEvent(headerFooter);
        document.open();
        for (int i = 0; i < 3; i++) {
            Paragraph elements1 = new Paragraph("\n\n");
            document.add(elements1);
            Paragraph elements = new Paragraph("nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. ");
            document.add(elements);
            if (i != 2) {
                document.newPage();
            }
        }
        document.close();
    } catch (DocumentException | IOException e) {
        e.printStackTrace();
    }
}
private static class MyHeaderFooter extends PdfPageEventHelper {
    @Override
    public void onStartPage(PdfWriter writer, Document document) {
        System.out.println("-");
        ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER,
                new Phrase("My Header"), (document.right() - document.left()) / 2, document.top() - 20, 0);
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        System.out.println("--");
        ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER,
                new Phrase("My Footer - Page " + writer.getPageNumber()), (document.right() - document.left()) / 2, document.bottom() + 30, 0);
    }

}

写在最后

如果你喜欢本文介绍的如何使用iText编程库为PDF文档添加自定义的页眉和页脚,那么请不要忘记给这篇文章点赞和收藏哦!我们会继续为你带来更多实用的技术教程和开发经验,让你在工作中更加得心应手!同时,也欢迎你分享本文给更多的朋友和同事,让他们也能够受益于我们的技术内容。感谢你的支持和关注!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

modelbox线程爆满宕机bug

序 该bug的解决需要特别感谢张同学。有了大佬的帮助&#xff0c;这个bug才得以解决。 问题现象 modelbox可以进行模型推理&#xff0c;但压测一段时间后&#xff0c;modelbox会宕机&#xff0c;并发生段错误。 “libgomp: Thread creation failed: Resource temporarily una…

TCP/IP详解——ICMP协议,Ping程序,Traceroute程序,IP源站选路选项

文章目录 一、ICMP 协议1. ICMP 概念2. ICMP 重定向3. ICMP 差错检测4. ICMP 错误报告/差错报文5. ICMP 差错报文的结构6. ICMP 源站抑制差错7. ICMP 数据包格式8. ICMP 消息类型和编码类型9. ICMP 应用-Ping10. ICMP 应用-Tracert11. BSD 对 ICMP 报文的处理12. 总结 PING 程序…

数据结构:队列

数据结构&#xff1a;队列 文章目录 数据结构&#xff1a;队列1.队列常用操作&#xff1a;2.队列的实现3.队列典型应用 ***「队列 queue」是一种遵循先入先出规则的线性数据结构。***队列模拟了排队现象&#xff0c;即新来的人不断加入队列尾部&#xff0c;而位于队列头部的人逐…

Visual studio+Qt开发环境搭建以及注意事项和打开qt的.pro项目

下载qt-然后安装5.14.2_msvc2017 不知道安装那个就全选5.14.2的父级按钮 https://download.qt.io/archive/qt/5.14/5.14.2/ 安装Visual studio,下载直接下一步就行 配置Visual studio的qt环境 在线安装-重启Visual studio会自动安装 离线安装-关闭Visual studio点击安装 关闭…

a16z:加密行业2024趋势“无缝用户体验”

近日&#xff0c;知名加密投资机构a16z发布了“Big ideas 2024”&#xff0c;列出了加密行业在 2024 年几个具备趋势的“大想法”&#xff0c;其中 Seamless UX&#xff08;无缝用户体验&#xff09;赫然在列。 从最为直观的理解上&#xff0c;Seamless UX 是在强调用户在使用产…

路由器原理

目录 一.路由器 1.路由器的转发原理 2.路由器的工作原理 二.路由表 1.路由表的形成 2.路由表表头含义 直连&#xff1a; 非直连&#xff1a; 静态 静态路由的配置 负载均衡&#xff08;浮动路由&#xff09; 默认路由 动态 三.交换与路由对比 一.路由器 1.路由器…

独立完成软件的功能的测试(4)

独立完成软件的功能的测试&#xff08;4&#xff09; &#xff08;12.14&#xff09;&#xff08;功能测试>头条项目实战&#xff09; 项目总体概述 项目背景和定位&#xff1a;一款汇聚科技咨询&#xff0c;技术文章和问答交流的用户移动终端产品&#xff0c;用户可以通过…

STM32在CTF中的应用和快速解题

题目给的是bin文件&#xff0c;基本上就是需要我们手动修复的固件逆向。 如果给的是hex文件&#xff0c;我们可能需要使用MKD进行动态调试 主要还是以做题为目的 详细的可以去看文档&#xff1a;https://pdf1.alldatasheet.com/datasheet-pdf/view/201596/STMICROELECTRONIC…

微服务学习:Gateway服务网关

一&#xff0c;Gateway服务网关的作用&#xff1a; 路由请求&#xff1a;Gateway服务网关可以根据请求的URL或其他标识符将请求路由到特定的微服务。 负载均衡&#xff1a;Gateway服务网关可以通过负载均衡算法分配请求到多个实例中&#xff0c;从而平衡各个微服务的负载压力。…

一入二出热电阻温度信号隔离变送器

一入二出热电阻温度信号隔离变送器 用于测量铂热电阻Pt10,Pt100,Pt1000,Cu50,Cu100的热电阻传感器的小型仪器设备。广泛应用于工业测量温度系统&#xff0c;是降低成本且有效的测量方式。 型号&#xff1a;JSD TARZ-1002系列 我们来看下有什么特点&#xff1a; ◆小体积&#x…

天猫数据分析平台-天猫销售数据查询软件-11月天猫平台冲锋衣市场销售运营数据分析

随着气温逐渐下降&#xff0c;保暖服饰迎来热销&#xff0c;冲锋衣的需求大增。如今冲锋衣已经不仅仅是户外运动的装备&#xff0c;还成为很多年轻人的日常穿搭和时尚的追求。 新的穿搭趋势也带来了巨大的市场机会。据公开数据显示&#xff0c;中国有冲锋衣生产及经营企业超过8…

竞赛保研 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

什么是纯净IP?如何判断IP地址的纯净度?有哪些干净IP推荐?

您是否想知道什么使代理“干净”或如何确保您的代理不会将您列入网站的黑名单&#xff1f;对于通过代理访问网络的人来说&#xff0c;干净的代理是无缝在线体验的重要组成部分。在这篇文章中&#xff0c;我们将深入研究干净代理的世界&#xff0c;并探讨决定其质量的因素。 一、…

k8s常用命令及示例(三):apply 、edit、delete

k8s常用命令及示例(三)&#xff1a;apply 、edit、delete 1. kubectl apply -f 命令&#xff1a;从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下&#xff1a;kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…

加速数据采集:用OkHttp和Kotlin构建Amazon图片爬虫

引言 曾想过轻松获取亚马逊上的商品图片用于项目或研究吗&#xff1f;是否曾面对网络速度慢或被网站反爬虫机制拦截而无法完成数据采集任务&#xff1f;如果是&#xff0c;那么本文将为您介绍如何用OkHttp和Kotlin构建一个高效的Amazon图片爬虫解决方案。 背景介绍 亚马逊&a…

Spring Boot之自定义starter

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Boot的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. starter是什么 二.为什么要使…

万界星空科技AI低代码云MES系统

在企业生产管理过程中&#xff0c;从市场、生产现场到产品交付&#xff0c;生产制造行业都面临着诸多挑战&#xff0c;比如&#xff1a; 订单排产难度大&#xff1a;订单混乱&#xff0c;常漏排产、错排产&#xff1b;产能不明晰&#xff0c;无法承诺交期&#xff0c;常丢单&a…

智慧工地源码(微服务+Java+Springcloud+Vue+MySQL)

智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三…

python selenium chrome114版本之后环境配置和携带缓存打开chrome

尽力局 chrome驱动环境配置chrome打开带缓存设置待缓存打开自动关闭浏览器自动关闭浏览器弹窗 最终代码找资料难啊最终效果代码 依赖包和生成依赖包方法关闭谷歌升级 chrome驱动环境配置 网上找到的资料&#xff0c;我现在安装的是120版本的&#xff0c;这个资料是可行的。比较…

物流实时数仓:数仓搭建(DWD)一

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 物流实时数仓&#xff1a;数仓搭建&#xff08;DIM&#xff09; 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&#xff09;一 文章目录 系列文章目录前言一、文件编写1.目录创建2.b…