首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用iText在每个页面上添加总页数?

要在使用iText生成的PDF文档的每个页面上添加总页数,您可以使用PdfPageEventHelper类创建一个自定义页面事件处理程序,并重写onEndPage()方法

代码语言:javascript
复制
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import com.itextpdf.layout.renderer.DocumentRenderer;
import com.itextpdf.layout.renderer.IRenderer;

import java.io.FileOutputStream;
import java.io.IOException;

public class AddTotalPages {

    public static void main(String[] args) throws IOException {
        PdfWriter writer = new PdfWriter("output.pdf");
        PdfDocument pdfDocument = new PdfDocument(writer);
        Document document = new Document(pdfDocument);

        // 创建一个自定义页面事件处理程序
        CustomPageEventHandler pageEventHandler = new CustomPageEventHandler();
        pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, pageEventHandler);

        // 添加内容到文档
        for (int i = 0; i < 10; i++) {
            document.add(new Paragraph("This is page " + (i + 1)));
            document.add(new Paragraph("Total pages: "));
            document.add(new AreaBreak());
        }

        // 关闭文档
        document.close();
    }

    static class CustomPageEventHandler extends PdfPageEventHelper {

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            // 获取当前页面
            PdfPage page = writer.getPage(writer.getCurrentPageNumber());

            // 创建一个占位符,用于在页面上显示总页数
            PdfFormXObject placeholder = new PdfFormXObject(new Rectangle(50, 50, 100, 50));
            PdfCanvas canvas = new PdfCanvas(page);
            canvas.addXObject(placeholder, 300, 50);

            // 将占位符添加到文档的渲染器中,以便在文档关闭时更新总页数
            DocumentRenderer documentRenderer = (DocumentRenderer) document.getRenderer();
            IRenderer placeholderRenderer = placeholder.createRendererSubTree().setParent(documentRenderer);
            documentRenderer.addChild(placeholderRenderer);

            // 更新占位符的内容
            placeholderRenderer.setProperty(Property.TEXT_ALIGNMENT, TextAlignment.CENTER);
            placeholderRenderer.setProperty(Property.VERTICAL_ALIGNMENT, VerticalAlignment.MIDDLE);
            placeholderRenderer.setProperty(Property.FONT_SIZE, 12f);
            placeholderRenderer.setProperty(Property.FONT, PdfFontFactory.createFont());
            placeholderRenderer.setProperty(Property.TEXT_RENDERING_MODE, PdfCanvasConstants.TextRenderingMode.FILL);
            placeholderRenderer.setProperty(Property.FILL_COLOR, ColorConstants.BLACK);
        }
    }
}

在这个示例中,我们创建了一个名为CustomPageEventHandler的自定义页面事件处理程序,并重写了onEndPage()方法。在此方法中,我们创建了一个占位符,用于在页面上显示总页数。然后,我们将占位符添加到文档的渲染器中,以便在文档关闭时更新总页数。最后,我们更新占位符的内容,以便在每个页面上显示总页数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java(iText)工具包生成PDF

支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合 iText的更新变化很大,早期版本PDF样式上可能会有瑕疵,所有我使用的最新的5.5.6包 1.添加Maven依赖 itext...PdfPageEvent提供了几个pdf创建时的事件,页眉页脚就是每页加载完写入的。...每一加个页码还是很简单的,但是总页码就麻烦了,iText是流模式的写入内容,只有写到最后,才能知道有多少,那么显示总页数就麻烦了,不过麻烦不代表不可能。...所以我们可以最后关闭文档前,使用PdfTemplate写入总页码。可以理解成先写个占位符,然后统一替换。...暂没有找到如何html中支持自定义字体方法,网上都是修改源码实现默认字体中文,也很重要 StringBuilder html = new StringBuilder();

9.8K22

五分钟实现pdf分页

事情起源于前几天需要把个人资料的pdf文档一的拆出来,好传到相关的网站上。直接截图到word再转pdf比较麻烦,所以想用工具直接转换。结果找了几个pdf阅读器,这类操作都需要会员或收费。...iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,程序中就可以使用iText类库了。...例如起始页码1,截止页码3,则生成一个新文件,存储原pdf文档的1-3。...PdfCopy copy = null; try { PdfReader reader = new PdfReader(filePath); //查询pdf文档页数...: 读取pdf文件内容 使用pdfbox的pdfparser,代码如下: /** * 读取pdf文档指定页数的文本内容 * @param fileName 文件路径及文件名 * @

1.8K20

iText5实现Java生成PDF文件完整版

最近项目中使用到Java实现导出PDF文件,经过一番参考研究最终决定使用itextpdf来实现,当然也可以参考 PDF Java类库:Spire.PDF for Java(https://www.e-iceblue.cn...本文是使用第一种来实现的。 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。...PdfPageEvent提供了几个pdf创建时的事件,页眉页脚就是每页加载完写入的。...每一加个页码还是很简单的,但是总页码就麻烦了,iText是流模式的写入内容,只有写到最后,才能知道有多少,那么显示总页数就麻烦了,不过麻烦不代表不可能。...所以我们可以最后关闭文档前,使用PdfTemplate写入总页码。可以理解成先写个占位符,然后统一替换。

5.1K10

itext7史上最全实战总结

,上一剩下的就留白了 可以看到Div,Paragraph可以设置很多属性,实际上我们常用的组件除了这两种,还有Table,Cell,List,他们大部分的属性都是一样的,只是部分属性只部分组件起效果...Tab,\t itext7中如果要表示段落前的空格,不能使用\t,但换行可以使用\n 若要实现Tab效果可以有多个方法 \u00a0符号,大概7、8个该符号可表示tab,可能不是很准确 p1...第二 ? 这种需求我们如何实现呢?思路分析发现,我们需要知道什么时候文章内容一写不起了,换了一的时候我们需要添加一个同样的页眉。...如上需求我们需要监听START_PAGE事件,事件处理中做相应的处理,我事件中使用PdfCanvas画了头部内容 HeaderTextEvent headerTextEvent = new HeaderTextEvent...目录有几页不知道,如何知道内容第几页?

6.5K31

如何实现高性能的在线 PDF 预览

重新整理一下产品的需求: 页面上查看服务器上的 pdf 文件 支持页码跳转、旋转、缩放 打开要快 基本上前两条上述方案都能满足,所以我们需要解决的关键问题在于如何让用户快速打开内容,减少等待时间。...至此,我们需要解决的关键问题变成两个: 如何下载 PDF 分片 如何渲染 PDF 分片 知识准备 - PDF.js 接口介绍 由于我们无法已有标签上做修改,所以我们考虑基于 PDF.js 库进行深度定制...* 总页数)。...实际使用场景中,我们也遇到了一些坑。上述方案进行页面渲染时,会预先初始化整个容器( contentView)的大小。...可以服务器上提前计算好每一的页面大小,返回给前端。前端渲染指定时,根据服务器返回的数据进行来计算页面位置。但是这样需要在前端做大量的计算。渲染性能上会受到一些影响。

6.3K53

教你两招,轻松搞定html页面导出为pdf文件

需求场景 招投标软件中,每个标段结束评标之后,都会生成评标报告 评标报告主要包含项目信息,标段信息,投标人信息,投标人报价,评标专家打分等情况,相对来说信息量还是比较大,假如我们要导出评标报告该如何做...即方便实现,又避免了由于页面的变动而需要改动导出功能代码的尴尬 方案调研 查阅了一些资料,目前市面上流行的解决方案主要有以下几种 wkhtmltopdf iText html2canvas+jsPDF...也可能是我的使用方式不当。欢迎小伙伴指正。而且itext7更多用于需要去维护PDF模板的场景,并不适合我本次的需求。所以我最终使用html2canvas+jsPDF的方式来实现。...wkhtmltopdf 接下来我们来看看wkhtmltopdf这种方式如何实现? 如果我们要使用wkhtmltopdf,需要安装官方提供的软件,大家可以在他的官网进行下载。...wkhtmltopdf.exe"; private static final String LINUX_URL = "/opt/wkhtmltox/bin/wkhtmltopdf"; 下面我们看一看如何使用

3.1K30

我的Web开发实战总结(二)

写在前面 这篇是继我的Web开发实战总结(一)的第二篇文章,在此篇里,我主要总结一下如何把Web页面上的报表或列表数据转换成pdf文件下载到本地。其中涉及到的知识我也会提出来供大家交流学习。...Web页面上的列表数据 上图就是Web页面上的列表数据,将其右侧生成pdf之后的效果如下: ?...所以我建议大家使用第二种利用iText将HTML 转为 PDF,我也是用的第二种思路实现的。...注意:如果使用不存在的freemarker指令,FreeMarker不会使用模板输出,而是产生一个错误消息。...其次,写ftl模板的时候,因为xmlworker支持的CSS样式极少,所以模板内容要尽量简单。对于DOCTYPE和html标签的约束比较严格。

1.7K10

iText 制作PDF

前言 由于MVC项目中需要使用PDF,所以自己抽空也来看看itext,以便于丰富自己的知识吧。在此也简单的记录一下,说不定以后可能还用的到。...打开document前要做的事: 你只能在Open方法调用之前添加摘要,这是iText开发工具提供的一个选择。...页面初始化   Open方法不同的Witer中同时会产生初始化事件,举例来说,如果你需要一个水印或者页眉角对象出现在文档第一的开始处,你需要在打开文档前添加这些,同样的用于设置该文档其他水印、页眉...、角、页数和尺寸。...PdfWriter.CenterWindow – 是否将文档窗口放到屏幕中央     全屏模式下,指定如何显示界面元素(选择一个)       o PdfWriter.NonFullScreenPageModeUseNone

2.2K20

AI文档智能助理都是如何处理pdf的?

一、前言 AI盛行的当下,基于文档的本地知识库智能问答系统已经成为当下最受AI从业者欢迎的落地方式。本文旨在收集整理当下AI应用中使用较多的处理pdf的库和开源项目,喜欢的请点赞、收藏。...地址:https://pdfminersix.readthedocs.io 2. pdfplumber pdfplumber库既可以按处理 pdf ,也可以获取页面文字以及进行提取表格等操作。...PDF(Portable Document Format)是一种可移植的文档格式,可以各种设备和操作系统上查看和打印。iText for Java可以提高工作流程的效率。...其中使用的技术术语包括SDK、PDF、文档引擎和编程能力。 iText 5官网[2],已停止维护。iText5仓库地址[3] iText 7官网[4] 。...命令行工具是一种计算机上通过命令行界面执行操作的工具。•docx2pdf[25] 这段文本介绍了如何使用Microsoft Word直接在Windows或macOS上将docx文件转换为pdf格式。

76520

微信小程序之上拉加载与下拉刷新

,页面上呈现出了你朋友新鲜出炉的自拍照或鸡汤文。...上拉加载 前面我们已经了解到下拉加载的本质是一个分页加载,每次触发加载下一的条件是当前页面到达底部,因此,我们可以整理出一个实现的基本思路: 初始页号为1,向后端请求第一页数据(数据中包含数据总条数...,及当前的数据数组),返回后渲染该该页数据 监听页面是否被滚动到底部,是的话,则递增页号(+1)并向后端请求该新页号的数据,返回结果后,将该页数据添加到之前已加载的数据后面,并重新渲染 重复步骤2的操作...感觉实现起来也不难,主要就是其中的“监听页面是否被滚动到底部”如何来实现?...Web页面开发中,我们会通过监听window.onscroll事件,该事件的处理方法中获取当前的高度和滚动量,以此来计算判断页面是否已滚动到底。

4.2K20

【Redis】利用Redis List实现数据库分页快速查询

本文将介绍如何利用Redis List来提升数据库分页查询的性能,以及具体的实现步骤和注意事项。 一、背景介绍: 数据库分页查询是大量数据中提取出部分数据显示面上的常见操作。...这种特性使得List非常适合用来存储分页数据,同时提供了快速访问第一和最后一的能力。...三、利用Redis List实现分页查询: 数据存储结构设计: Redis中,我们可以使用一个List来存储整个数据集,每个元素表示数据库中的一条记录。...分页查询算法: 客户端请求分页数据。 通过有序集合快速获取分页的记录ID范围。 使用List的命令获取相应ID范围的记录。 将查询结果返回给客户端。...合理设计存储结构,结合有序集合和List命令,可以实现快速定位和获取分页数据,有效降低查询复杂度。实际应用中,根据数据量和查询频率的不同,可以灵活调整存储结构和算法,以达到最优的性能。

75910

【JavaWeb基础】客户关系管理系统(修订版)

注意:显示页面上,一定要把id传递过去给处理表单的Servlet,不然服务器是不知道你要修改哪一条数据的! 效果: ?...如果记录数有很多,我们应该使用分页技术,一般地,我们使用Page类来封装分页的数据 要使用分页技术,就必须在数据库用查询总记录数,通过总记录数,就可以算出总页数了【每页显示多少条记录由我们说了算】 dao...,那么就设置为1)【更新,我认为Controller判断会好一点】 分页中,我们还支持上一和下一的功能,如果页数大于1,才显示上一,如果页数小于1,才显示下一。...给出下拉框进行页数跳转,使用JavaScript事件机制,获取页数,再提交给Servlet处理即可 我们还要控制页数的显示,因为不可能有100,我们就显示100,这样是不可能的。...Page类中维护两个变量,startPage,endPage。我们规定每次只能显示10页数据,如果第一次访问就显示1-10。如果当前页数大于10,那么就显示6-15

