页码看起来只是 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 提供的 pdfpagenumberfield 和 pdfpagecountfield 可以分别获取当前页码和总页数,再通过 pdfcompositefield 将它们组合成 “第 x 页,共 y 页” 等格式。
在此基础上,只需遍历 pdf 页面并计算合适的坐标,就可以将页码统一添加到每一页的底部,也可以根据实际需求进一步调整页码格式、字体和位置。
以上就是java使用spire.pdf for java给pdf添加动态页码的详细内容,更多关于java pdf添加动态页码的资料请关注代码网其它相关文章!
发表评论