介绍

在 PDF 文档格式中,页面标签可直观地识别每个文档页面,例如在 PDF 阅读器应用程序的缩略图面板上显示文本标签。在本 Java 教程中,我们将学习如何使用 Apache PDFBox 库通过 Java 应用程序为 PDF 文档创建页面标签。

Apache PDFBox 库概述

Apache PDFBox 是一个用于处理 PDF 文档的开源 Java 库。您可以在pdfbox.apache.org获得有关该项目的更多信息

添加 Apache PDFBox 依赖项

如果您使用 Gradle 构建工具,请将以下依赖项添加到 build.gradle 文件中。


compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.18'


如果您使用的是 Maven 构建工具,请将以下 XML 添加到 pom.xml 文件中。


<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.18</version>
</dependency>


或者您可以从pdfbox.apache.org/download.cgi下载 pdfbox-2.0.18.jar 文件

第 1 步 - 创建一个空 PDF 文档并添加 5 个空白页


try (PDDocument document = new PDDocument())
{
    for(int i = 0; i < 5; i++) {
        document.addPage(new PDPage());
    }

} catch (IOException e) {
    e.printStackTrace();
}


第 2 步 - 为文档添加页面标签


PDPageLabels pageLabels = new PDPageLabels(document);
PDPageLabelRange pageLabelRange = new PDPageLabelRange();
pageLabelRange.setStyle(PDPageLabelRange.STYLE_ROMAN_UPPER);
pageLabelRange.setPrefix("Chapter ");
pageLabelRange.setStart(1);
pageLabels.setLabelItem(0, pageLabelRange);
document.getDocumentCatalog().setPageLabels(pageLabels);


第 3 步 - 将 PDF 文档文件保存到磁盘


document.save("D:\\SimpleSolution\\DocumentPageLabelsRomanUpper.pdf");


完整的 Java 应用程序代码


package dev.simplesolution;

import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDPageLabelRange;
import org.apache.pdfbox.pdmodel.common.PDPageLabels;

public class CreatePageLabelsRomanUpper {
	
	public static void main(String[] args)
    {
        try (PDDocument document = new PDDocument())
        {
        	for(int i = 0; i < 5; i++) {
        		document.addPage(new PDPage());
        	}
            
            PDPageLabels pageLabels = new PDPageLabels(document);
            PDPageLabelRange pageLabelRange = new PDPageLabelRange();
            pageLabelRange.setStyle(PDPageLabelRange.STYLE_ROMAN_UPPER);
            pageLabelRange.setPrefix("Chapter ");
            pageLabelRange.setStart(1);
            pageLabels.setLabelItem(0, pageLabelRange);
            document.getDocumentCatalog().setPageLabels(pageLabels);
            
            document.save("D:\\SimpleSolution\\DocumentPageLabelsRomanUpper.pdf");
        } catch (IOException e) {
			e.printStackTrace();
		}
    }

}


执行上面的 Java 代码,我们将在 D:\SimpleSolution\DocumentPageLabelsRomanUpper.pdf 创建 PDF 文件

在 PDF 阅读器应用程序上打开 DocumentPageLabelsRomanUpper.pdf 文件并显示缩略图窗口,您可以看到如下页面标签。

java pdfbox pdf模板使用宋体 java pdf框架_java

页面标签样式

Apache PDFBox 库支持 5 种不同的页面标签样式

  • 大写罗马数字 I, II, III,…
  • 小写罗马数字 i, ii, iii,…
  • 大写字母 AZ
  • 小写字母 az
  • 十进制数 1,2,3,…

更新我们使用的页面标签样式


pageLabelRange.setStyle(PDPageLabelRange.STYLE_ROMAN_UPPER);


小写罗马页面标签样式示例


package dev.simplesolution;

import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDPageLabelRange;
import org.apache.pdfbox.pdmodel.common.PDPageLabels;

public class CreatePageLabelsRomanLower {
	
	public static void main(String[] args)
    {
        try (PDDocument document = new PDDocument())
        {
        	for(int i = 0; i < 5; i++) {
        		document.addPage(new PDPage());
        	}
            
            PDPageLabels pageLabels = new PDPageLabels(document);
            PDPageLabelRange pageLabelRange = new PDPageLabelRange();
            pageLabelRange.setStyle(PDPageLabelRange.STYLE_ROMAN_LOWER);
            pageLabelRange.setPrefix("Section ");
            pageLabelRange.setStart(1);
            pageLabels.setLabelItem(0, pageLabelRange);
            document.getDocumentCatalog().setPageLabels(pageLabels);
            
            document.save("D:\\SimpleSolution\\DocumentPageLabelsRomanLower.pdf");
        } catch (IOException e) {
			e.printStackTrace();
		}
    }

}


执行上面的应用程序可以看到如下的页面标签。

java pdfbox pdf模板使用宋体 java pdf框架_java_02

大写字母页面标签样式示例


package dev.simplesolution;

import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDPageLabelRange;
import org.apache.pdfbox.pdmodel.common.PDPageLabels;

public class CreatePageLabelsLettersUpper {
	
