一、需求说明
公司每周各部门都有各自的周报,是word编写的,docx格式的。
最近有个需求,就是要从以往周报中搜索相关的信息。其实说白了就是在各个独立的word文件中搜索关键字。
这个和只搜索文件名的不同点大家应该也发现了,就是要深入到word文件里面去进行搜索。
这个需求以前我也有,因为我有使用word记录工作的习惯,尤其是板卡问题的排查记录。但是真需要复查的时候,却不知道写到哪个文件里了,有的时候就要从头到尾挨个点开来查找。
当时研究了一些软件和方法,没有很好的解决。(dngrep也是个不错的选择,大家可以尝试,下面讲述我的另一种解决方案)
最近一年我放弃了word,采用了印象笔记来进行记录,这个查找的问题就得到了很好的结局。但是公司周报没有办法上到云,只能离线。所以这种云笔记的方式是没有办法解决周报搜索的需求的。所以需要找到一款离线的笔记软件。
二、笔记软件安装及说明
离线笔记软件多为开源的,并且有很多。离线笔记软件里我选择的是“思源笔记”。思源笔记支持windows,MacOS,Linux系统,因为我们公司电脑平台和系统很杂,这点思源软件很友好。同时支持完全离线使用,同时也支持端到端加密同步。
下载地址:https://b3log.org/siyuan/download.html
我是windows系统,下载到自己电脑后,需要用“管理员身份运行”。
打开后需要新建笔记本。在“文档树”→“更多”→“新建笔记本”→取名“周报”→“确定”。
查看“周报”→“更多”→“导入”。发现笔记本是可以导入的。
这里就关键了,可以导入“SiYuan.sy.zip”,这说明如果别人把文件打包整理好,那么我们是可以坐享其成的,把打包好文件导入。
其次,可以导入“Markdown文档”,也就是说我们可以把自己做好的markdown文档导入进来。
还可以导入“Markdown文件夹”,也就是说,我们如果一个文件夹内都是markdown文件,那么就不用一个一个导入了,直接指定文件夹就可以了。
那么这里我们就基本清晰了,如果没有别人打包好的文件,那么就要自己搞markdown文件,markdown一种轻量级标记语言,word通过工具是可以转换成markdown文件的。
那么我们现在的任务就是把上面的周报docx文件,批量的转换为markdown文件就好了。
三、docx批量转换为markdown文件
3.1 python脚本
这里感谢csdn博主“痴人说梦梦中人”的python脚本。原文如下:
文章链接:
https://blog.csdn.net/qq_38963246/article/details/119586221
之前用有道云记笔记,笔记导出格式基本都为docx格式,有道笔不能批量导出,另外就是时常卡顿,就想着换个markdown编辑器直接保存本地,前后尝试了notepad++插件,Atom,MarkdownPad,Cmd Markdown,最终还是选择了Typora,大纲和文件树是真的舒服,就是启动太慢。
有道云笔记导出格式都是word类型的,数量还不少,只好搞个脚本进行格式转换了。
repo:https://github.com/SevenC-base/docx_to_markdown
效果还行,不求美观之类的,能跑就行了
1.简介
一个辅助脚本,利用工具pandoc,以单线程的方式将目录下所有docx文件转为markdown格式。
pandocx:https://github.com/jgm/pandoc/releases/tag/2.14.1
2.使用配置:
修改如下配置:
# 配置pandoc 路径
pandoc_path = "C:\\Users\\Administrator\\Downloads\\pandoc.exe"
# 配置docx文件存在的路径,会遍历该路径下的所有docx文件
dirctory = "D:\\笔记\\"
# 配置图片存储路径
images_store_path = "D:\\笔记\\images\\"
3.运行结果如下
生成目录就是原来的目录,想筛选的话就文件夹搜索.md就好了。
其Python脚本源码:
#!/usr/bin/env python # -*- coding:UTF-8 -*- # 2021/08/10 周二 15:23:14 # By Hasaki-h1 import os, sys, subprocess, uuid def get_file_list(directory): """单独一个目录""" files_list = [] files_path_list = [] files_p_list = [] if os.path.exists (directory): directory_n = directory else: print ("%s 不是一个有效的目录!!!" % directory) sys.exit () # 遍历目录下读取可读文件 all_files_directory = os.walk (directory_n, topdown=True, followlinks=True) for root, dirs, files in all_files_directory: # 获取文件路径 for f_name in files: if ".docx" in f_name: # print(f_name) file_path_d = os.path.join (root, f_name) file_path_m = os.path.join (root, f_name.replace (".docx", ".md")) files_path_list.append (file_path_d) files_p_list.append (file_path_m) return files_path_list, files_p_list def convert_md(pandoc_path, f_docx, f_md, images_store_p): try: image_store_path_create = images_store_p + str (f_docx.split ('\\')[-1]).replace (".docx", "") + str ( uuid.uuid4 ()) cmd = pandoc_path + " \"{}\" -f docx -t markdown -o \"{}\" --extract-media=\"{}\"".format (f_docx, f_md, image_store_path_create) res = subprocess.Popen (cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) sout, serr = res.communicate () res.wait () sout.decode ("gbk") except Exception as e: serr.decode ("gbk") finally: pass def main(pandoc_path, dirctory, images_store_path): fpl_docx, fpl_md = get_file_list (dirctory) print ('🚀-----------------起飞------------------🚀') for fpl_d in fpl_docx: progress = '{:.2f}%'.format (((fpl_docx.index (fpl_d) + 1) / len (fpl_docx)) * 100) # print(fpl_d,fpl_md[fpl_docx.index(fpl_d)]) convert_md (pandoc_path, fpl_d, fpl_md[fpl_docx.index (fpl_d)], images_store_path) print ('✈ 进度:{} ------ {} ->>>--->>> 转换完成!'.format (progress, str (fpl_d.split ('\\')[-1]))) if __name__ == '__main__': # 配置pandoc 路径 pandoc_path = "C:\\Users\\Administrator\\Downloads\\pandoc.exe" # 配置docx文件路径,会遍历该路径下的所有docx文件 dirctory = "D:\\笔记\\" # 配置图片存储路径 images_store_path = "D:\\笔记\\images\\" main(pandoc_path, dirctory, images_store_path)
3.2 脚本依赖安装
用这个脚本,需要在windows系统上安装pandoc和python。
先安装pandoc,下载地址:https://pandoc.org/installing.html。(建议:pandoc安装目录中没有空格等比较方便,我直接把pandoc装到了C:\ProgramFiles\Pandoc文件下)
装完可以在cmd中,看一下是否运行正常了。能看到版本信息就可以了。
>pandoc --version
再安装python。
在cmd中输入版本查看,看自己电脑是否有python。
>python --version
要是没有版本号,那么就说明电脑里没有python。那么就直接输入>python,windows会自动跳到应用商店python的应用安装界面。
跳转了就安装就行了,我下面截图是我已经点完安装,且安装完的图。要是没安装就会有个“安装”的钮,点它就行了。
3.3 直接调用pandoc命令尝试转换
那么首先尝试把一份周报.docx格式(就是下面的a.docx,我为了好敲命令,重命名了一份周报,免得敲那么长的文件名了)转为.md格式。pandoc操作手册MANUAL.pdf:https://pandoc.org/MANUAL.pdf
因为在cmd内调用pandoc命令就可以直接转换文件。我们使用cd命令进入到周报所在的目录“2020年”里面,使用命令“>pandoc a.docx -o a.md”转换a.docx文件。先不用脚本,手动的先转换试试。
但是因为周报有边框,所以输出效果很不好,转换结果是这样的:
啥都看不了,所以需要制定输出格式,根据MANUAL.pdf手册里对输入输出的参数说明,-f是输入,-t是输出。
经过各种尝试,输出格式配置为xwiki时显示且后期搜索效果最好。
所以脚本命令使用:
>pandoc -f docx -t xwiki a.docx -o a.md
3.4 python脚本修改
那么就改上面的命令修改csdn博主的脚本,现在文件目录是这样的:
修改docx2md.py脚本。
配置pandoc的安装路径,pandoc_path为“C:\\ProgramFiles\\Pandoc\\pandoc.exe”(前面说了建议pandoc安装路径没有空格,就是这里简单些)。
配置需要转换的docx文件存放的路径dirctory为“E:\\markdown\\2020年\\”会遍历该路径下的所有docx文件(因为上面的文件存储路径有子文件夹,所以2020年、2021年、2022年三个文件夹这个脚本要改三次,先改为“E:\\markdown\\2020年\\”再改为“E:\\markdown\\2021年\\”,再改为“E:\\markdown\\2022年\\”)。
Word中的图片我没有另存储,也就是markdown文件为纯文本的,所以images_store_path路径我没有改动,因为下面转换命令里我就没涉及image。
Pandoc转换命令那里,即脚本第42、43行改为:
cmd = pandoc_path + " -f docx -t xwiki \"{}\" -o \"{}\"".format (f_docx, f_md)
3.5 python脚本执行
在cmd中执行命令>python docx2md.py
(因为上面配置docx文件存放dirctory的路径时改了三次,即“E:\\markdown\\2020年\\”、“E:\\markdown\\2021年\\”、“E:\\markdown\\2022年\\”,所以每改一次要执行一次>python docx2md.py命令才能对子文件的转换)
四、markdown文件夹导入
在思源笔记里导入文件夹,下面以导入2021年的为例:
选择笔记本→“更多”→“导入”→“Markdown文件夹”→选择存放md文件的文件夹。
五、笔记本导出
软件可以将自己的笔记本打包转出,“更多”→“导出”→“SiYuan.sy.zip”,点击后软件会调用浏览器的下载器,保存笔记本名字的.sy.zip文件。我这里就是“周报.sy.zip”。我把“周报.sy.zip”剪切到“E:\markdown”文件夹下。
六、笔记本导入
笔记本文件的导入。新建笔记本→“更多”→“导入”→“SiYuan.sy.zip”→找到.sy.zip文件(我这里为E:\markdown\周报.sy.zip)。
七、笔记本搜索功能
选中笔记本→“更多”→“搜索”→填写要搜的关键词→点击搜索结果可以预览上下文。