Java 操作 Word 脚注和尾注:添加、读取与删除

在编写研究报告、技术文档或论文时,有些内容需要补充说明,但直接放在正文中又会影响阅读。例如,某个专业术语的解释、数据来源,或者参考文献的出处。

Word 提供了脚注(Footnote)和尾注(Endnote)来处理这类信息。脚注通常显示在当前页面底部,尾注则集中放在文档或节的末尾。

如果需要通过 Java 生成文档,或者处理已有 Word 文件中的注释,也可以直接操作脚注和尾注对象。

本文介绍如何使用 Java 在 Word 中添加脚注和尾注、读取已有注释,以及删除不再需要的脚注。

一、添加 Maven 依赖

首先,在 Java 项目的 ​​pom.xml​​ 文件中添加以下 Maven 仓库和依赖:

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.doc</artifactId>
        <version>14.10.6</version>
    </dependency>
</dependencies>

下面以一份名为 ​​report.docx​​ 的 Word 文档为例,演示不同的操作。每个示例都是独立的 Java 程序,所需输入文件会在对应章节中说明。

二、在 Word 指定文字后添加脚注

假设报告中有这样一句话:

本报告的碳排放核算参考了相关国际标准。

现在希望在"碳排放核算"后面添加脚注,说明采用的计算方法和参考依据。

可以先使用 ​​Document.findString()​​ 查找指定文字,再通过 ​​Paragraph.appendFootnote()​​ 创建脚注,并将其插入匹配文字之后。

完整代码如下:

java 复制代码
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.*;

public class AddWordFootnote {

    public static void main(String[] args) {

        Document document = new Document();

        try {
            // 加载 Word 文档
            document.loadFromFile("report.docx");

            // 查找需要添加脚注的文字
            TextSelection selection =
                    document.findString(
                            "碳排放核算", false, false);

            if (selection == null) {
                throw new IllegalArgumentException(
                        "未找到指定文字:碳排放核算");
            }

            // 获取匹配文字所在的段落和位置
            TextRange textRange = selection.getAsOneRange();
            Paragraph paragraph = textRange.getOwnerParagraph();

            int index = paragraph.getChildObjects()
                    .indexOf(textRange);

            // 创建脚注
            Footnote footnote =
                    paragraph.appendFootnote(
                            FootnoteType.Footnote);

            // 将脚注标记插入指定文字之后
            paragraph.getChildObjects()
                    .insert(index + 1, footnote);

            // 设置脚注内容
            TextRange noteText = footnote.getTextBody()
                    .addParagraph()
                    .appendText(
                            "碳排放核算依据相关排放因子和活动数据计算,"
                            + "具体方法以报告采用的核算标准为准。");

            // 设置脚注文字格式
            noteText.getCharacterFormat()
                    .setFontName("宋体");

            noteText.getCharacterFormat()
                    .setFontSize(10);

            // 设置脚注引用标记的字体
            footnote.getMarkerCharacterFormat()
                    .setFontName("Calibri");

            // 保存文档
            document.saveToFile(
                    "report-with-footnote.docx",
                    FileFormat.Docx_2013);

        } finally {
            document.dispose();
        }
    }
}

运行后,程序会生成 ​​report-with-footnote.docx​​。原文中的"碳排放核算"后面会出现脚注引用标记,对应的说明文字显示在页面底部。

这里有几个关键操作。

​​findString()​​ 用于定位要添加脚注的位置。示例中使用的是首次匹配,因此如果文档中出现多次"碳排放核算",只会处理第一个匹配结果。

​​getOwnerParagraph()​​ 获取匹配文字所在的段落,​​indexOf()​​ 则确定匹配文本在段落子对象集合中的位置。

创建脚注时使用:

ini 复制代码
Footnote footnote =
        paragraph.appendFootnote(FootnoteType.Footnote);

随后,通过 ​​getChildObjects().insert()​​ 将脚注移动到指定文字后面,而不是放在段落末尾。

脚注内容通过 ​​getTextBody().addParagraph().appendText()​​ 添加。它属于脚注正文,与原有段落中的文字是不同的文档对象。

需要注意,如果目标文字不存在,或者需要为多个相同关键词分别添加脚注,就需要调整查找和插入逻辑。

三、在 Word 中添加尾注

脚注适合解释当前页面中的内容。如果需要将参考文献或补充说明集中放在文档末尾,可以使用尾注。

添加尾注与脚注的方法相似,主要区别在于 ​​appendFootnote()​​ 的参数。

使用 ​​FootnoteType.Endnote​​,就可以创建尾注对象。

下面以 ​​report.docx​​ 为例,在第一节的第一个段落末尾添加一条尾注。

typescript 复制代码
import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.fields.Footnote;
import com.spire.doc.fields.TextRange;

public class AddWordEndnote {

