Java + Aspose Word TOC 工具完整构建流程

一、准备环境

1️⃣ 安装 JDK

bash 复制代码
java -version

2️⃣ 安装 Maven

bash 复制代码
mvn -version

确认可用

二、创建 Maven 项目(命令行方式)

1️⃣ 创建项目结构

bash 复制代码
mvn archetype:generate ^
-DgroupId=com.example ^
-DartifactId=word-toc-tool ^
-DarchetypeArtifactId=maven-archetype-quickstart ^
-DinteractiveMode=false

2️⃣ 进入项目

bash 复制代码
cd word-toc-tool

三、项目结构说明

生成后结构:

bash 复制代码
word-toc-tool/
│
├── pom.xml
└── src/
    ├── main/
    │   └── java/
    │       └── com/example/
    │           └── App.java
    └── test/

四、修改 Java 代码(关键补充)


1️⃣ 删除默认 App.java

bash 复制代码
src/main/java/com/example/App.java

2️⃣ 新建文件:

bash 复制代码
WordTocUpdater.java

路径:

bash 复制代码
src/main/java/com/example/WordTocUpdater.java

3️⃣ 核心代码(可直接用)

java 复制代码
package com.example;

import com.aspose.words.*;

public class WordTocUpdater {

    // =========================
    // 主方法:处理 Word
    // =========================
    public static String updateToc(String inputPath) {

        System.out.println("==================================");
        System.out.println("[1] 输入文件: " + inputPath);

        String outputPath = inputPath.substring(0, inputPath.lastIndexOf("."))
                + "_toc.docx";

        System.out.println("[2] 输出文件: " + outputPath);

        try {
            // =========================
            // 【核心】跨系统自动配置字体路径(兼容所有Aspose版本)
            // =========================
            System.out.println("[3] 检测系统并配置字体路径...");
            configFontsPath();

            // =========================
            // 加载 Word 文档
            // =========================
            System.out.println("[4] 加载 Word 文档...");
            Document doc = new Document(inputPath);

            // =========================
            // 第一步:先插入页码(必须最先执行)
            // =========================
            System.out.println("[5] 插入居中页码(当前页/总页数)...");
            insertPageNumber(doc);

            // =========================
            // 第二步:计算页面布局(固定分页)
            // =========================
            System.out.println("[6] 计算文档分页...");
            doc.updatePageLayout();

            // =========================
            // 第三步:更新所有字段(页码、目录依赖项)
            // =========================
            System.out.println("[7] 更新文档所有字段...");
            doc.updateFields();

            // =========================
            // 第四步:最后更新目录(此时页码已固定,100%准确)
            // =========================
            System.out.println("[8] 刷新目录页码...");
            refreshToc(doc);

            // =========================
            // 第五步:最终锁定布局
            // =========================
            System.out.println("[9] 最终确认分页...");
            doc.updatePageLayout();

            // =========================
            // 保存文件
            // =========================
            System.out.println("[10] 保存文件...");
            doc.save(outputPath, SaveFormat.DOCX);

            System.out.println("==================================");
            System.out.println("✅ 处理完成!文件路径: " + outputPath);

        } catch (Exception e) {
            System.out.println("❌ 处理失败");
            e.printStackTrace();
        }

        return outputPath;
    }

    /**
     * 【跨系统核心】自动识别 Windows / Linux 配置字体路径
     * 兼容所有低版本 Aspose.Words,无任何编译错误
     */
    private static void configFontsPath() {
        String os = System.getProperty("os.name").toLowerCase();
        try {
            if (os.contains("win")) {
                // Windows 系统字体路径
                String winFontPath = "C:/Windows/Fonts";
                FontSettings.getDefaultInstance().setFontsFolder(winFontPath, true);
                System.out.println("✅ 当前系统:Windows,字体路径:" + winFontPath);
            } else if (os.contains("linux")) {
                // Linux(Ubuntu) 自定义字体路径
                String linuxFontPath = "/usr/share/fonts/chinese";
                FontSettings.getDefaultInstance().setFontsFolder(linuxFontPath, true);
                System.out.println("✅ 当前系统:Linux,字体路径:" + linuxFontPath);
            }
        } catch (Exception e) {
            // 容错:不做额外操作,使用Aspose默认字体查找
            System.out.println("⚠️ 字体路径配置跳过,使用默认模式");
        }
    }

