一,com.itextpdf 页面设置监听事件,添加页码
1,引入包
<!--用于操作pdf Start--> <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>
2,添加页码
/** * * @param orgPdfPath 源pdf * @param outputPdfPath 目标pdf * @return */ 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); // 读取 源PDF文件,进行一页一页复制,才能触发 添加页码的 页面监听事件 PdfReader reader = new PdfReader(orgPdfPath); // 获取 源文件总页数 int num = reader.getNumberOfPages(); // 设置页面监听事件,必须在open方法前 writer.setPageEvent(new PageNumPdfPageEvent(num)); document.open(); // PDF内容体 PdfContentByte pdfContent = writer.getDirectContent(); //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) { log.info("添加页码报错", e); } return outputPdfPath; }
3,页面监听事件,继承PdfPageEventHelper
public class PageNumPdfPageEvent extends PdfPageEventHelper { // 总页数 private int totalPageNums; public PageNumPdfPageEvent() { super(); } /** * 传入总页码 * * @param pageNums 总页码 */ public PageNumPdfPageEvent(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 = 11 ; // 解决页码中文无法显示 或者 显示为乱码的问题 // 但是必须引入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()); 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(); } } }
二,spire.office.free 实现添加页码
1,引入包
<dependency> <groupId>fakepath</groupId> <artifactId>spire.office.free</artifactId> <version>3.1.1</version> </dependency>
2,添加页码
/** * pdf文档,添加页码 * @param orgPdfPath 源文件 * @param outputPdfPath 目标文件 * @return */ public static String addpageNum(String orgPdfPath, String outputPdfPath) { //创建 PdfDocument 类的对象 com.spire.pdf.PdfDocument pdf = new PdfDocument(); //载入PDF文档 pdf.loadFromFile(orgPdfPath); //创建 PdfTrueTypeFont 类的对象 PdfTrueTypeFont font = new PdfTrueTypeFont(new java.awt.Font("华文中宋", java.awt.Font.PLAIN, 10)); //创建 PdfPageNumberField 类的对象 PdfPageNumberField pageNumberField = new PdfPageNumberField(font, PdfBrushes.getBlack()); //创建 PdfPageCountField 类的对象 PdfPageCountField pageCountField = new PdfPageCountField(font, PdfBrushes.getBlack()); //创建一个 PdfCompositeField 类的对象,将页码字段和页数字段添加到复合字段 PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.getBlack(), "第{0}页/共{1}页", pageNumberField, pageCountField); //设置复合字段的文字格式 compositeField.setStringFormat(new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Top)); //循环遍历文档中的页面 for (int i = 0; i < pdf.getPages().getCount(); i++) { PdfPageBase page = pdf.getPages().get(i); float x = (float) page.getSize().getWidth() / 2 - 20; float y = (float) page.getSize().getHeight() - pdf.getPageSettings().getMargins().getBottom(); //将复合字段描绘于每个页面上 compositeField.draw(page.getCanvas(), x, y); } //保存结果文档 pdf.saveToFile(outputPdfPath); return outputPdfPath; }