    public static void main(String[] args) {

        Document document = new Document();

        try {
            // 加载 Word 文档
            document.loadFromFile("report.docx");

            // 获取第一个节
            Section section =
                    document.getSections().get(0);

            // 获取第一个段落
            Paragraph paragraph =
                    section.getParagraphs().get(0);

            // 在段落末尾添加尾注
            Footnote endnote =
                    paragraph.appendFootnote(
                            FootnoteType.Endnote);

            // 设置尾注内容
            TextRange noteText = endnote.getTextBody()
                    .addParagraph()
                    .appendText(
                            "参考资料:2026 年项目环境影响评估报告。");

            // 设置尾注文字格式
            noteText.getCharacterFormat()
                    .setFontName("宋体");

            noteText.getCharacterFormat()
                    .setFontSize(10);

            // 保存文档
            document.saveToFile(
                    "report-with-endnote.docx",
                    FileFormat.Docx_2013);

        } finally {
            document.dispose();
        }
    }
}

运行后生成 ​​report-with-endnote.docx​​。

这里的核心代码是:

ini 复制代码
Footnote endnote =
        paragraph.appendFootnote(FootnoteType.Endnote);

虽然方法名称仍然是 ​​appendFootnote()​​,但传入 ​​FootnoteType.Endnote​​ 后,创建的是尾注。

需要注意,这个示例将尾注引用标记添加在指定段落的末尾,而不是段落中某个关键词的后面。

如果需要将尾注插入某个词语之后,可以参考前面的脚注示例,先定位 ​​TextRange​​,再调整尾注对象在段落中的位置。

另外,尾注默认显示在文档末尾还是节末尾,与 Word 文档的尾注位置设置有关。插入尾注不代表它一定会显示在整个文件的最后一页。

四、读取 Word 中的脚注和尾注

对于已经包含脚注和尾注的 Word 文件,有时需要提取注释内容,例如检查引用说明,或者将文档中的参考信息单独整理出来。

在 Java 中,可以分别通过 ​​Document.getFootnotes()​​ 和 ​​Document.getEndnotes()​​ 获取脚注与尾注集合。

下面假设已经准备好 ​​report-with-notes.docx​​,其中包含脚注和尾注。程序会读取两类注释并输出到控制台。

scss 复制代码
import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.fields.Footnote;

import java.util.List;

public class ReadWordNotes {

    public static void main(String[] args) {

        Document document = new Document();

        try {
            // 加载包含脚注和尾注的文档
            document.loadFromFile(
                    "report-with-notes.docx");

            // 获取全部脚注
            List<Footnote> footnotes =
                    document.getFootnotes();

            System.out.println("=== 脚注 ===");

            for (int i = 0; i < footnotes.size(); i++) {

                Footnote note = footnotes.get(i);

                System.out.println("脚注 " + (i + 1));

                // 读取脚注中的各个段落
                for (int j = 0;
                     j < note.getTextBody()
                             .getParagraphs().getCount();
                     j++) {

                    Paragraph paragraph = note.getTextBody()
                            .getParagraphs().get(j);

                    System.out.println(paragraph.getText());
                }
            }

            // 获取全部尾注
            List<Footnote> endnotes =
                    document.getEndnotes();

            System.out.println("=== 尾注 ===");

            for (int i = 0; i < endnotes.size(); i++) {

                Footnote note = endnotes.get(i);

                System.out.println("尾注 " + (i + 1));

                // 读取尾注中的各个段落
                for (int j = 0;
                     j < note.getTextBody()
                             .getParagraphs().getCount();
                     j++) {

                    Paragraph paragraph = note.getTextBody()
                            .getParagraphs().get(j);

                    System.out.println(paragraph.getText());
                }
            }

        } finally {
            document.dispose();
        }
    }
}

这段代码将脚注和尾注分开处理。

​​getFootnotes()​​ 返回文档中的脚注集合,​​getEndnotes()​​ 返回尾注集合。

每个注释对象都包含一个 ​​TextBody​​,可以通过:

scss 复制代码
note.getTextBody().getParagraphs()

访问其中的段落,再使用 ​​Paragraph.getText()​​ 读取普通段落文字。

需要注意,脚注和尾注不仅可以包含文字,也可能包含多个段落、超链接或其他 Word 对象。

上面的示例主要提取普通段落文本。如果需要保留注释中的复杂格式、图片或其他结构,还需要进一步遍历对应的文档对象。

另外,示例使用的 ​​(i + 1)​​ 是程序输出时的顺序编号,并不一定等于 Word 中实际显示的脚注或尾注编号。

五、删除 Word 中的脚注

如果文档中的某些脚注已经不需要,可以将相应的脚注对象从段落中移除。

例如,一份报告在初稿阶段添加了大量术语解释,正式发布前希望删除这些脚注,但保留正文内容。

下面的代码会读取 ​​report-with-notes.docx​​ 中的全部脚注,然后逐个删除。

typescript 复制代码
import com.spire.doc.*;
import com.spire.doc.fields.Footnote;

