当前位置: 首页 > news >正文

实现Word文档自动编号提取技术详解

一、背景

因业务需求,目前正在实现一项需求,即将一份试卷的内容提取出来,由非结构化到结构化的转换。在试卷解析的时候发现存在大纲目录中带有自动编号的格式,按照传统的方式没有解析出来,花了一番功夫,最终还是搞定了,于是写下来分享给大家。

二、概述

从一份word格式的试卷中,用java从XWPFParagraph中先判断是否有编号,如果有再提取自动编号,自动编号还是会区分不同类型的,如中文的一、二、三等,阿拉伯数字的1、2、3等,或者是字母a、b、c等。

三、正文

1、需要先实现一个自动编号上下文的class:

NumberingContext里面注册了不同格式的编号,如大写字母编号、小写字母编号、中文编号等,具体可以看代码:


public class NumberingContext {private final Map<String, List<Integer>> numberingStates = new HashMap<>();// 编号格式映射(可以扩展更多格式)public static final Map<String, NumberFormatter> FORMATTERS = new HashMap<>();static {FORMATTERS.put("decimal", new DecimalFormatter());FORMATTERS.put("lowerLetter", new LowerLetterFormatter());FORMATTERS.put("upperLetter", new UpperLetterFormatter()); // 新增FORMATTERS.put("upperRoman", new UpperRomanFormatter());FORMATTERS.put("chineseCounting", new ChineseCountingFormatter());}public String resolveNumberText(String numIdKey, int ilvl, String format, String textTemplate) {List<Integer> counters = numberingStates.computeIfAbsent(numIdKey, k -> new ArrayList<>());// 确保层级计数器足够长while (counters.size() <= ilvl) {counters.add(0);}// 更新当前层级计数器,并清空下级counters.set(ilvl, counters.get(ilvl) + 1);for (int i = ilvl + 1; i < counters.size(); i++) {counters.set(i, 0);}// 获取格式化器NumberFormatter formatter = FORMATTERS.get(format);if (formatter == null) {formatter = new DecimalFormatter();}// 替换模板中的占位符String result = textTemplate;for (int i = 0; i <= ilvl; i++) {String placeholder = "%" + (i + 1);if (i < counters.size()) {String replacement = formatter.format(counters.get(i));result = result.replace(placeholder, replacement);}}return result;}
}

2、不同类型的编号格式

1、DecimalFormatter

public class DecimalFormatter implements NumberFormatter {@Overridepublic String format(int number) {return String.valueOf(number);}
}

2、LowerLetterFormatter

public class LowerLetterFormatter implements NumberFormatter {@Overridepublic String format(int number) {return String.valueOf((char) ('a' + number - 1));}
}

3、UpperLetterFormatter

public class UpperLetterFormatter  implements NumberFormatter {@Overridepublic String format(int number) {if (number < 1 || number > 26) {throw new IllegalArgumentException("upperLetter 格式仅支持 1-26");}return String.valueOf((char) ('A' + number - 1));}
}

其他略。。。

3、接下来就是核心逻辑:

这个getParagraphNumbering方法就是可以从XWPFParagraph

提取自动的编号

public static String getParagraphNumbering(NumberingContext numberingContext, XWPFParagraph paragraph) {try {if (paragraph.getNumID() == null) {//"无编号";return "";}BigInteger numId = paragraph.getNumID();BigInteger ilvl = paragraph.getNumIlvl() != null ? paragraph.getNumIlvl() : new BigInteger("0");// 使用numId和文档信息创建唯一键String numIdKey = numId.toString();XWPFNumbering numbering = paragraph.getDocument().getNumbering();if (numbering == null) {//"无编号定义";return "";}XWPFNum num = numbering.getNum(numId);if (num == null) {//"编号定义不存在";return "";}BigInteger abstractNumId = num.getCTNum().getAbstractNumId().getVal();for (XWPFAbstractNum abstractNum : numbering.getAbstractNums()) {if (abstractNum.getCTAbstractNum().getAbstractNumId().equals(abstractNumId)) {CTAbstractNum ctAbstractNum = abstractNum.getCTAbstractNum();CTLvl ctLvl = ctAbstractNum.getLvlArray(ilvl.intValue());if (ctLvl != null && ctLvl.getNumFmt() != null && ctLvl.getLvlText() != null) {String format = ctLvl.getNumFmt().getVal().toString();String text = ctLvl.getLvlText().getVal();return numberingContext.resolveNumberText(numIdKey, ilvl.intValue(), format, text);}}}//"编号层级不存在或定义不完整";return "";} catch (Exception e) {//"解析编号时出错";return "";}}

http://www.dtcms.com/a/399436.html

相关文章:

  • 超越OCR:深入智能文档处理(IDP)的技术内核与实现路径
  • 江苏自助建站平台html5游戏开发
  • SQL server 2022下载安装详细教程
  • 工业视觉缺陷检测算法总结:从传统到深度学习,5类核心算法
  • 建设银行网站打不开别的网站可以口碑好的移动网站建设
  • 网站怎么建设原始站点定制网站的好处有哪些
  • 推动商用车辆原始设备制造商(OEM)向集中式电子电气架构(E/E,Electrical/Electronic)与软件架构转型
  • 网站内页模板玉溪市住房城乡建设局网站
  • Navicat 数据库管理工具简介​以及免费绿色版下载安装包分享 不登录csdn也可以直接使用
  • 第二章:Qt第一个程序
  • APache shiro-550 CVE-2016-4437复现
  • 计算机视觉笔试选择题:题组2
  • 荣耀手机商城官方网站入口唐山网页设计
  • 凉山西昌网站建设网站公司可以做英文网吗
  • 软件开发转测试的过程中, UT测试如何体现
  • Si掺杂AlN薄膜在肖特基中的应用
  • 四种Linux进程管理工具使用详解
  • 软件的自动化测试平台
  • 分享天气预报走势图和未来7日预报静态HTML
  • 如何建立国际网站网站建设现状调查研究
  • JVM(六)-- StringTable
  • SpringBoot面试
  • 网站建设技术课程设计报告保定市网站制作公司
  • 如何处理JavaScript渲染的登录页面?Selenium自动化登录指南
  • 知识图谱对自然语言处理中深层语义分析的影响与启示
  • 齐齐哈尔企业网站排名优化网站建设设计制作熊掌号
  • 52Hz——FreeRTOS学习笔记——调度器的挂起与恢复
  • 微信网站建设平台郑州全面恢复正常
  • 8.Spring Ai Alibaba招聘助手实战
  • 平凉网站建设平凉杭州电信网站备案