    /**
     * 插入页码:居中  当前页 / 总页数
     */
    private static void insertPageNumber(Document doc) throws Exception {
        for (Section section : doc.getSections()) {
            HeaderFooter footer = section.getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
            if (footer == null) {
                footer = new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);
                section.getHeadersFooters().add(footer);
            }
            // 清空原有页脚
            footer.removeAllChildren();

            // 创建居中段落
            Paragraph para = new Paragraph(doc);
            para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);

            // 当前页码
            para.appendField(FieldType.FIELD_PAGE, true);
            para.appendChild(new Run(doc, " / "));
            // 总页数
            para.appendField(FieldType.FIELD_NUM_PAGES, true);

            footer.appendChild(para);
        }
    }

    /**
     * 仅刷新目录(TOC)字段
     */
    private static void refreshToc(Document doc) {
        for (Field field : doc.getRange().getFields()) {
            if (field.getType() == FieldType.FIELD_TOC) {
                try {
                    field.update();
                } catch (Exception e) {
                    System.out.println("⚠️ 单个目录更新失败: " + e.getMessage());
                }
            }
        }
    }

    // =========================
    // main入口
    // =========================
    public static void main(String[] args) {
        System.out.println("==================================");
        System.out.println("Word 目录+页码自动更新工具(跨Windows/Linux)");
        System.out.println("==================================");

        if (args.length == 0) {
            System.out.println("❌ 用法: java -jar xxx.jar 文档路径.docx");
            return;
        }

        updateToc(args[0]);

        System.out.println("==================================");
        System.out.println("程序结束");
        System.out.println("==================================");
    }
}

五、替换 pom.xml

改成Aspose 版本 + 打包插件:

bash 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>word-toc-tool</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <dependencies>

    <!-- ⭐ 正确方式:普通依赖(关键修改) -->
    <dependency>
      <groupId>com.aspose</groupId>
      <artifactId>aspose-words</artifactId>
      <version>21.11</version>
    </dependency>

  </dependencies>

  <build>
    <plugins>

      <!-- ⭐ Maven Shade:打 fat jar -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.5.0</version>

        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>

            <configuration>

              <!-- ⭐ 防止依赖丢失 -->
              <createDependencyReducedPom>false</createDependencyReducedPom>

              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.example.WordTocUpdater</mainClass>
                </transformer>
              </transformers>

            </configuration>

          </execution>
        </executions>

      </plugin>

    </plugins>
  </build>

</project>

六、安装 Aspose 到本地仓库

bash 复制代码
mvn install:install-file ^
-Dfile=aspose-words-24.7-jdk17.jar ^
-DgroupId=com.aspose ^
-DartifactId=aspose-words ^
-Dversion=24.7 ^
-Dpackaging=jar

七、打包

bash 复制代码
mvn clean package
相关推荐
DS随心转小程序16 小时前
实测评测 AI 导出鸭转化效能,全方位优化 DeepSeek 输出 word 文档落地使用效率
人工智能·aigc·word·豆包·deepseek·ai导出鸭
AI导出鸭PC端1 天前
AI 导出鸭一站式转换工具,ChatGPT 内容怎么生成 word 无需手动复制排版
人工智能·chatgpt·word·豆包·ai导出鸭
开开心心就好2 天前
批量图片OCR识别重命名工具完全免费
随机森林·智能手机·ocr·电脑·word·音视频·最小二乘法
库拉库拉里3 天前
Word文档的标题总是自动出现首行缩进怎么办?
c#·word·xhtml
ms365copilot3 天前
Word Copilot 上新模型 Claude Opus 5
microsoft·word·copilot
金豆呀3 天前
WPS批量提取Word文档内容生成固定格式Excel表格
word·excel·wps
一只小灿灿4 天前
Word快捷键集合z
word
2501_930707784 天前
使用C#代码将 Word 转换为 EPUB 电子书格式
word
Am-Chestnuts4 天前
国产AI多轮对话归档与多格式导出实践
人工智能·word
chatexcel5 天前
ChatExcel AI Word 升级:多模态读资料、按模板生成、智能排版配图,还能批注修订和联动Excel 复核
人工智能·ai·word·excel·ai写作