在 PDF 文档中添加页眉和页脚有助于保持一致的版式和专业的外观。页眉通常位于页面顶部,可显示文档标题、作者姓名或公司名称,而页脚位于页面底部,常用于添加页码、日期或法律声明。这些元素对于报告、合同和正式文件至关重要,不仅提升了可读性,还符合规范要求。本文将介绍如何使用Spire.PDF for Java,通过 Java 在现有的 PDF 文档中添加页眉和页脚,并提供详细的步骤和代码示例。
- Java 在现有 PDF 文档中添加页眉
- Java 在现有 PDF 文档中添加页脚
安装 Spire.PDF for Java
E-iceblue旗下spire系列产品是文档处理领域的优秀产品,支持国产信创。首先,您需要在 Java 程序中添加 Spire.Pdf.jar 文件作为依赖项。JAR 文件可以从此链接下载。如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而在应用程序中导入 JAR 文件。
<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>11.2.3</version>
</dependency>
</dependencies>
背景知识
在使用 Spire.PDF for Java 处理现有的 PDF 文档时,需要了解其坐标系的原点位于页面左上角,X 轴向右延伸,Y 轴向下延伸。向页面添加页眉是指在页面上方的空白区域内插入内容,如文本、图片、自动字段和形状等;而添加页脚实际上就是在页面底部的空白区域插入内容。

如果空白区域不足以容纳您要添加的内容,您可以考虑增大 PDF 页边距。
Java 在现有 PDF 文档中添加页眉
Spire.PDF for Java 帮助用户通过 PdfCanvas.drawString() 、PdfCanvas.drawImage() 和 PdfCanvas.drawLine() 等方法在 PDF 文档的页面上绘制文本、图像和形状。为了在页眉中添加页码、章节、日期等动态信息,您需要使用自动字段。Spire.PDF for Java 提供了 PdfPageNumberField 类、PdfSectionNumberField 类和 PdfCreationDateField 类等来实现这些数据的动态添加。
下面是使用 Spire.PDF for Java 向 PDF 文档添加包含文本、图像、日期和线条的页眉的详细步骤:
- 创建一个 PdfDocument 对象。
- 通过 PdfDocument.loadFromFile() 方法加载 PDF 文档。
- 创建字体、画笔和画刷对象,用于绘制文本或形状。
- 使用 PdfPageBase.getCanvas().drawString() 方法在页面上方的空白区域绘制文本。
- 利用 PdfPageBase.getCanvas().drawLine() 方法在页面上方的空白区域绘制一条线。
- 通过 PdfImage.fromFile() 方法加载图片。
- 使用 PdfPageBase.getCanvas().drawImage() 方法将图片绘制到页面上方的空白区域。
- 创建一个PdfCreationDateField 对象,用以反映文档的创建时间。
- 使用 PdfCreationDateField.draw() 方法将文档的创建时间绘制到页面上方的空白区域。
- 通过 PdfDocument.saveToFile() 方法将文档保存为新的 PDF 文件。
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.automaticfields.PdfCompositeField;
import com.spire.pdf.automaticfields.PdfCreationDateField;
import com.spire.pdf.graphics.*;
import java.awt.*;
public class AddHeaderToPdf {
public static void main(String[] args) {
// 创建一个 PdfDocument 对象
PdfDocument doc = new PdfDocument();
// 加载 PDF 文件
doc.loadFromFile("/示例.pdf");
// 加载添加到页眉的图像
PdfImage headerImage = PdfImage.fromFile("/Logo1.png");
// 获取图像的像素宽度
float width = headerImage.getWidth();
// 将像素转换为点
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
float pointWidth = unitCvtr.convertUnits(width, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point);
// 自定义页眉文本
String headerText = "冰蓝科技\nwww.e-iceblue.cn";
// 创建字体
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("DengXian", Font.BOLD, 12),true);
// 创建笔刷
PdfBrush brush = PdfBrushes.getPurple();
// 创建画笔
PdfPen pen = new PdfPen(brush, 1.0f);
// 创建文档创建日期字段
PdfCreationDateField creationDateField = new PdfCreationDateField(font, brush);
creationDateField.setDateFormatString("yyyy-MM-dd");
// 创建组合字段用以显示文本和日期
PdfCompositeField compositeField = new PdfCompositeField(font, brush, "创建时间: {0}", creationDateField);
compositeField.setLocation(new Point(55, 58));
// 遍历文档中的页面
for (int i = 0; i < doc.getPages().getCount(); i++)
{
// 获取当前页面
PdfPageBase page = doc.getPages().get(i);
// 将图像绘制到页面上方空白区域
page.getCanvas().drawImage(headerImage, page.getActualSize().getWidth() - pointWidth - 55, 20);
// 绘制文本
page.getCanvas().drawString(headerText, font, brush, 55, 33);
// 绘制线条
page.getCanvas().drawLine(pen, new Point(55, 73), new Point((int)page.getActualSize().getWidth() - 55, 70));
// 将组合字段绘制到页眉区域
compositeField.draw(page.getCanvas());
}
// 保存修改后的文档
doc.saveToFile("/添加页眉.pdf");
doc.dispose();
}
}

Java 在现有 PDF 文档中添加页脚
同样的,PdfCanvas.drawString() 、PdfCanvas.drawImage() 和 PdfCanvas.drawLine() 方法也可以用来在 PDF 文档中添加页脚。通过调整 X 轴和 Y 轴坐标,你可以在 PDF 页面上的任何位置绘制想要添加的信息。如果需要在页脚添加动态数据,如页码、章节号、日期等,可以使用由 Spire.PDF for Java 提供的 PdfPageNumberField 、PdfPageCountField 、PdfSectionNumberField 等类,以实现动态信息的自动添加。
以下是使用 Spire.PDF for Java 在 PDF 文档中添加包含图像和页码的页脚的具体流程:
- 创建一个 PdfDocument 对象。
- 通过 PdfDocument.loadFromFile() 方法加载一个 PDF 文档。
- 使用 PdfImage.fromFile() 方法加载图像。
- 利用 PdfPageBase.getCanvas().drawImage() 方法在页面底部的空白区域绘制图像。
- 创建 PdfPageNumberField 和 PdfPageCountField 对象,并将它们组合到 PdfCompositeField 对象中,以返回"第 {0} 页,共 {1} 页"格式的页码字符串。
- 使用 PdfCompositeField.draw() 方法在页面底部空白区域绘制页码。
- 使用 PdfDocument.saveToFile() 方法将文档保存为新的 PDF 文件。
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.PdfImage;
import com.spire.pdf.graphics.PdfTrueTypeFont;
import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
public class AddFooterToPdf {
public static void main(String[] args) {
// 创建一个 PdfDocument 对象
PdfDocument doc = new PdfDocument();
// 加载 PDF 文件
doc.loadFromFile("/示例.pdf");
// 加载一张图片
PdfImage footerImage = PdfImage.fromFile("/banner.png");
// 创建字体
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("DengXian", Font.BOLD, 12),true);
// 创建笔刷
PdfBrush brush = PdfBrushes.getWhite();
// 创建当前页码字段
PdfPageNumberField pageNumberField = new PdfPageNumberField();
// 创建总页数字段
PdfPageCountField pageCountField = new PdfPageCountField();
// 创建一个组合字段,将页码和页数字段组合为字符串
PdfCompositeField compositeField = new PdfCompositeField(font, brush, "第 {0} 页,共 {1} 页", pageNumberField, pageCountField);
// 获取字体大小
Dimension2D fontSize = font.measureString(compositeField.getText());
// 获取页面大小
Dimension2D pageSize = doc.getPages().get(0).getSize();
// 设置组合字段的位置
compositeField.setLocation(new Point2D.Double((pageSize.getWidth() - fontSize.getWidth())/2, pageSize.getHeight() - 45));
// 遍历文档中的页面
for (int i = 0; i < doc.getPages().getCount(); i++)
{
// 获取指定页面
PdfPageBase page = doc.getPages().get(i);
// 在页面底部空白区域绘制图片
page.getCanvas().drawImage(footerImage, 55, pageSize.getHeight() - 65, pageSize.getWidth() - 110, 50);
// 在页面底部空白区域绘制组合字段
compositeField.draw(page.getCanvas());
}
// 保存结果文档
doc.saveToFile("/添加页脚.pdf");
doc.dispose();
}
}
