当前位置: 代码网 > it编程>编程语言>Java > Java使用Spire.PDF for Java给PDF添加动态页码

Java使用Spire.PDF for Java给PDF添加动态页码

2026年08月17日 Java 我要评论
页码看起来只是 pdf 中一个很小的元素,但对于报告、合同、说明书等多页文档来说非常实用。尤其是在打印、审阅或引用文档内容时,清晰的页码可以帮助读者快速定位页面。如果 pdf 是由 java 程序批量

页码看起来只是 pdf 中一个很小的元素,但对于报告、合同、说明书等多页文档来说非常实用。尤其是在打印、审阅或引用文档内容时,清晰的页码可以帮助读者快速定位页面。

如果 pdf 是由 java 程序批量生成或处理的,逐个手动添加页码显然并不现实。这种情况下,可以直接在程序中遍历 pdf 页面,并将当前页码和总页数自动添加到每一页。

本文将介绍如何使用 spire.pdf for java 为已有 pdf 添加类似 “第 1 页,共 10 页” 的动态页码。

安装 spire.pdf for java

如果使用 maven,可以在项目的 pom.xml 文件中添加以下仓库和依赖:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupid>e-iceblue</groupid>
        <artifactid>spire.pdf</artifactid>
        <version>12.8.1</version>
    </dependency>
</dependencies>

java 给 pdf 添加“第 x 页,共 y 页”页码

spire.pdf for java 提供了几个用于处理动态页码的字段:

  • pdfpagenumberfield:获取当前页的页码
  • pdfpagecountfield:获取 pdf 的总页数
  • pdfcompositefield:将多个动态字段组合成一段文本

因此,我们不需要自己为每一页生成不同的页码文本,而是可以将当前页码和总页数组合成 “第 {0} 页,共 {1} 页” 的格式。
下面是完整代码:

import com.spire.pdf.pdfdocument;
import com.spire.pdf.pdfpagebase;
import com.spire.pdf.automaticfields.pdfcompositefield;
import com.spire.pdf.automaticfields.pdfpagecountfield;
import com.spire.pdf.automaticfields.pdfpagenumberfield;
import com.spire.pdf.graphics.pdfbrush;
import com.spire.pdf.graphics.pdfbrushes;
import com.spire.pdf.graphics.pdftruetypefont;

import java.awt.font;
import java.awt.geom.dimension2d;
import java.awt.geom.point2d;

public class addpagenumbers {

    public static void main(string[] args) {

        // 加载 pdf 文档
        pdfdocument document = new pdfdocument();
        document.loadfromfile("示例文档.pdf");

        // 设置页码字体和颜色
        pdftruetypefont font = new pdftruetypefont(
                new font("microsoft yahei", font.plain, 10), true);
        pdfbrush brush = pdfbrushes.getblack();

        // 创建当前页码字段和总页数字段
        pdfpagenumberfield pagenumberfield = new pdfpagenumberfield();
        pdfpagecountfield pagecountfield = new pdfpagecountfield();

        // 将两个字段组合成“第 x 页,共 y 页”
        pdfcompositefield pagenumber = new pdfcompositefield(
                font,
                brush,
                "第 {0} 页,共 {1} 页",
                pagenumberfield,
                pagecountfield
        );

        // 遍历 pdf 中的所有页面
        for (int i = 0; i < document.getpages().getcount(); i++) {

            pdfpagebase page = document.getpages().get(i);
            dimension2d pagesize = page.getsize();

            // 测量页码文本宽度,用于计算居中位置
            string text = "第 " + (i + 1) + " 页,共 "
                    + document.getpages().getcount() + " 页";
            dimension2d textsize = font.measurestring(text);

            // 计算页码位置
            double x = (pagesize.getwidth() - textsize.getwidth()) / 2;
            double y = pagesize.getheight() - 30;

            // 在当前页面底部绘制页码
            pagenumber.setlocation(new point2d.double(x, y));
            pagenumber.draw(page.getcanvas(), 0, 0);
        }

        // 保存结果文档
        document.savetofile("添加页码后的pdf.pdf");
        document.dispose();
    }
}

完整实现步骤

下面分步骤看一下这段代码的实现过程。

第一步:加载 pdf 文档

首先创建 pdfdocument 对象,并加载需要添加页码的 pdf:

pdfdocument document = new pdfdocument();
document.loadfromfile("示例文档.pdf");

这里处理的是已有 pdf。如果 pdf 本身也是由程序生成的,同样可以在文档最终保存之前执行后面的页码添加操作。

第二步:设置页码的字体和颜色

接下来设置页码使用的字体和颜色:

pdftruetypefont font = new pdftruetypefont(
        new font("microsoft yahei", font.plain, 10), true);

pdfbrush brush = pdfbrushes.getblack();

这里使用 10 磅微软雅黑和黑色文字。

实际使用时,可以根据 pdf 的整体排版调整字体、字号和颜色。例如正式报告中的页码通常不需要太大,9~11 磅一般就足够了。

如果程序部署在 linux 或服务器环境中,还需要注意系统是否安装了代码中指定的字体。

第三步:创建动态页码

页码的核心部分是下面三个字段:

pdfpagenumberfield pagenumberfield = new pdfpagenumberfield();
pdfpagecountfield pagecountfield = new pdfpagecountfield();

其中:

pdfpagenumberfield 表示当前页面的页码,而 pdfpagecountfield 表示整个 pdf 的总页数。

然后通过 pdfcompositefield 将两个字段组合起来:

pdfcompositefield pagenumber = new pdfcompositefield(
        font,
        brush,
        "第 {0} 页,共 {1} 页",
        pagenumberfield,
        pagecountfield
);

其中 {0} 对应当前页码,{1} 对应总页数。

假设 pdf 一共有 8 页,最终得到的页码就是:

第 1 页,共 8 页
第 2 页,共 8 页
第 3 页,共 8 页
...
第 8 页,共 8 页

这种方式的好处是无需提前知道 pdf 到底有多少页,页码和总页数会根据实际文档自动生成。s

第四步:将页码添加到每一页

接下来遍历 pdf 中的所有页面:

for (int i = 0; i < document.getpages().getcount(); i++) {

    pdfpagebase page = document.getpages().get(i);
    dimension2d pagesize = page.getsize();

    // ...
}

这里没有直接假设所有页面尺寸完全相同,而是分别读取每一页的大小。

这样对于同时包含 a4 页面、横向页面或其他尺寸页面的 pdf,也可以根据当前页面重新计算页码位置。

第五步:让页码在页面底部居中

如果直接写死 x 坐标,页码可能无法真正居中。因此可以先计算实际显示文本的宽度:

string text = "第 " + (i + 1) + " 页,共 "
        + document.getpages().getcount() + " 页";

dimension2d textsize = font.measurestring(text);

然后根据页面宽度计算 x 坐标:

double x = (pagesize.getwidth() - textsize.getwidth()) / 2;
double y = pagesize.getheight() - 30;

其中:

  • x 用于让页码水平居中
  • y 用于控制页码距离页面底部的位置

最后将组合字段绘制到页面:

pagenumber.setlocation(new point2d.double(x, y));
pagenumber.draw(page.getcanvas(), 0, 0);

spire.pdf 支持通过页面 canvas 在指定坐标绘制内容,因此除了居中页码,也可以通过调整 x、y 坐标将页码放到左下角或右下角。

修改页码格式

如果不需要显示总页数,可以将页码格式改成:

"第 {0} 页"

得到:

第 1 页
第 2 页
第 3 页

也可以使用更加简洁的格式:

"{0} / {1}"

结果类似:

1 / 10

如果文档页脚中还需要显示报告名称,也可以直接加入固定文本:

"项目报告 | 第 {0} 页,共 {1} 页"

这样无需改变其他页码处理逻辑。

注意 pdf 底部是否有足够空间

给已有 pdf 添加页码时,有一点需要特别注意:添加页码并不会自动为原有内容腾出页脚空间。

例如,原 pdf 中的表格、正文或签名区域已经延伸到页面底部,此时直接添加页码可能与原有内容重叠。

遇到这种情况,可以适当调整:

double y = pagesize.getheight() - 30;

中的 y 坐标,将页码移动到合适的位置。

如果 pdf 本身也是由程序生成的,更合适的做法是在生成页面内容时提前预留页脚区域。

总结

在批量生成报告、合同或其他多页 pdf 时,通过 java 自动添加页码可以省去大量重复操作。

spire.pdf for java 提供的 pdfpagenumberfieldpdfpagecountfield 可以分别获取当前页码和总页数,再通过 pdfcompositefield 将它们组合成 “第 x 页,共 y 页” 等格式。

在此基础上,只需遍历 pdf 页面并计算合适的坐标,就可以将页码统一添加到每一页的底部,也可以根据实际需求进一步调整页码格式、字体和位置。

以上就是java使用spire.pdf for java给pdf添加动态页码的详细内容,更多关于java pdf添加动态页码的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com