And*_*ers 19 export markdown microsoft-onenote microsoft-onenote-2016
我正在转向 Linux,最后一个障碍是退出 OneNote。我想导出我所有的笔记本,以便每个页面都转到一个单独的降价文件。
我尝试了很多东西——这个线程有几个建议,但它们都过时了。
如果我能让 OneNote 将所有页面导出为单独的 .docx 文件,那么使用 pandoc 将它们转换为单独的 Markdown 文件会很容易。但是,OneNote 只会将多个页面导出为一个文件。因此,一种方法是找到一种方法来单独自动导出每个页面。
另一种选择是一次将整个笔记本导出为 .docx 文件,使用 pandoc 将它们转换为 Markdown,然后拆分文件 - 但是,我还不够一个正则表达式向导,无法让 csplit 仅使用其基本的文件来正确剪切文件正则表达式,而没有足够的 awk 向导让它使用正确和完整的正则表达式输出文件。
谁能帮我这个?
And*_*ers 13
我最终找到了一个出口管道,但这很痛苦。这是我这样做的笔记:
工作流程:
关闭网络以防止 OneNote 在每次导出后执行冗长的 OneDrive 同步。
在笔记本列表中,展开笔记本以查看所有选项卡。
右键单击一个选项卡,然后单击“导出...”。
单击文件类型下拉列表并按下M以选择.docx格式。按Enter选择它。
再按Enter一次保存导出的文件。
对笔记本中的每个选项卡重复步骤 2-5。
设置 pandoc 并打开 PowerShell 或 cmd 窗口。
cd 进入导出.docx文件所在的目录。
对于每个导出的.docx文件,使用以下 pandoc 命令将其转换为 Markdown(替换journal为您的文件名):
pandoc --extract-media='' --wrap=preserve '.\journal.docx' -o journal.md
Run Code Online (Sandbox Code Playgroud)
这是命令的解释:--extract-media=''告诉 pandoc 从.docx文件中提取图像并将它们放在默认的子文件夹中(默认名为“media”)。--wrap=preserve告诉 pandoc 不要用换行符硬包装输出文件(这是默认设置)。下一个字段是输入文件名,-o代表“输出”,journal.md输出文件名也是如此。
如果您不想拆分此文件(例如,如果您的选项卡仅包含一页),请跳至步骤 15。
(当你在做一堆这些时,你可以按↑(向上箭头)键来调用 shell 中的前一个命令,然后编辑文件名。)
创建一个新文件夹来存储选项卡中的页面。对于此示例,现在 OneNote 中“日记”选项卡中的所有页面都以journal.md. 创建一个名为的文件夹journal,它将最终分离的页面存储为单独的 .md 文件。
如果文件中有任何图像.docx,这些图像将被导出到一个名为media. 将媒体文件夹(如果存在)拖到您刚刚创建的文件夹中。(这就是为什么我们需要单独进行每个 pandoc 操作,因为每次导出都会创建一个单独的媒体文件夹,我们希望将它们分开以便 markdown 文件中的链接正常工作。我们可以编写一个聪明的脚本来完成所有这些自动完成,但手动完成会花费更少的时间,除非您有大量笔记本。)(注意:您可以通过将所需的文件夹名称放在--extract-media=''参数的单引号中来节省一个步骤- 对于.docx带有图像的文件,将自动为您创建一个文件夹。)
打开 bash 终端并 cd 到包含该.md文件的目录。您在步骤 10 中创建的文件夹必须是该文件夹的子文件夹(除非您在以下命令中修复了路径)。
如果您还没有,请单击 Windows Bash 窗口图标,单击“属性”,选中“快速编辑模式”,然后单击“确定”。现在再次单击 Windows Bash 窗口图标,这次单击 Defaults,选中 QuickEdit Mode,然后单击 OK(这样您将来创建的新 Bash 窗口将记住此设置)。现在您可以在终端中选择文本并按Ctrl+C进行复制,或右键单击终端窗口将文本粘贴到剪贴板中。现在我们可以在单独的位置准备我们的命令,并快速将每个版本粘贴到 Bash 中。
自定义以下命令并为.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(after --prefix=') 是我们将包含拆分文件的子文件夹的名称,并且journalentry是每个文件将被命名的名称(后跟索引号)。
如果你想理解这个命令,这里有一个解释:--keep-files在遇到错误或文件结尾时仍然打印文件,确保最后一页将被正确输出(因为它没有以我们的正则表达式的模式结尾)。--prefix设置输出文件的命名方案。--suffix-format允许我们设置我们的文件扩展名(.md在这种情况下),但我们必须包括%i输出文件索引号的 sprintf 语句。 --elide-empty-files跳过输出我们不关心的空文件。最后,正则表达式,'/以/-2', 定义何时拆分文件:它说“当您在行首 (^) 处找到 (/) 以下 (() 星期一或 (\|) 星期二或星期三或星期四或星期五或星期六或星期日 () ) 后跟一个逗号,后退两行 (-2)" 并在那里拆分文件,输出我们到目前为止所拥有的内容。最后一位,'{*}'无限期地重复上一个命令,直到到达文件末尾。
将.docx和.md文件拖到一个文件夹中,比如说你现在创建的一个名为intermediates. 或者你可以直接删除它们。最好将它们保存一段时间,直到您对新文件格式感到满意为止,以防您想返回并参考转换过程中发生的某些事情。现在将它们移动到中间件文件夹中将有可能忘记我们在哪里并重复步骤。
对.docx从 OneNote 导出的每个文件重复步骤 9-14 。
现在每个选项卡都有一个文件夹,里面有一堆单独的.md文件,每个页面一个!再加上media在每个子文件夹的已在OneNote的标签图像。
我建议将您的每个 OneNote 笔记本导出为一个.mht文件(单个文件网页),或者,如果您愿意,可以将.pdf. 这样,如果您的某些降价文件中的格式或其他信息由于多次转换而丢失,您可以随时返回并轻松查看它在.mht文件中的外观。此外,我建议将您的每个 OneNote 笔记本导出为一个.onepkg文件(OneNote 包),这样如果您想以其本机/原始文件格式在 OneNote 中重新打开笔记本,您就有一个不错的最终导出副本(这可能很有用例如,如果.mht文件还缺少一些您想要恢复的原始格式)。
完成每个笔记本后,在 OneNote 中右键单击该笔记本,然后单击“关闭此笔记本”,这样您就不会意外编辑笔记本而不得不重新导出您的新更改。对于markdown文件夹,我还为每个notebook创建了一个文件夹,并将所有的tab文件夹放在里面。
完成整个导出项目后,您可以转到 OneDrive 并删除所有已在那里同步的 OneNote 笔记本原件(当然,确保您现在正在备份自己的文件!有适用于 Linux 的 OneDrive,或者您可以尝试类似 Syncthing 的东西)。
最后,我们可以使用两个脚本将所有 .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
Run Code Online (Sandbox Code Playgroud)
文件2: ~/scripts/recurse.sh
CDIR=$(pwd)
for i in $(ls -R | grep :); do
DIR=${i%:} # Strip ':'
cd $DIR
$1 # Your command
cd $CDIR
done
Run Code Online (Sandbox Code Playgroud)
然后导航到您的笔记文件夹并recurse.sh使用rename-files-to-first-line.sh命令作为参数运行命令:
$ ~/scripts/recurse.sh ~/scripts/rename-files-to-first-line.sh
Run Code Online (Sandbox Code Playgroud)
您将看到脚本递归地遍历所有文件,在第一行奇怪的文件(不会转换为文件名)和其他边缘情况下抛出一些错误。但是,mv命令 inrename-files-to-first-line是使用参数执行的-n,这将防止它覆盖任何文件。可能有一些笔记没有重命名,因为它们的第一行是空白的或其他奇怪的东西,但您可以手动修复这几个文件。
从 OneNote 中尽情享受。
注意事项:
这不会捕获子页面 - 如果您愿意,您必须重新创建带有子文件夹的子页面。
我不知道它对表格的处理效果如何——无论如何,降价对于表格来说有点难看。
可能还有其他类型的格式,例如字体,在导出时会丢失或搞砸。但是对于富文本和图像,它工作得很好!
另一个答案对我没有帮助,因为我的笔记不是日记条目,但我找到了使用Microsoft's Graph API的解决方案。这意味着您甚至不必运行 OneNote,它只需要将您的笔记同步到您的 Microsoft 帐户,然后您就可以将笔记作为格式完美的 HTML(您可以在浏览器中查看或转换为您喜欢的任何格式)使用 Pandoc)。
神奇发生在这个 Python 脚本中。它运行一个简单的本地网络服务器,您可以使用它登录到您的 Microsoft 帐户,一旦您这样做,它就会将您的所有笔记下载为 HTML,以及原始格式的图像和附件,并将它们存储在保留原始结构的文件层次结构中的笔记本(包括页面顺序和子页面)。
在运行脚本之前,您必须在 Microsoft Azure 中注册一个“应用程序”,以便它可以访问图形 API:
http://localhost:5000/getToken. 登记。client_id到 Python 脚本的开头。secret到 Python 脚本中。然后你需要安装 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脚本就会继续运行(跳过已经下载的文件)。
终于,有人一劳永逸地解决了这个问题。上述所有方法都可能有效,但各有利弊。通过 Evernote 然后是 Notion 或 Jotterpad 进行迁移,或者通过导出为 .mht 或 .xps 文件,然后导出为 .html,然后导出为 markdown 来手动进行迁移,所有这些都有一个缺点,即“复杂”的 Onenote 页面无法复制到可用的版本中。方式:如果页面上随机有一张图像,那么整个 Markdown 文件将是一个表格,在其中工作将是地狱。
SjoerdV 编写了一个您可以运行的 Powershell 脚本,该脚本会将您打开的所有工作簿导出到 .docx 文档,然后将其全部转换为 Markdown,保留整个文件层次结构,保留图像,一切!您可以在这里找到它: https: //github.com/SjoerdV/ConvertOneNote2MarkDown
您所要做的就是:克隆存储库(或从 github 获取 .ps1 文件(powershell 脚本)),转到命令行并转到您拥有该 .ps1 文件的目录,运行它(输入.\ConvertOneNote2MarkDown.ps1),提供您希望将文件拖放到其中的完整目录路径,然后它就会开始为您运行。
不要忘记感谢原作者帮助您摆脱 Onenote 锁定!
缺点:仅适用于Windows...
编辑:忘记添加链接
| 归档时间: |
|
| 查看次数: |
16335 次 |
| 最近记录: |