保存文件之前,使用aspose.word中的这个方法:

Document.updateFields()

更新域时会更新目录,但是页码可能会有偏差,原因是无法保证域的更新顺序,目录可能不是最后一个更新的,而在更新其他域时导致页码再次发生变化。而且这个更新方法不止会更新页码,还会导致样式和更新前发生改变。

    /*** 按格式保存文件* @param outputPath    输出路径* @param saveFormat    文件格式*/public void saveFile(String outputPath,int saveFormat) throws Exception {//更新域的方法document.updateFields();File newFile = new File(outputPath);FileOutputStream fos = null;try{fos = new FileOutputStream(newFile);this.save(fos,saveFormat);fos.flush();}finally {StreamUtil.closeQuietly(fos);}}

于是我摸索了一番,得到下面这种解决方式,我们可以自己去写更新域的逻辑:

    /*** 拿到所有书签*/public Set<String> getAllBookmark(){Set<String> r = new HashSet<>();BookmarkCollection collection = document.getRange().getBookmarks();for (Bookmark bookmark : collection) {r.add(bookmark.getName());}return r;}/*** 更新文档域以及目录页码*/@SneakyThrowspublic void update(){FieldCollection fields = document.getRange().getFields();//FieldType.FIELD_PAGE_REF => 目录中的每一个标题,这些标题如果设置成目录,则标题必须添加_Toc开头的隐藏标签(设置目录会自动添加标签),才能成功更新目录//否则会报错“bookmark not defined”//预处理所有目录标题,添加_Toc标签try{Set<String> abs = this.getAllBookmark();for (int i = 0; i < fields.getCount(); i++) {Field field = fields.get(i);//判断域对象是否是目录的引用if(field.getType() == FieldType.FIELD_PAGE_REF){FieldPageRef pageRef = (FieldPageRef) field;String name = pageRef.getBookmarkName();//判断目录的引用是否设置了_Toc前缀的标签,没有则手动添加一个,自动校正if (name.startsWith("_Toc")) {if(!abs.contains(name)){try{builder.moveTo(pageRef.getStart());builder.startBookmark(name);builder.moveTo(pageRef.getEnd());builder.endBookmark(name);}catch (Exception e){log.warn("给【{}】添加标签失败:{}",name,e.getMessage());}abs.add(name);}}}}List<FieldToc> tocList = new ArrayList<>();//先更新文档全局for (int i = 0; i < fields.getCount(); i++) {Field field = fields.get(i);if(field.getType() == FieldType.FIELD_TOC){FieldToc fieldToc = (FieldToc) field;tocList.add(fieldToc);}else{field.update();}}//最后更新页数for (FieldToc fieldToc : tocList) {fieldToc.updatePageNumbers();}//处理bookmark not defined的错误,但目录样式会改变String text = this.getRange().getText().toLowerCase();if(text.contains("error! bookmark not defined")){log.warn("目录更新页码时出错:目录中的标题的标签丢失,尝试更新整个文档。请重新生成模板文件的目录保证此错误不会出现");document.getRange().updateFields();}}catch (Exception e){log.error("自动修复目录时发生错误:",e);document.getRange().updateFields();}}

注意:目录里面的每个标题,在文档中都会有一个引用, 这些引用都必须加上一个_Toc开头的隐藏书签,否则目录页码无法正常更新,手动更新目录时会出现标签未定义的错误。

java使用Aspose.word保存word更新目录页码报错以及样式错乱解决相关推荐

  1. java使用cmd编译中文时错误,解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题...

    解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 在刚开始学习Java的过程中,考虑到记事本应用没 ...

  2. word排版之生成目录页码不右对齐

    原文地址为: word排版之生成目录页码不右对齐 用word生成目录时,由于某种原因造成目录的页码参差不齐,页码没有靠右对齐,如上图. 这时可以再生成目录对话框中修改相关选项来更正这个错误. 在< ...

  3. 更新Composer依赖报错处理Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe...

    更新Composer依赖报错处理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRepos ...

  4. java文件无法导出excel文件,【excel表格文件格式无效】java导出excel,excel打不开,报文件格式无效,怎么解决!...

    excel提示 打开的文件.xls的格式与文件扩展名不一致怎么办 如果打开文件的格式与文件的扩展名不一致,只要能够打开就不用去管他. java导出excel,excel打不开,报文件格式无效,怎么解决 ...

  5. 更新Composer依赖报错处理Fatal error: Declarat…

    更新Composer依赖报错处理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe po ...

  6. java获取几天前的数据 年份发现报错 月份日期正常 yyyy-mm-dd与yyyy-MM-dd的大坑啊!!!

    java获取几天前的数据 年份发现报错 yyyy-mm-dd与yyyy-MM-dd的大坑 话不多上上图 当我把时间区间改成365天 30天的时候就很正常 我发现就是180天左右的情况时间不对 ,其他都 ...

  7. 机器学习模型保存之joblib、pckle报错问题

    机器学习模型保存之joblib.pckle报错问题 遇到的问题 joblib pickle加载 遇到的问题 使用sklearn训练机器学习模型时,为了能够使得训练好的模型可以多次使用,我们一般都会将模 ...

  8. 宽带连接在win10更新后1068报错处理办法

    ** win10宽带连接更新后1068报错解决 1,win+R打开注册表编辑器输入regedit 2,点击HKEY_LOCAL_MACHINE 3,点击SYSTEM 4,点击CurrentContro ...

  9. java 报错404_Javaweb工程运行报错HTTP Status 404解决办法

    最近在学习jsp和servlet,避免不了的要和tomcat打交道,但tomcat经常会出现各式各样的错误,下面是我总结的一些常见的解决方法,希望对大家有用. 1.未部署web应用 2.url输入错误 ...

最新文章

  1. 为啥开发的文档能力是核心竞争力之一
  2. day 31 进程的其他方法 进程锁 进程队列
  3. gwt-2.8.2下载_GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  4. 手机html滚动原理,手机滚动-如何实现惯性滚动
  5. linux bash 的文件查找替换 文件操作
  6. 10种软件滤波方法的示例程序(匠人转载学习)
  7. Chrome 插件英雄榜
  8. 网络分层和Http协议原理
  9. 浏览器工作原理(超级详解!!!!)
  10. sbit在c语言中作用,sbit在单片机中的表示和作用?
  11. 实现LZW字典压缩算法
  12. floor()函数与round()函数
  13. HTML常用基础知识归纳
  14. Vim中如何全选复制粘贴
  15. 联邦学习(FL)+差分隐私(DP)
  16. 用python爬取qq空间内容_用python爬取QQ空间
  17. c语言关键字翻译课程设计,课程的设计C语言关键字中英翻译机.doc
  18. 微信扫码支付notify_url回调接收通知问题
  19. 【ChatGPT】Awesome ChatGPT Prompts 很棒的 ChatGPT 提示
  20. python数据可视化库_python和r中用于数据可视化的前9个库

热门文章

  1. 有符号数无符号数加法以及浮点数表示
  2. 小米商城侧边栏【显示向右箭头】
  3. 截取B站的图标,自己用
  4. Sublime内网安装插件教程
  5. 2022年起重机司机(限桥式起重机)考试练习题及在线模拟考试
  6. MySQL数据库——字符函数
  7. 计算机驱动恢复出厂设置在哪里,你所不知道的电脑恢复出厂设置的方法
  8. 12.1搭建LNMP、搭建wordpress、知乎、edusoho、拆分数据库、扩展web服务器、搭建文件共享、实时备份、12.2代理的定义、模块、实践
  9. 2020年西山居SEED训练营开发方向记录
  10. 智能聊天机器人技术研究与应用