Docx4j开发手册-8|Docx4j的目录

一、前言

本文将介绍,使用Docx4j自带的目录生成器进行目录生成。使用目录生成器生成时,存在以下几个问题,需特别注意

  1. 目录中的样式无法自定义,需要提前在Styles中配置好
  2. 目录生成时,页码需要依赖其他插件或服务(后面将讲解)
  3. 目录时不能自定义插入文字,需要生成StdBlock对象后,再在StdBlock中插入自定义的段落

二、引入页号相关依赖

1
2
3
4
5
6
<!-- docx4j目录页号生成所需依赖 -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>${docx4j.version}</version>
</dependency>

页号生成共有两种方式,

第一种是引用docx4j-export-fo将docx文件到为PDF,进行页号的计算

第二种是引用Documents4j(它利用 Microsoft Office 的本机 API,通过启动 Microsoft Office 进程来执行文档转换。),通过本地服务,来进行页号计算,这个方法

第二种方式查阅相关文章后发现,可能需要本地拥有Office才可以正常使用。

三、生成目录对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 生成目录对象
*
* @param wordmlPackage 文档
* @param docData 文档数据
* @return 目录对象
*/
private SdtBlock getToc(WordprocessingMLPackage wordmlPackage, DocData docData) {
SdtBlock sdtBlock;
try {
TocGenerator tocGenerator = new TocGenerator(wordmlPackage);
// 设置目录标题,此处填null,标题将不生产
Toc.setTocHeadingText("目录");
sdtBlock = tocGenerator.generateToc(0, TocHelper.DEFAULT_TOC_INSTRUCTION, false);
} catch (Exception e) {
throw new DocException("生成目录时发生异常", e);
}

return sdtBlock;
}

3.1 generateToc方法解析

1
generateToc(0, TocHelper.DEFAULT_TOC_INSTRUCTION, false);
  1. 参数1为插入的段落索引
  2. 数2为目录生成指令(参考OpenXml标准)
  3. 参数3为是否跳过页号生成,为false时,必须引入章节二中的依赖

此处注意,文档中已经存在目录后,不能使用generateToc方法需要使用updataToc方法