Java实现对已有的PDF添加页码 加 总页码(二)

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


上一篇文章已经写了《Java实现对已有的PDF添加页码

有看过上一篇文章的读者,问如何添加总页码的问题,这次是对上一篇的文章的一个补充,加 总页码


1.思路

其实思路很简单,对PDF添加页码是采用新生成一个PDF文件,对源PDF文件一页一页的复制后触发页码监听器,我们可以在添加页码监听器时,传入源PDF文件的总页码



// 读取 源PDF文件,进行一页一页复制,才能触发 添加页码的  页面监听事件
PdfReader reader = new PdfReader(orgPdfPath);
// 获取 源文件总页数
int num = reader.getNumberOfPages();
System.out.println("总页数:" + num);

// 新建文档,默认A4大小
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, fos);

// 设置页面监听事件,必须在open方法前
// 设置有总页数的 页面监听事件
writer.setPageEvent(new PageNumAndTotalPdfPageEvent(num));
document.open();



2.带总页码的页码监听

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事件监听	
 *	<p>
 *	添加页码的同时,也添加总页数
 * @author TianwYam
 * @date 2021年06月06日上午11:51:08
 */
public class PageNumAndTotalPdfPageEvent extends PdfPageEventHelper{
	
	// 总页数
	private int totalPageNums ;
	
	public PageNumAndTotalPdfPageEvent() {
		super();
	}
	
	/**
	 * 传入总页码
	 * @param pageNums 总页码
	 */
	public PageNumAndTotalPdfPageEvent(int pageNums) {
		super();
		this.totalPageNums = pageNums ;
	}
	
	

	@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页 共%d页", writer.getPageNumber(), totalPageNums);
			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();
		}
		
//		super.onEndPage(writer, document);
	}
}




3.工具类实现






/**
 * @description
 *	给PDF文件添加页码及总页数
 * @author TianwYam
 * @date 2021年06月06日上午11:51:08
 * @param orgPdfPath 源PDF文件路径
 * @param outputPdfPath 加了页码的PDF文件路径
 * @return 返回添加了页码的PDF文件路径
 */
public static String addPageNumAndTotal(String orgPdfPath, String outputPdfPath) {
	
	try (
		// 输出文件 流
		FileOutputStream fos = new FileOutputStream(outputPdfPath) ;){
		
		// 读取 源PDF文件,进行一页一页复制,
		// 才能触发 添加页码的  页面监听事件
		PdfReader reader = new PdfReader(orgPdfPath);
		// 获取 源文件总页数
		int num = reader.getNumberOfPages();
		System.out.println("总页数:" + num);
		
		// 新建文档,默认A4大小
		Document document = new Document(PageSize.A4);
		PdfWriter writer = PdfWriter.getInstance(document, fos);
		
		// 设置页面监听事件,必须在open方法前
		// 设置有总页数的 页面监听事件
		writer.setPageEvent(new PageNumAndTotalPdfPageEvent(num));
		document.open();
		
		// PDF内容体
		PdfContentByte pdfContent = writer.getDirectContent();
		
		// 页面数是从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 ;
}




4.效果


在这里插入图片描述



欢迎关注,谢谢!


刚开始写微信公众号,请多多关注,欢迎,多谢!

微信公众号:《Java学习积累》
请关注一下,多谢!!!
微信公众号:Java学习积累

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天涯共明月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值