	public static void main(String[] args)
    {
        try (PDDocument document = new PDDocument())
        {
        	for(int i = 0; i < 5; i++) {
        		document.addPage(new PDPage());
        	}
            
            PDPageLabels pageLabels = new PDPageLabels(document);
            PDPageLabelRange pageLabelRange = new PDPageLabelRange();
            pageLabelRange.setStyle(PDPageLabelRange.STYLE_LETTERS_UPPER);
            pageLabelRange.setPrefix("Part ");
            pageLabelRange.setStart(1);
            pageLabels.setLabelItem(0, pageLabelRange);
            document.getDocumentCatalog().setPageLabels(pageLabels);
            
            document.save("D:\\SimpleSolution\\DocumentPageLabelsLettersUpper.pdf");
        } catch (IOException e) {
			e.printStackTrace();
		}
    }

}


执行上面的应用程序可以看到如下的页面标签。

java pdfbox pdf模板使用宋体 java pdf框架_应用程序_03

小写字母页面标签样式示例


package dev.simplesolution;

import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDPageLabelRange;
import org.apache.pdfbox.pdmodel.common.PDPageLabels;

public class CreatePageLabelsLettersLower {
	
	public static void main(String[] args)
    {
        try (PDDocument document = new PDDocument())
        {
        	for(int i = 0; i < 5; i++) {
        		document.addPage(new PDPage());
        	}
            
            PDPageLabels pageLabels = new PDPageLabels(document);
            PDPageLabelRange pageLabelRange = new PDPageLabelRange();
            pageLabelRange.setStyle(PDPageLabelRange.STYLE_LETTERS_LOWER);
            pageLabelRange.setPrefix("Item ");
            pageLabelRange.setStart(1);
            pageLabels.setLabelItem(0, pageLabelRange);
            document.getDocumentCatalog().setPageLabels(pageLabels);
            
            document.save("D:\\SimpleSolution\\DocumentPageLabelsLettersLower.pdf");
        } catch (IOException e) {
			e.printStackTrace();
		}
    }

}


执行上面的应用程序可以看到如下的页面标签。

java pdfbox pdf模板使用宋体 java pdf框架_标签样式_04

十进制页面标签样式示例


package dev.simplesolution;

import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDPageLabelRange;
import org.apache.pdfbox.pdmodel.common.PDPageLabels;

public class CreatePageLabelsDecimal {
	
	public static void main(String[] args)
    {
        try (PDDocument document = new PDDocument())
        {
        	for(int i = 0; i < 5; i++) {
        		document.addPage(new PDPage());
        	}
            
            PDPageLabels pageLabels = new PDPageLabels(document);
            PDPageLabelRange pageLabelRange = new PDPageLabelRange();
            pageLabelRange.setStyle(PDPageLabelRange.STYLE_DECIMAL);
            pageLabelRange.setPrefix("Page ");
            pageLabelRange.setStart(1);
            pageLabels.setLabelItem(0, pageLabelRange);
            document.getDocumentCatalog().setPageLabels(pageLabels);
            
            document.save("D:\\SimpleSolution\\DocumentPageLabelsDecimal.pdf");
        }catch (IOException e) {
			e.printStackTrace();
		}
    }

}


执行上面的应用程序可以看到如下的页面标签。

java pdfbox pdf模板使用宋体 java pdf框架_标签样式_05

为 PDF 文档设置不同的页面标签样式

下面的示例 Java 应用程序展示了如何为一个 PDF 文档中的不同页面设置不同的页面标签样式。


package dev.simplesolution;

import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDPageLabelRange;
import org.apache.pdfbox.pdmodel.common.PDPageLabels;

public class CreatePageLabels {
	
	public static void main(String[] args)
    {
        try (PDDocument document = new PDDocument())
        {
        	for(int i = 0; i < 10; i++) {
        		document.addPage(new PDPage());
        	}
            
            PDPageLabels pageLabels = new PDPageLabels(document);
            PDPageLabelRange pageLabelRangeRoman = new PDPageLabelRange();
            pageLabelRangeRoman.setStyle(PDPageLabelRange.STYLE_ROMAN_UPPER);
            pageLabelRangeRoman.setPrefix("Chapter ");
            pageLabelRangeRoman.setStart(1);
            pageLabels.setLabelItem(0, pageLabelRangeRoman);
            
            PDPageLabelRange pageLabelRangeLetters = new PDPageLabelRange();
            pageLabelRangeLetters.setStyle(PDPageLabelRange.STYLE_LETTERS_UPPER);
            pageLabelRangeLetters.setPrefix("Part ");
            pageLabelRangeLetters.setStart(1);
            pageLabels.setLabelItem(2, pageLabelRangeLetters);
            
            
            PDPageLabelRange pageLabelRangeDecimal = new PDPageLabelRange();
            pageLabelRangeDecimal.setStyle(PDPageLabelRange.STYLE_DECIMAL);
            pageLabelRangeDecimal.setPrefix("Page ");
            pageLabelRangeDecimal.setStart(1);
            pageLabels.setLabelItem(5, pageLabelRangeDecimal);
            
            document.getDocumentCatalog().setPageLabels(pageLabels);
            
            document.save("D:\\SimpleSolution\\DocumentPageLabels.pdf");
        }catch (IOException e) {
			e.printStackTrace();
		}
    }

}


执行上面的应用程序可以看到如下的页面标签。

java pdfbox pdf模板使用宋体 java pdf框架_java_06

下载源代码

本文中的源代码可以在以下位置找到:github.com/simplesolutiondev/ApachePDFBoxPageLabels

或下载:

下载源代码

快乐编码😊