3.1K20

Thinkphp5 分页带参数(亲测)

Thinkphp5 做数据搜索需要带关键词分页,如何将查询条件带入到分页中,本文详细介绍Thinkphp5 分页带参数 一、基本使用方法: $list = Db::name(‘user’)->where...(‘status’,1)->paginate(10); 二、查看thinkphp5 paginate()函数 paginate()函数可以带三个参数: $listRows  每页数量 数组表示配置参数...simple   是否简洁模式或者总记录数 如果为true,那么分页的就是只有上一和下一config   配置参数 具体可以自己传入或者配置文件中配置 $config 参数配置 参数 描述 list_rows...每页数量 page 当前 path url路径 query url额外参数 fragment url锚点 var_page 分页变量 type 分页类名 三、解决方案: $list = Db::name...); 页面上分页调用示例 {$list|raw} 备注:tp5默认会把参数再次带到链接上,这样每次都能接收到参数,下次请求数据又会把参数带上,也会带到分页链接上去。

2.1K10

猿设计13——真电商之颠覆你对价格的理解

从这个层面上来讲,似乎价格确实是由促销系统来决定。 但是,在下这个结论之前,我们来先考虑以下几个事情。用户的哪些行为会和价格发生关系?嗯,商品详情。已经说过了,用户需要看到。...我们可以看一下,商品详情需要修改,结算需要修改,购物车需要修改,订单需要修改……而这些修改将带来大量的资源成本和时间成本。...从程序的精度和实时性的要求上来讲,订单价格计算和结算价格计算对价格的要求更高,而详情和购物车,相对低一些,设计时可以分开考虑。 ?...嗯,好嘛,2块钱的优惠,每个sku优惠了0.6666元,那四舍五入,每个3.34元,这样一来,总价就是10.02元了,说好的十块钱呢,奸商吗?...先用除法快速计算出平均优惠数(小数点后两位四舍五入),然后根据sku种类累加优惠总数,如果累加总数等于优惠总数,那么每个sku的价格为sku原价-平均优惠数,如果累加总数等于优惠总数,则需要随机一个sku

1.1K10
领券