使用思源笔记软件实现word文内搜索功能

简介: 使用思源笔记软件实现word文内搜索功能

科技背景_副本 公众号_副本.png

一、需求说明

公司每周各部门都有各自的周报,是word编写的,docx格式的。

最近有个需求,就是要从以往周报中搜索相关的信息。其实说白了就是在各个独立的word文件中搜索关键字。

这个和只搜索文件名的不同点大家应该也发现了,就是要深入到word文件里面去进行搜索。

正面.png

这个需求以前我也有,因为我有使用word记录工作的习惯,尤其是板卡问题的排查记录。但是真需要复查的时候,却不知道写到哪个文件里了,有的时候就要从头到尾挨个点开来查找。

640.png

当时研究了一些软件和方法,没有很好的解决。(dngrep也是个不错的选择,大家可以尝试,下面讲述我的另一种解决方案)

最近一年我放弃了word,采用了印象笔记来进行记录,这个查找的问题就得到了很好的结局。但是公司周报没有办法上到云,只能离线。所以这种云笔记的方式是没有办法解决周报搜索的需求的。所以需要找到一款离线的笔记软件。


二、笔记软件安装及说明

离线笔记软件多为开源的,并且有很多。离线笔记软件里我选择的是“思源笔记”。思源笔记支持windows,MacOS,Linux系统,因为我们公司电脑平台和系统很杂,这点思源软件很友好。同时支持完全离线使用,同时也支持端到端加密同步。

下载地址:https://b3log.org/siyuan/download.html

我是windows系统,下载到自己电脑后,需要用“管理员身份运行”。

打开后需要新建笔记本。在“文档树”→“更多”→“新建笔记本”→取名“周报”→“确定”。

正面.png

640.png

正面.png

查看“周报”→“更多”→“导入”。发现笔记本是可以导入的。

640.png

这里就关键了,可以导入“SiYuan.sy.zip”,这说明如果别人把文件打包整理好,那么我们是可以坐享其成的,把打包好文件导入。

其次,可以导入“Markdown文档”,也就是说我们可以把自己做好的markdown文档导入进来。

还可以导入“Markdown文件夹”,也就是说,我们如果一个文件夹内都是markdown文件,那么就不用一个一个导入了,直接指定文件夹就可以了。

那么这里我们就基本清晰了,如果没有别人打包好的文件,那么就要自己搞markdown文件,markdown一种轻量级标记语言,word通过工具是可以转换成markdown文件的。

那么我们现在的任务就是把上面的周报docx文件,批量的转换为markdown文件就好了。

正面.png


三、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.运行结果如下

640.png

生成目录就是原来的目录,想筛选的话就文件夹搜索.md就好了。

640.png


其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文件。先不用脚本,手动的先转换试试。

正面.png


但是因为周报有边框,所以输出效果很不好,转换结果是这样的:


 


啥都看不了,所以需要制定输出格式,根据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)

正面.png



3.5 python脚本执行

在cmd中执行命令>python docx2md.py

(因为上面配置docx文件存放dirctory的路径时改了三次,即“E:\\markdown\\2020年\\”、“E:\\markdown\\2021年\\”、“E:\\markdown\\2022年\\”,所以每改一次要执行一次>python docx2md.py命令才能对子文件的转换)

640.png


四、markdown文件夹导入

在思源笔记里导入文件夹,下面以导入2021年的为例:

选择笔记本→“更多”→“导入”→“Markdown文件夹”→选择存放md文件的文件夹。


正面.png

正面.png

640.png


五、笔记本导出

软件可以将自己的笔记本打包转出,“更多”→“导出”→“SiYuan.sy.zip”,点击后软件会调用浏览器的下载器,保存笔记本名字的.sy.zip文件。我这里就是“周报.sy.zip”。我把“周报.sy.zip”剪切到“E:\markdown”文件夹下。


正面.png

六、笔记本导入

笔记本文件的导入。新建笔记本→“更多”→“导入”→“SiYuan.sy.zip”→找到.sy.zip文件(我这里为E:\markdown\周报.sy.zip)。

640.png



正面.png


七、笔记本搜索功能

选中笔记本→“更多”→“搜索”→填写要搜的关键词→点击搜索结果可以预览上下文。

640.png


640.png

相关文章
|
11月前
|
Linux iOS开发 MacOS
DeepSeek爆火,如何免费部署到你的电脑上?获取顶级推理能力教程来了
如何在本地电脑上免费部署DeepSeek,获取顶级推理能力?只需三步:1. 访问Ollama官网下载并安装对应操作系统的版本(支持macOS、Linux和Windows)。2. 打开Ollama并确保其正常运行。3. 在Ollama官网搜索并选择DeepSeek模型(如deepseek-r1),根据电脑配置选择合适的模型大小(1.5B至671B)。通过终端命令(如ollama run deepseek-r1:1.5b)运行模型,即可开始使用DeepSeek进行推理。退出模型时,在终端输入/bye。更多详情请参考Ollama官方文档。
|
Linux 数据安全/隐私保护 Android开发
10 个最佳 Linux 开源笔记软件
10 个最佳 Linux 开源笔记软件
1108 1
|
机器学习/深度学习 人工智能 程序员
大模型时代的思考:小心陷入ChatLLMs构建的蜜糖陷阱-基于人类反馈的间接(反向)驯化-你是否有注意到?
本文探讨了大模型基于人类反馈训练的原理及其潜在风险,特别是大模型在迎合用户需求时可能带来的“蜜糖陷阱”。通过实际案例分析,强调了理性使用大模型的重要性,提出了保持批判性思维、明确人机协作边界、提升人类判断力和创新能力等建议,旨在让大模型真正为人类服务,而不是限制人类思维。
328 4
|
安全 算法 应用服务中间件
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】 【可验证】 详细描述TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。
10188 2
|
Java 开发者 Spring
深入解析 @Transactional:Spring 事务管理的艺术及实战应对策略
深入解析 @Transactional:Spring 事务管理的艺术及实战应对策略
212 2
|
监控 NoSQL Linux
在Linux中,出现脑裂的是什么原因?
在Linux中,出现脑裂的是什么原因?
|
编解码 人工智能 物联网
CogVLM2: 智谱开源新一代多模态大模型!
智谱·AI推出了新一代 CogVLM2 系列模型,并开源了使用 Meta-Llama-3-8B-Instruct 构建的两个模型。 与上一代CogVLM开源模型相比,CogVLM2系列开源模型有了很多改进...
|
机器学习/深度学习 JavaScript 算法
流程引擎的架构设计
流程引擎的架构设计
流程引擎的架构设计