如何将所有OneNote页面导出到单个Markdown文件?


14

我正在迁移到Linux,最后的障碍是摆脱OneNote。我想导出所有笔记本,以便每个页面都转到一个单独的markdown文件。

我已经尝试了很多事情 - 这个线程有几个建议,但是它们都已经过时了。

如果我可以让OneNote将所有页面导出为单个.docx文件,则可以使用pandoc轻松将它们转换为单个markdown文件。但是,OneNote将仅将多个页面导出为单个文件。因此,一种方法是找到一种方法来单独地自动导出每个页面。

另一个选择是一次将整个笔记本导出为.docx文件,使用pandoc将它们转换为markdown,然后拆分文件-但是,我不足以使用regex向导来使csplit仅凭其基本内容即可正确剪切文件正则表达式,而awk向导不足以使其使用正确和完整的正则表达式输出文件。

谁能帮我这个?

Answers:


12

我最终找到了一条出口管道,但这很痛苦。这是我这样做的注意事项:

工作流程:

  1. 关闭网络,以防止OneNote在每次导出后执行冗长的OneDrive同步。

  2. 在“笔记本”列表中,展开笔记本以查看所有选项卡。

  3. 右键单击一个选项卡,然后单击“导出...”。

  4. 单击文件类型下拉菜单,然后按M选择.docx格式。按Enter选择它。

  5. 再按Enter一次保存导出的文件。

  6. 对笔记本中的每个选项卡重复步骤2-5。

  7. 设置pandoc并打开PowerShell或cmd窗口。

  8. cd进入导出.docx文件所在的目录。

  9. 对于每个导出的.docx文件,使用以下pandoc命令将其转换为markdown(替换journal为文件名):

    pandoc --extract-media='' --wrap=preserve '.\journal.docx' -o journal.md
    

    这是命令的说明:--extract-media=''告诉pandoc从.docx文件中提取图像,并将其放入默认的子文件夹(默认情况下命名为“ media”)。--wrap=preserve告诉pandoc不要用换行符将输出文件硬包装(这是默认设置)。下一个字段是输入文件名,-o代表“输出”,journal.md输出文件名也是如此。

    如果您不想拆分此文件(例如,如果您的选项卡仅包含一页),请跳至步骤15。

    (在执行这些操作时,可以按(向上箭头)键在外壳中调用上一个命令,然后编辑文件名。)

  10. 创建一个新文件夹以将页面存储在选项卡中。对于此示例,现在在OneNote中将“日记本”选项卡中的所有页面都混在一起journal.md。创建一个名为的文件夹journal,该文件夹将最终分隔的页面存储为单个.md文件。

  11. 如果文件中有任何图像.docx,这些图像将被导出到名为的新文件夹中media。将媒体文件夹(如果存在)拖到刚才创建的文件夹中。(这就是为什么我们需要分别执行每个pandoc操作的原因,因为每个导出都将创建一个单独的媒体文件夹,并且我们希望将它们分开以使markdown文件中的链接正常工作。我们可以编写一个聪明的脚本来完成所有这些操作自动,但除非有大量的笔记本,否则手动进行操作会花费更少的时间。)(注意:您可以通过将所需的文件夹名称放在--extract-media=''参数的单引号中来保存步骤,对于.docx包含图片的文件,将会自动为您创建一个文件夹。)

  12. 打开bash终端,并cd到包含该.md文件的目录。您在步骤10中创建的文件夹必须是该文件夹的子文件夹(除非您在以下命令中修复了路径)。

  13. 如果还没有,请单击Windows Bash窗口图标,单击“属性”,检查“快速编辑模式”,然后单击“确定”。现在,再次单击Windows Bash窗口图标,这次单击Defaults,检查QuickEdit Mode,然后单击OK(这样,您以后创建的新Bash窗口将记住此设置)。现在,您可以在终端中选择文本,然后按Ctrl+ C进行复制,或者右键单击终端窗口以将文本粘贴到剪贴板中。现在,我们可以在单独的位置准备命令,然后快速将每个版本粘贴到Bash中。

  14. 自定义以下命令,然后为.md要拆分为各个页面的每个文件运行该命令:

    csplit ./journal.md --keep-files --prefix='journal/journalentry ' --suffix-format='%i.md' --elide-empty-files '/^\(Monday\|Tuesday\|Wednesday\|Thursday\|Friday\|Saturday\|Sunday\),/-2' '{*}'

    (将其键入为一行。)

    如您所见,journal.md是我们的markdown文件的名称(在当前目录中,由表示./),第二个出现的journal(之后--prefix=')是我们的子文件夹的名称,该子文件夹将包含拆分文件,并且journalentry每个文件将被命名为(后接索引号)。

    如果您想了解该命令,这里有一个解释:--keep-files遇到错误或文件末尾时仍会打印文件,以确保最后一页将正确输出(因为它没有以正则表达式的模式结尾)。--prefix设置输出文件的命名方案。--suffix-format允许我们设置文件扩展名(.md在这种情况下),但是我们必须%i在sprintf语句中包含输出文件索引号的语句。  --elide-empty-files跳过输出空文件,我们不在乎。最后,以开头'/和结尾的正则表达式/-2',定义何时分割文件:它说“当您在(^)行的开头找到(/)时,以下(()星期一或(\ |)星期二或星期三或星期四或星期五或星期六或星期日() ),然后用逗号分隔,退后两行(-2)“,然后在此处拆分文件,输出到目前为止的内容。最后一位'{*}'无限期地重复前一个命令,直到到达文件末尾。

  15. .docx.md文件拖到文件夹中,例如您现在创建的文件夹intermediates。或者,您可以删除它们。最好保存一段时间,直到您对新文件格式感到满意为止,以防您想返回并参考转换过程中发生的事情。现在将它们移至中间体文件夹将无视忘记我们在哪里并重复步骤的机会。

  16. .docx从OneNote导出的每个文件重复步骤9-14 。

  17. 现在,每个选项卡都有一个文件夹,其中有一堆单独的.md文件,每个页面一个!再加上media在每个子文件夹的已在OneNote的标签图像。

  18. 我建议将每个OneNote笔记本导出为.mht文件(“单个文件网页”),也可以将其导出为.pdf。这样,如果由于多次转换而在某些markdown文件中丢失了格式或其他信息,您可以随时返回并轻松查看它在.mht文件中的外观。另外,我建议将每个OneNote笔记本作为.onepkg文件导出(OneNote包),因此,如果您想以其原始/原始文件格式在OneNote中重新打开笔记本,则可以得到一个很好的最终导出副本。例如,如果.mht文件还缺少您要恢复的某些原始格式)。

  19. 完成每个笔记本后,右键单击OneNote中的笔记本,然后单击“关闭此笔记本”,这样就不会意外编辑笔记本,而不必重新导出新更改。对于降价文件夹,我还为每个笔记本创建了一个文件夹,并将所有选项卡文件夹放入其中。

  20. 完成整个导出项目后,您可以转到OneDrive并删除已在那里同步的所有OneNote笔记本原件(当然,请确保您现在正在备份自己的文件!当然,还有适用于Linux的OneDrive)可以尝试类似Syncthing)。

  21. 最后,我们可以使用两个脚本将所有.md文件重命名为其OneNote页面标题,即每个文件的第一行。制作以下文件:

    文件1: ~/scripts/rename-files-to-first-line.sh

    for i in *md ; do mv -n "$i" "$(cat "$i"|head -n1|tr -d '\000-\037[]{}()/\?*')".md; done
    

    档案2: ~/scripts/recurse.sh

    CDIR=$(pwd)
    for i in $(ls -R | grep :); do
        DIR=${i%:}                    # Strip ':'
        cd $DIR
        $1                            # Your command
        cd $CDIR
    done
    

    然后导航到您的notes文件夹并recurse.sh使用以下rename-files-to-first-line.sh命令作为参数运行命令:

    $ ~/scripts/recurse.sh ~/scripts/rename-files-to-first-line.sh
    

    您将看到脚本以递归方式遍历所有文件,在前几行奇怪(不会转换为文件名)的文件上以及在其他情况下引发一些错误。但是,mvin中的命令rename-files-to-first-line使用参数来执行-n,这将防止其覆盖任何文件。可能有一些笔记没有重命名,因为它们的第一行是空白或其他怪异的东西,但是您可以手动修复这几个文件。

  22. 充分利用OneNote进行彻底的逃生。

