〇、本项目的由来、意义
由来
Apache POI
意义
- 第一个真正意义上的自己的 Go 项目,检验、巩固了前几天的学习
- 第一次这么认真看源码,因为没有文档??!极大锻炼了自己看源码的能力,还挺有趣?
- 和室友拥有了一次愉快的半夜一起写代码的奇妙而又愉快的体验。他看我在弄,来了兴趣,现学 C# 和我并行尝试。中间不少思路我们都想到一块了,比如发现文档没有标题格式全是正文,思考大纲转标题,然后又都决定找框架的「大纲」接口
- 提前一星期完成了老师的任务,后面一星期可以专心学 Go 了。
- 利用这次项目,对 vim 比以前更习惯了一点,总算「存活」下来了。
一、本项目内容
项目大背景:把《专利审查指南…》做成网页版的电子书,加入高级搜索等功能。 本项目工作:提取《专利审查…》内容,抽取标题层级和段落内容,存入数据库中。 项目进度:
Golang Slice
二、抽取过程概述
2.1 按段落与大纲初步抽取
gooxml
40
2.2 合并近邻的同大纲内容
同一目录下可能有多个段落,但向前端返回的文本,应该是一整段,所以合并紧邻的同大纲内容。
2.3 将层级目录与文本内容存至数据库中
/build/build.go
idmaxLvllastLvl
maxLvlmaxLvlidmaxLvlidpopmaxLvl
三、开发问题与解决方案记录
1.文件相对绝对路径
/util/fileUtil.goGetRunPath()
2. gooxml document 不支持 doc
doc 转存成 docx
3. gooxml 和 unidoc/unioffice 弃用
gooxml 太旧了,文档也 404
unioffice 应该是基于 gooxml 写的,但是要授权,只能免费用 14 天
所以都弃用,但是真就没办法了吗?
4. 切换解析 word 方法
受某大佬启发,先将 word 转成 html 的形式,再读取 html,原因如下:
我要实现的目标是读取 word,所以可以转换成等效格式,再提取。如果是编辑 word,那可能要直接操作 word 了
之所以选择 html ,是因为我之前对爬虫比较熟,用 xpath 有信心。分析 html 源码后,确定能获取各元素属性
4. 如何解析标题
mso-outline-level1
5. 如何解析文本(段落)
divdivmso-char-indent-count:2.0
6. 编码与文件转换问题
先把 doc 转 docx,再另存为 html,再用 vscode 打开(编码 GBK),然后保存成 UTF-8
7. htmlQuery 获取 html node 的字符串
Data
8. 利用 gooxml/document 设置 word 样式
9. 如何利用 gooxml/document 获取段落属性
(p Paragraph) SetStyle(s string)
Paragraph.p.x.PPr.PStyle.ValAttrParagraphparagraph.go(p Paragraph) Style() string
Bingo!
10. 《审查指南…》中,没有「标题」样式,全是正文
Heading1/try/parseTry.goTestNewDocGooxmlstylex.PPr.PStyle.ValAttr124050
11. 尝试用属性获取
paragraph.goProperties
PragraphProperties.go
stylestyle
12. 能否通过将大纲转成标题来实现提取?
GolangstyleHeading
13. 找到了 gooxml 中的 「大纲属性」
ParagraphProperties.go
wml.CT_PPrCT_PPr.go
CT_DecimalNumber
int64x *wml.CT_PPrParagraphProperties.go
总结一下,获取 Word 大纲级别的方式如下,这里要防止空指针: