Java实现对已有的PDF添加页码

本文介绍如何使用Java和itextpdf库为现有PDF文档添加页码。通过自定义PdfPageEventHelper并重写onEndPage方法,实现在每页底部添加页码。同时,解决了中文页码显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java实现对已有的PDF添加页码


新文章,对PDF添加页码的同时,添加总页数 《Java实现对已有的PDF添加页码 加 总页码(二)


一、思路

对现有的PDF文档,进行读取,然后一页一页的复制,进行触发 页面页码监听事件,自定义的页码监听事件功能是在一页文档结束时,进行绘画页码文本到内容去

itextpdf 提供了对页面监听事件的方法:

	PdfWriter writer = PdfWriter.getInstance(document, fos);
	// 设置页面监听事件,必须在open方法前
	writer.setPageEvent(final PdfPageEvent event);

只需要自定义实现 PdfPageEvent 接口的方法
但是itextpdf提供了一个实现类:

public class PdfPageEventHelper implements PdfPageEvent

所以只需要自定义页码监听事件 继承 PdfPageEventHelper 重写 onEndPage 方法

二、准备环境

  • Java1.8
  • eclipse
  • maven
  • Jar:itextpdf-5.5.13.1.jar
  • Jar:itext-asian-5.2.0.jar

三、maven依赖

pom.xml

	<dependency>
	    <groupId>com.itextpdf</groupId>
	    <artifactId>itextpdf</artifactId>
	    <version>5.5.13.1</version>
	</dependency>
	
	<!-- 解决页码有中文字符时,无法正常显示的问题 -->
	<dependency>
	    <groupId>com.itextpdf</groupId>
	    <artifactId>itext-asian</artifactId>
	    <version>5.2.0</version>
	</dependency>

四、自定义页码页码监听事件

页面监听事件:com.itextpdf.text.pdf.PdfPageEvent

可以对页面文档的打开、关闭,页面的开始、结束,段落的开始、结束等进行事件监听
可以实现该接口进行自定义丰富的事件操作PDF文档

itextpdf已经给提供了类:com.itextpdf.text.pdf.PdfPageEventHelper
只需要进行重写 onEndPage方法,进行自定义 添加页码的 功能

package com.tianya.pdf;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * @description
 *	针对页码生成的PDF事件监听	
 * @author TianwYam
 * @date 2019年12月28日下午8:51:08
 */
public class PageNumPdfPageEvent extends PdfPageEventHelper{

	@Override
	public void onEndPage(PdfWriter writer, Document document) {
		
		try {
			// PDF文档内容
			PdfContentByte pdfContent = writer.getDirectContent();
			
			pdfContent.saveState();
			pdfContent.beginText();
			
			int footerFontSize = 14 ;
			
			// 解决页码中文无法显示 或者 显示为乱码的问题
			// 但是必须引入jar包 itext-asian-5.2.0.jar
			BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
			Font fontDetail = new Font(baseFont, footerFontSize, Font.NORMAL);
			
			pdfContent.setFontAndSize(baseFont, footerFontSize);
			
			// 页脚的页码 展示
			String footerNum = String.format("第%d页", writer.getPageNumber());
			Phrase phrase = new Phrase(footerNum, fontDetail);
			
			// 页码的 横轴 坐标 居中
			float x = ( document.left() + document.right() ) / 2 ;
			// 页码的 纵轴 坐标
			float y = document.bottom(-10) ;
			// 添加文本内容,进行展示页码
			ColumnText.showTextAligned(pdfContent, Element.ALIGN_CENTER, phrase, x, y, 0);
			
			pdfContent.endText();
			pdfContent.restoreState();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

五、复制、添加事件监听

package com.tianya.pdf;

import java.io.FileOutputStream;

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * @description
 *	PDF操作工具类
 * @author TianwYam
 * @date 2019年12月28日下午8:44:38
 */
public class PdfUtils {
	
	
	/**
	 * @description
	 *	给PDF文件添加页码
	 * @author TianwYam
	 * @date 2019年12月28日下午8:48:55
	 * @param orgPdfPath 源PDF文件路径
	 * @param outputPdfPath 加了页码的PDF文件路径
	 * @return 返回添加了页码的PDF文件路径
	 */
	public static String addPageNum (String orgPdfPath, String outputPdfPath) {
		
		try (
			// 输出文件 流
			FileOutputStream fos = new FileOutputStream(outputPdfPath) ;){
			
			// 新建文档,默认A4大小
			Document document = new Document(PageSize.A4);
			PdfWriter writer = PdfWriter.getInstance(document, fos);
			// 设置页面监听事件,必须在open方法前
			writer.setPageEvent(new PageNumPdfPageEvent());
			document.open();
			
			// PDF内容体
			PdfContentByte pdfContent = writer.getDirectContent();
			// 读取 源PDF文件,进行一页一页复制,才能触发 添加页码的  页面监听事件
			PdfReader reader = new PdfReader(orgPdfPath);
			// 获取 源文件总页数
			int num = reader.getNumberOfPages();
			System.out.println("总页数:" + num);
			// 页面数是从1开始的 
			for (int i = 1; i <= num; i++) {
				document.newPage();
				// 设置空页码进行展示
				writer.setPageEmpty(false);
				PdfImportedPage page = writer.getImportedPage(reader, i);
				// 复制好的页面,添加到内容去,触发事件监听
				pdfContent.addTemplate(page, 0, 0);
			}
			
			document.close();
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return outputPdfPath ;
	}
	

}

六、测试、效果

测试

package com.tianya.pdf;

import org.junit.jupiter.api.Test;

/**
 * @description
 *	测试类
 * @author TianwYam
 * @date 2019年12月28日下午9:11:47
 */
public class PdfUtilsTest {

	@Test
	public void testAddPdfPageNum() {
		
		String orgPdfPath = "E:\\javawork\\test.pdf" ;
		String outputPdfPath = "E:\\javawork\\out.pdf" ;
		PdfUtils.addPageNum(orgPdfPath, outputPdfPath);
	}
	
}

效果

Java实现PDF文件页码

刚开始写微信公众号,请多多关注,欢迎,多谢!
微信公众号:《Java学习积累》
微信公众号:Java学习积累

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯共明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值