注意事项:

  • 这不会捕获子页面-如果需要,您将不得不使用子子文件夹重新创建子页面。

  • 我不知道它对表格的处理效果如何—对于表格而言,markdown有点麻烦。

  • 可能还有其他格式设置,例如字体,会在导出中丢失或弄乱。但是对于丰富的文本和图像,效果很好!


1
如果您在OneNote中有附件,将无法正常工作
Nikhil

4
哇,真是一团糟。我应该永远不会开始使用该软件做笔记。感谢您写下所有这些!请注意,截至今天,在macOS下OneNote仍没有导出功能。
slhck

有没有人尝试将由此产生的MD文件导入到Notion中?奏效了吗?
JayPex

同样,如果您在笔记本部分中有数百个页面,每个页面都有一个唯一的标题,那么这是不现实的,仅当您使用了OP使用的特定命名样式时,此方法才有效。我对此表示赞赏。
JayPex

6

另一个答案对我没有帮助,因为我的笔记不是日记条目,但是我找到了使用Microsoft Graph API的解决方案。这意味着您甚至不必运行OneNote,只需要将便笺同步到Microsoft帐户即可,然后便可以将便笺获取为格式完美的HTML(可以在浏览器中查看或转换为所需的任何格式)。使用Pandoc)。

魔术发生在此Python脚本中。它运行一个简单的本地Web服务器,您可以使用它登录到Microsoft帐户,完成该操作后,它将所有笔记以HTML格式下载,并以原始格式下载图像和附件,并将其存储在文件层次结构中以保留原始结构笔记本的数量(包括页面顺序和子页面)。

在运行脚本之前,您必须在Microsoft Azure中注册一个“应用程序”,以便它可以访问Graph API:

  1. 转到https://aad.portal.azure.com/并使用您的Microsoft帐户登录。
  2. 选择“ Azure Active Directory”,然后在“管理”下选择“应用程序注册”。
  3. 选择“新注册”。选择任何名称,将“支持的帐户类型”设置为“任何组织目录和个人Microsoft帐户中的帐户”,然后在“重定向URI”下选择Web并输入http://localhost:5000/getToken。寄存器。
  4. 复制“应用程序(客户端)ID”,然后像client_id在Python脚本开头一样将其粘贴。
  5. 在“管理”下选择“证书和机密”。按“新客户密码”,选择一个名称并确认。
  6. 复制客户端密钥,然后将其粘贴secret到Python脚本中。
  7. 在“管理”下选择“ API权限”。按“添加权限”,向下滚动并选择OneNote,选择“委派权限”,然后选中“ Notes.Read”和“ Notes.Read.All”。按“添加权限”。

然后,您需要安装Python依赖项。确保已安装Python 3.7(或更高版本),并使用命令安装依赖项pip install flask msal requests_oauthlib

现在,您可以运行脚本。在终端中,导航到脚本所在的目录,然后使用来运行它python onenote_export.py。这将在端口5000上启动本地Web服务器。

在浏览器中,导航到http:// localhost:5000并登录到您的Microsoft帐户。首次执行此操作时,您还必须接受该应用程序可以阅读您的OneNote笔记。(只要您不共享在Azure门户上创建的客户端ID和密码,这不会授予任何第三方访问您的数据的权限)。之后,返回终端以跟踪进度。

注意:Microsoft限制您在给定时间内可以执行的请求数量。因此,如果您有很多笔记,您最终可能会在终端中看到如下消息:Too many requests, waiting 20s and trying again.这不是问题,但这意味着整个过程可能需要一段时间。此外,登录会话可能会在一段时间后到期,从而导致TokenExpiredError。如果发生这种情况,只需重新加载http:// localhost:5000,脚本便会继续(跳过已下载的文件)。


更好的简单解决方案,但这是HTML格式的文件,而不是MD
JayPex

1
正如我在答案中简要提到的,您可以使用pandoc将HTML转换为markdown(例如pandoc --from html --to markdown -o output.md input.html)。但是,应注意,并非所有的OneNote页面都可以用markdown完美地表示,因此您可能会丢失一些格式化细节。另外,pandoc支持多种markdown版本,因此您可能需要阅读文档以找到适合您的需求。
danmou

在第一个答案中走很长的路要走之前,当然值得一试。谢谢!
JayPex

4

要将OneNote页面导出到单独的markdown(.md),应安装JoplinEvernote

如该链接中所建议,首先将笔记导入Evernote。然后将所有笔记.enex从Evernote 导出到文件中,然后将其导入Joplin。

乔普林可以选择将注释导出为.md文件。

注意:如果要对笔记进行分组,建议您在Evernote中预先使用标志,因为Evernote在笔记之间保持层次结构的方式与OneNote不同。


1
你太棒了!您的回答启发了我将笔记本部分导入Evernote,然后将它们从Evernote导入Notion!谢谢
JayPex

0

我发现此问题是非程序性的。

TLDR;

将笔记从OneNote导出到Evernote,然后导出到Notion(可选),然后以您选择的格式导出为单个文件。


我一直在努力从Notion导出我的笔记,在线查看会返回一些非常不干净的方法来导出和拆分OneNote页面并将它们转换为md或html文件。真是一团糟!

基本上,您可以非常轻松地将OneNote部分导入到Evernote中,在将Evernote下载到桌面后,这样做非常容易,然后从那里将它们导入到Notion中也同样容易。

请注意,如果您想保持同一个组织,则可能要导入单个节,否则,您可以批量导入所有节,页面将被标记为节名,并且也一直导入到Notion中。

请注意,您需要通过登录Microsoft / Outlook帐户并验证它们是否已使用OneNote 2016同步来同步OneNote笔记本。

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.