存在问题描述1. 方法一:Python实现(单个文件)1.1 主要思想1.2 代码使用2. 方法二:使用Python的md2notion库(存在问题)2.1 安装2.2 准备参数2.3. 开始上传3. 方法三:使用typora导出word,再将word导入notion(推荐)3.1 下载pandoc方式一:msi下载安装(不推荐)方式二:Zip下载安装(推荐)3.2 设置路径pandoc3.3 使用3.4 批量导出word3.5 批量导入Notion
存在问题描述
Typro不能内嵌图片,导入notion时会出现图片丢失以及将markdown发送给其他人需要附带图片文件夹。
1. 方法一:Python实现(单个文件)
1.1 主要思想
typora 导出 html 的时候不带文档中的图片,不方便个人网站的上传。所以想办法将markdown中的图片转化为base64格式,嵌入到html中,这样就省略的图床的需要,对于图像需要较少的网页,使用很好。
1.2 代码
- 注意:这里定义了默认的起始路径,如果需要,请自行修改,另外,在执行python前,请把cmd的工作路径切换到 typro2word.py 所在的路径。
typro2word.py
import sys import getopt import re import base64 # 将typora的图片嵌入markdown里面的代码 # 参考链接: # https://subce.gitee.io/htmls/essays/typora_base64_html.html if __name__ == "__main__": # 表示参数选项有:-h, -f, -p, --help, --functionname, --partdate,它们相互对应; # 该方法的返回值有两个元素: 第一个是(opt, value)元组的列表, # 第二个是一般参数列表,包含那些没有 '-' 或 '--' 的参数 typora_path = "E:/project/java/heima_JavaWebStart/source_code/day04-Maven&MyBatis/day04-1-Maven/ppt/" # typora 工作路径 try: opts, args = getopt.getopt(sys.argv[1:], "hf:", ["help", "functionname="]) except getopt.GetoptError: print('Error: ***.py -f <functionname> -p <partdate>') print(' or: ***.py --functionname=<functionname> --partdate=<partdate>') sys.exit(2) for opt in opts: if opt[0] == "-f": file_type_name = opt[1].split("/")[-1] file_name = file_type_name[:-3] # md文件文件名 不带后缀 file_folder = typora_path + opt[1][:-len(file_type_name)] + "/" # md文件所在文件夹 #file_folder = "E:/Users/SubChange/OneDrive - zju.edu.cn/CollaborationWork/typora/" + "HTML/" #file_name = "test" file_path = file_folder + file_name + ".md" print(file_path) new_file_path = file_folder + file_name + "_html.md" base64_data_list = [] base64_type_list = [] fig_num = 0 # 同时打开两个,一个读取 一个写入 with open(file_path, 'r', encoding='utf-8') as f1: with open(new_file_path,'w', encoding='utf-8') as f2: while True: line = f1.readline() # 逐行读取 # 正则表达式 pattern1 = re.compile(r'.*!\[.*\](\(.*\.[a-z]*\))') pattern2 = re.compile(r".*<img src=\"(.*\.[a-z]*)\" ([a-z]*=.*;\" />)") matchObj1 = re.match(pattern1, line, flags=0) matchObj2 = re.match(pattern2, line, flags=0) if matchObj1 is None and matchObj2 is None: f2.write(line) elif matchObj2 is None: # matchObj1 line_pre = line[:matchObj1.regs[1][0]].split("![")[0] line_bd = line[matchObj1.regs[0][1]:] img_name = matchObj1.group(1)[1:-1] img_path = file_folder + img_name fig_num = fig_num + 1 try: with open(img_path, 'rb') as fg: image = fg.read() image_base64 = str(base64.b64encode(image), encoding='utf-8') except: image_base64 = "path error" base64_data_list.append(image_base64) base64_type_list.append(img_name[-3:]) line_mid = "[" + str(fig_num) + "]" new_line = line_pre + "![]" + line_mid + line_bd f2.write(new_line) else: img_name = matchObj2.group(1) img_path = file_folder + img_name fig_num = fig_num + 1 try: with open(img_path, 'rb') as fg: image = fg.read() image_base64 = str(base64.b64encode(image), encoding='utf-8') except: image_base64 = "path error" base64_data_list.append(image_base64) base64_type_list.append(img_name[-3:]) line_pre = line[0:matchObj2.regs[1][0]][:-10] line_mid = "[" + str(fig_num) + "]" line_bd = line[matchObj2.regs[2][1]:] new_line = line_pre + "![]" + line_mid + line_bd f2.write(new_line) if line == "": break f2.write("\n") f2.write("\n") for i in range(len(base64_data_list)): if base64_type_list[i] == "svg": # svg f2.write("[" + str(i+1) + "]:data:image/svg+xml;base64,") else: f2.write("[" + str(i+1) + "]:data:image/png;base64,") f2.write(base64_data_list[i]) f2.write("\n") print("")
使用
# python tb.py -f 文件路径 python typro2word.py -f HTML/test.md
参考
2. 方法二:使用Python的md2notion库(存在问题)
md2notion这个库2021年更新
2.1 安装
pip install md2notion
2.2 准备参数
准备以下三个参数和你自己需要上传的MD文件
- [token_v2]
- [page-url]
- […markdown_path_glob_or_url]
python -m md2notion [token_v2] [page-url] […markdown_path_glob_or_url]
- 打开chrome浏览器 登入notion账户,按【F12】-【应用】,在www.notion.so里面的cookie找到【token_v2】
- 点击内容ctrl复制全部(注意它显示不完全,如果不全选 后面的操作就会出错) 找个地方先保存.后面会使用。
- [page-url] 获取你想添加的notion的页面(新建一个空白页然后复制网址)
- …markdown_path_glob_or_url md文件的路径,
- 如 D:\md*.md (上传全部的md文件)
- D:\md\指定名称.md (上传特定的md文件)
2.3. 开始上传
打开cmd输入
# python -m md2notion [token_v2] [page-url] […markdown_path_glob_or_url] python -m md2notion asd12e1qwo12u30912uejlkdsfhj09sd7r20934u12io4jelkqu2f9c0b341c6312123asd1233cd73ecd4qu1io2u3o21iu3asda124xcv543635v14 https://www.notion.so/bc812sadfas9cd11232dsaxzf59d6d09a9 D:\md\*.md
python -m md2notion 3AIdwsEqKhxlf-yR1szZOnniRRjm_mFnUUPhSk5FaZ-zioadu5oC_Ojzx4opeo54NToMDqHXT2tb1OXOvOJV1Ybp6OYgfRoSejnZsITMY4CLlYz00KEm5dMwlRAPRPRb43e2a6 https://www.notion.so/Typro-File-f577d7280c4d457b83ce723c2121087e D:\genghenggao2021\PersonWeb\*.md
等待完成就能在你的notion上看到啦
参考:
3. 方法三:使用typora导出word,再将word导入notion(推荐)
3.1 下载pandoc
- 我安装的是windows版本,这个msi默认会安装在C盘路径下,建议下载zip
方式一:msi下载安装(不推荐)
默认安装在C盘路径下
方式二:Zip下载安装(推荐)
使用此方法较简单
使用typora导出word,图片已经内嵌在word中。
然后将word导入notion。此时导入的页面图片不会丢失
3.2 设置路径pandoc
3.3 使用
点击【文件】-【导出】-【word(.doc)】即可,这样可以导出单个文件
3.4 批量导出word
windows
''' Description: henggao_note version: v1.0.0 Date: 2023-07-12 14:27:46 LastEditors: henggao LastEditTime: 2023-07-12 16:19:12 ''' import os def get_file_name(file_dir): for root, dirs, files in os.walk(file_dir): # 获取当前文件夹的信息 # print(root) # print(dirs) # print(files) for file in files: # 扫描所有文件 if os.path.splitext(file)[1] == ".md":# 提取出所有后缀名为md的文件 # print(root) os.chdir(root) print("转换开始:" + "pandoc " + file + " -o " + os.path.splitext(file)[0] + ".docx") # 使用os.system调用pandoc进行格式转化 # 转换到当前文件夹 # os.system("pandoc " + file + " -o " + os.path.splitext(file)[0] + ".docx") # 转换到指定文件夹 new_file= "D:\桌面\md2word\\" +os.path.splitext(file)[0] + ".docx" # print(new_file) os.system("pandoc " + file + " -o " + new_file) print("转换完成...") if __name__ == "__main__": get_file_name(r"D:\genghenggao2021\Tools") # 修改文件路径
📢📢📢在vscode中使用需要装【vscode-pandoc】插件,记得重启VSCode,运行上述命令即可。
Linux版(未测试)
import os def auto_md_to_docx(file_dir): # 获取当前目录下所有的md文件的路径信息 all_whole_path_files = [] for root, dirs, files in os.walk(file_dir): for file in files: try: if file[-3:] == ".md": file_info = [root+'/', file] all_whole_path_files.append(file_info) except Exception as e: print(e) print("==>", all_whole_path_files) # 将md依次转换为pandoc for file_info in all_whole_path_files: md_file_path_file = file_info[0] + file_info[1] docx_file_name = file_info[1][:-3] + '.docx' docx_file_path_file = file_info[0] + docx_file_name new_command = 'pandoc ' + md_file_path_file + ' -o ' + docx_file_path_file try: result = os.popen(new_command).readlines() if len(result) == 0: print(md_file_path_file, "已经转换为", docx_file_path_file) except Exception as e: print(e) def main(): auto_md_to_docx('.') if __name__ == '__main__': main()
3.5 批量导入Notion
在Notion【Import】,框选几个即可。
参考