由去掉word文档中的一个GoLand复制后残留的底纹说起
首先,是有个很难去掉的底纹,就是当黑底的Goland中复制代码,以保留格式方式黏贴后,会保留字体颜色、大小和“底纹”。
就是保留的这个底纹,想去掉一直没成功,既不是文字的底纹,也不是页面边框里的底纹。
- 为什么要去除,是因为wps复制保留的文档,看上去还可以。但是微软的office打开,行之间露出来了,影响阅读、难看的要死,不如去掉。
发扬二杠子精神,做为程序员,能不能用什么读取文件属性,查看(最好是能去除)这个属性。
GitHub上搜了下,搜word没搜到,在百度搜了下,看到个docx4j的似乎是java的一个库,然后又在github里以docx搜了下,搜到个Go语言的操作库(https://github.com/nguyenthenguyen/docx)。因为我不会Java,会点Go,就用它了。
写了几行测试代码。读出word,发现doc的读不成功,再看和它自带例子区别,改文档为docx的。能读出来。
看了下接受word内容的结构体,看里面 有两个结构体ReplaceDocx和Docx,属性相近,摘录个:
type ReplaceDocx struct { zipReader ZipData content string links string headers map[string]string footers map[string]string }
看了下内容,格式更像是存储在content中。将内容复制处了,看颜色都是十六进制显示的,看了下word中的底色是 2B2B2B(微信截图的时候截图框右下角有显示颜色数值)。
搜了下果然有,给替换了下,写入新文件发现终于去掉了:
docx2.SetContent(strings.ReplaceAll(contextStr, `<w:shd w:val="clear" w:fill="2B2B2B"/>`, ""))
这个元素位置是在 <w:body> 子元素<w:p>再子元素,接着<w:r>子元素, 再 <w:rPr>子元素下有个 w:shd 名字的元素
测试文档只有一行, 把我正式的文档弄过来试下,又没成功。。额,首先是doc格式的,需要改成docx,在用wps保存的时候,发现能保存很多种,还有xml格式的(心里咯噔了下)。
改成docx还是不行,后来发现w:shd那个元素条目变成了这样:
<w:shd w:val="clear" w:color="auto" w:fill="2B2B2B"/>
两个替换都加上就好了。
而这次我不再是将代码读取文档,复制context属性查找。而是另存为文件未xml格式,再用notepad打开查找到的。
而且发现,这个xml格式仍能正常的用wps打开。
以前认为doc的比较通用,兼容性好,看来还是应该转用docx了,更高级些吧。或者,那个xml格式不正是一直想找的记录日志的方式么?有word的排版方便,还有内容的文本化。
因为这个xml文件可以wps当做word打开,所以直接xml方式直接文本删除掉,那都不用重新了吧。
所以最终简洁方式是文档转为xml格式,删除其中的对应颜色底纹 w:shd 元素。然后看个人喜好是不是要将文件再另存为docx了。
问题是解决了,去除了“底纹”。但是其实效果并不好,没了底纹,很多原先字体看上去都看不清了。
查找w:shd 含义时,看到个介绍xml格式word文档意义的网页(https://www.cnblogs.com/forlina/archive/2011/06/09/2076559.html),虽然没介绍w:shd,但有其他一些常见的。
关于微软的office有没提供 xml和docx的另存为,因为没office这个正版软件,没做测试。