import java.util.List;

public class RemoveWordFootnotes {

    public static void main(String[] args) {

        Document document = new Document();

        try {
            // 加载包含脚注的 Word 文档
            document.loadFromFile(
                    "report-with-notes.docx");

            // 获取全部脚注
            List<Footnote> footnotes =
                    document.getFootnotes();

            // 从后往前删除脚注
            for (int i = footnotes.size() - 1;
                 i >= 0;
                 i--) {

                Footnote footnote = footnotes.get(i);

                // 从所属段落中移除脚注对象
                footnote.getOwnerParagraph()
                        .getChildObjects()
                        .remove(footnote);
            }

            // 保存处理后的文档
            document.saveToFile(
                    "report-without-footnotes.docx",
                    FileFormat.Docx_2013);

            System.out.println("脚注删除完成");

        } finally {
            document.dispose();
        }
    }
}

代码通过 ​​getFootnotes()​​ 获取脚注集合,然后利用 ​​getOwnerParagraph()​​ 找到每个脚注所属的段落。

删除时使用:

scss 复制代码
footnote.getOwnerParagraph()
        .getChildObjects()
        .remove(footnote);

这样删除的是 Word 文档中的脚注对象,包括正文中的对应引用标记和注释内容,而不是只清空页面底部显示的文字。

这里采用从后往前遍历的方式,避免删除集合中的对象后影响尚未处理的索引。

需要注意,该示例只删除脚注,不会主动删除尾注。如果只需要删除某一条脚注,也可以先定位目标脚注对象,再执行相同的移除操作。

对于包含大量脚注的文件,建议先另存一份原始文档,以便在删除后检查正文与引用标记是否符合预期。

六、使用脚注和尾注时需要注意的问题

1. 脚注和尾注的用途有所不同

脚注通常位于当前页面底部,适合对正文中的术语、数据或特定内容进行补充解释。

尾注通常位于文档或节的末尾,适合集中放置参考信息或较长的补充说明。

二者在 Java 中都通过 ​​Footnote​​ 对象表示,主要使用 ​​FootnoteType.Footnote​​ 和 ​​FootnoteType.Endnote​​ 区分类型。

2. 脚注引用位置会影响阅读体验

在 Word 中,脚注通常紧跟在需要解释的词语或句子后面。

如果只是调用 ​​appendFootnote()​​,注释引用标记会添加在段落末尾。若需要精确定位,应先查找目标文本,再将脚注对象插入对应位置。

对于包含多个相同关键词的文档,还应明确是只处理首次出现的位置,还是为所有匹配位置分别添加注释。

3. 不要把脚注和普通页脚混淆

脚注(Footnote)和页脚(Footer)是不同的 Word 文档元素。

页脚一般用于显示页码、文档名称、日期等内容,而脚注用于说明正文中的特定信息,通常带有对应的引用标记。

因此,删除页脚不会删除脚注,操作脚注也不需要通过页眉页脚集合完成。

4. 注意复杂文档中的注释内容

如果脚注中包含多段文字、特殊格式或其他嵌入对象,仅通过 ​​Paragraph.getText()​​ 不一定能获得完整的结构化信息。

此外,脚注编号、位置和格式也可能受到文档或节设置的影响。

因此,对于论文、技术规范或其他有严格排版要求的 Word 文件,建议在修改后重新打开文档,检查引用标记、编号及注释的位置。

七、总结

使用 Java 可以完成 Word 脚注和尾注的常见操作,包括添加注释、读取已有内容以及删除不再需要的脚注。

添加脚注或尾注时,主要通过 ​​Paragraph.appendFootnote()​​ 创建对象,并使用 ​​FootnoteType​​ 指定类型。如果需要把引用标记插入到特定文字后面,还需要结合文本查找和段落对象位置进行处理。

对于已有文档,可以通过 ​​getFootnotes()​​ 和 ​​getEndnotes()​​ 读取注释,再根据需要提取文本或删除对应对象。

实际使用时,最需要注意的是脚注与尾注的区别,以及引用标记在正文中的准确位置。

相关推荐
小嘉丶学长5 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
字节探索5 小时前
Spring Boot 接口幂等性设计:从唯一索引到 Redis+Lua 的工程实践
java·spring boot
用户3721574261355 小时前
Java 实现 Excel 与 Markdown 相互转换:表格导出、格式设置与多表提取
java
SL_staff5 小时前
制造业订单交付总踩坑?用结构化节点协同模型重构计划系统
java·开源·全栈
永遠_6 小时前
YAML格式化工具
java
曼岛_6 小时前
[图解密码学]第4章 古典密码
java·数据库·密码学
一枕槐安4876 小时前
RAG 服务扛住高并发:缓存、队列、限流三件套
java·spring·缓存·异步任务·rag·断路器
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 动态查询开工:昨日回顾与今日任务
java·python·交友
云和数据.ChenGuang6 小时前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain