web-dev-qa-db-fra.com

Comment exporter toutes les pages OneNote dans des fichiers de démarques individuels?

Je passe à Linux et le dernier obstacle consiste à sortir de OneNote. J'aimerais exporter tous mes cahiers afin que chaque page soit dirigée vers un fichier de démarquage individuel.

J'ai essayé beaucoup de choses — ce fil avait plusieurs suggestions, mais elles sont toutes dépassées.

Si OneNote pouvait exporter toutes les pages en tant que fichiers .docx individuels, il serait facile d’utiliser pandoc pour les convertir en fichiers de démarquage individuels. Cependant, OneNote n'exportera que plusieurs pages sous la forme d'un seul fichier. Ainsi, une solution consisterait à trouver un moyen d'automatiser l'exportation de chaque page individuellement.

Une autre option consiste à exporter des carnets de notes entiers à la fois sous forme de fichiers .docx, à les convertir en marques de commerce avec pandoc, puis à diviser les fichiers. expressions régulières, et pas assez d'un assistant awk pour le faire sortir des fichiers avec l'expression régulière correcte et complète.

Est-ce que quelqu'un peut m'aider avec ça?

11
Anders

J'ai fini par trouver un pipeline d'exportation, mais c'était pénible. Voici mes notes de le faire:

flux de travail:

  1. Désactivez vos réseaux pour empêcher OneNote d’effectuer une longue synchronisation OneDrive après chaque exportation.

  2. Dans la liste Bloc-notes, développez le bloc-notes pour afficher tous les onglets.

  3. Faites un clic droit sur un onglet et cliquez sur "Exporter ...".

  4. Cliquez sur le menu déroulant et appuyez sur M sélectionner le format .docx. presse Enter pour le sélectionner.

  5. Presse Enter à nouveau pour enregistrer le fichier exporté.

  6. Répétez les étapes 2 à 5 pour chaque onglet du cahier.

  7. Configurez pandoc et ouvrez une fenêtre PowerShell ou cmd.

  8. allez dans le répertoire où se trouvent les fichiers .docx exportés.

  9. Pour chaque fichier .docx exporté, utilisez la commande pandoc suivante pour le convertir en markdown (remplacez journal par le nom de votre fichier):

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

    Voici une explication de la commande: --extract-media='' indique à pandoc d’extraire des images du fichier .docx et de les placer dans le sous-dossier par défaut (nommé 'média' par défaut). --wrap=preserve indique à pandoc de ne pas encapsuler le fichier de sortie avec des sauts de ligne (valeur par défaut). Le champ suivant est le nom du fichier en entrée, et -o signifie "output", donc journal.md est le nom du fichier en sortie.

    Si vous ne souhaitez pas scinder ce fichier (par exemple, si votre onglet ne contient qu'une page), passez à l'étape 15.

    (Lorsque vous faites un tas de ces choses, vous pouvez appuyer sur le bouton  (flèche vers le haut) pour rappeler la commande précédente dans le shell, puis modifiez le nom du fichier.)

  10. Créez un nouveau dossier pour stocker les pages dans l'onglet. Pour cet exemple, toutes les pages de l'onglet Journal de OneNote sont maintenant écrites dans journal.md. Créez un dossier nommé journal qui stockera les dernières pages séparées en tant que fichiers .md individuels.

  11. S'il existe des images dans le fichier .docx, elles seront exportées vers un nouveau dossier appelé media. Faites glisser le dossier multimédia, s'il existe, dans le dossier que vous venez de créer. (C’est la raison pour laquelle nous devons effectuer chaque opération pandoc séparément, car chaque exportation créera un dossier multimédia distinct, et nous voulons les garder séparés afin que les liens dans les fichiers de démarquage fonctionnent correctement. Nous pourrions écrire un script astucieux pour faire tout cela. automatiquement, mais cela prendra moins de temps pour le faire manuellement, sauf si vous avez un grand nombre de cahiers.) (Remarque: vous pouvez enregistrer une étape en plaçant le nom de pli souhaité dans les guillemets simples de l'argument --extract-media='', pour les fichiers .docx avec images, un dossier sera créé automatiquement pour vous.)

  12. Ouvrez un terminal bash et accédez au répertoire contenant le fichier .md. Le dossier que vous avez créé à l'étape 10 doit être un sous-dossier de celui-ci (sauf si vous corrigez le chemin dans la commande suivante).

  13. Si ce n'est déjà fait, cliquez sur l'icône de la fenêtre Bash de Windows, cliquez sur Propriétés, cochez la case Mode d'édition rapide, puis cliquez sur OK. Maintenant, cliquez à nouveau sur l'icône de la fenêtre Bash Windows, cette fois-ci sur Valeurs par défaut, cochez la case Mode d'édition rapide, puis cliquez sur OK (pour que les nouvelles fenêtres Bash que vous créerez à l'avenir se souviendront de ce paramètre). Maintenant, vous pouvez sélectionner du texte dans le terminal et appuyer sur Ctrl+C copier ou cliquez avec le bouton droit de la souris sur la fenêtre du terminal pour coller le texte dans le Presse-papiers. Nous pouvons maintenant préparer notre commande dans un emplacement distinct et coller rapidement chaque version dans Bash.

  14. Personnalisez la commande suivante et exécutez-la pour chaque fichier .md à scinder en pages individuelles:

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

    (Tapez-le sur une ligne.)

    Comme vous pouvez le constater, journal.md est le nom de notre fichier de démarquage (dans le répertoire en cours, noté ./), la deuxième occurrence de journal (après --prefix=') est le nom de notre sous-dossier qui contiendra les fichiers divisés, et journalentry est ce que chaque fichier sera nommé (suivi d'un numéro d'index).

    Si vous souhaitez comprendre la commande, voici une explication: --keep-files imprime quand même des fichiers en cas d'erreur ou si la fin du fichier est rencontrée, en s'assurant que la dernière page sera affichée correctement (car elle ne se termine pas dans le modèle de notre expression régulière). . --prefix définit le schéma de nommage des fichiers de sortie. --suffix-format nous permet de définir notre extension de fichier (.md dans ce cas), mais nous devons inclure %i pour l'instruction sprintf qui fournit le numéro d'index du fichier. --elide-empty-files ignore la sortie des fichiers vides, ce qui nous importe peu. Enfin, l’expression régulière, qui commence par '/ et se termine par /-2', définit le moment de scinder le fichier: elle indique "Lorsque vous recherchez (/) au début de la ligne (^), procédez comme suit (() lundi ou (\ | ) Mardi ou mercredi ou jeudi ou vendredi ou samedi ou dimanche ()) suivi d’une virgule, reculez de deux lignes (-2) "et divisez le fichier à cet endroit, en affichant ce que nous avons jusqu’à présent. Le dernier bit, '{*}', répète indéfiniment la commande précédente jusqu'à la fin du fichier.

  15. Faites glisser les fichiers .docx et .md dans un dossier, par exemple un dossier que vous créez maintenant appelé intermediates. Ou vous pouvez simplement les supprimer. C'est agréable de les sauvegarder pendant un moment, jusqu'à ce que vous soyez à l'aise avec votre nouveau format de fichier, au cas où vous voudriez revenir en arrière et référencer quelque chose qui s'est passé pendant le processus de conversion. Si vous les déplacez dans le dossier des intermédiaires, vous risquez d’oublier où nous en sommes et de répéter les étapes.

  16. Répétez les étapes 9 à 14 pour chaque fichier .docx que vous avez exporté à partir de OneNote.

  17. Vous avez maintenant un dossier pour chaque onglet, avec un tas de fichiers .md séparés, un pour chaque page! De plus, un dossier media dans chaque sous-dossier contenant des images dans l'onglet OneNote.

  18. Je recommande d'exporter chacun de vos blocs-notes OneNote sous la forme d'un fichier .mht (page Web à fichier unique) ou, si vous préférez, d'un .pdf. Ainsi, en cas de perte de formatage ou d'autres informations dans certains de vos fichiers de démarques, en raison de la conversion multiple, vous pouvez toujours revenir en arrière et voir facilement à quoi il était censé ressembler dans le fichier .mht. De plus, je vous recommande d’exporter chacun de vos blocs-notes OneNote sous forme de fichier .onepkg (paquet OneNote). Vous disposez donc d’une copie d’exportation finale Nice si vous souhaitez réouvrir le bloc-notes dans OneNote dans son format de fichier natif utile si, par exemple, le fichier .mht manque également du formatage original que vous souhaitez récupérer).

  19. Lorsque vous avez terminé chaque bloc-notes, cliquez avec le bouton droit de la souris sur le bloc-notes dans OneNote, puis cliquez sur "Fermer ce bloc-notes" pour ne pas le modifier par inadvertance et devoir réexporter vos nouvelles modifications. Pour les dossiers de démarques, j'ai également créé un dossier pour chaque bloc-notes et y ai placé tous les dossiers.

  20. Lorsque vous avez terminé l’ensemble du projet d’exportation, vous pouvez accéder à votre OneDrive et supprimer tous les originaux de bloc-notes OneNote qui ont été synchronisés (assurez-vous de sauvegarder vos propres fichiers maintenant, bien sûr! Il existe OneDrive pour Linux ou pourrait essayer quelque chose comme Syncthing).

  21. Enfin, nous pouvons renommer tous nos fichiers .md en leur titre de page OneNote, qui correspond à la première ligne de chaque fichier, en utilisant deux scripts. Créez les fichiers suivants:

    Fichier 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
    

    Fichier 2: ~/scripts/recurse.sh

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

    Accédez ensuite à votre dossier de notes et exécutez la commande recurse.sh en utilisant la commande rename-files-to-first-line.sh comme argument:

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

    Vous verrez le script parcourir tous vos fichiers de manière récursive, générant des erreurs sur les fichiers avec des premières lignes étranges (qui ne se convertiront pas en nom de fichier) et sur d'autres cas Edge. Toutefois, la commande mv dans rename-files-to-first-line est exécutée avec l'argument -n, ce qui l'empêchera d'écraser des fichiers. Il se peut que certaines notes ne soient pas renommées, car la première ligne qu'elles contiennent est vide ou inhabituelle, mais vous pouvez simplement corriger ces quelques fichiers manuellement.

  22. Imprégnez-vous de votre propre fuite de OneNote.

Mises en garde:

  • Cela ne capture pas les sous-pages, vous devrez les recréer avec des sous-dossiers, si vous le souhaitez.

  • Je ne sais pas à quel point cela se passe bien avec les tables - le démarquage est un peu disgracieux pour les tables de toute façon.

  • Il existe probablement d'autres types de formatage, tels que les polices, qui se perdent ou sont bousillés lors de l'exportation. Mais pour les textes et les images riches, cela fonctionne plutôt bien!

11
Anders

L'autre réponse ne m'a pas aidé, car mes notes ne sont pas des entrées de journal, mais j'ai trouvé une solution utilisant l'API Graph de Microsoft . Cela signifie que vous n'avez même pas besoin d'exécuter OneNote, cela nécessite simplement que vos notes soient synchronisées avec votre compte Microsoft. Vous pouvez ensuite obtenir vos notes au format HTML parfaitement formaté (que vous pouvez visualiser dans le navigateur ou convertir au format de votre choix). en utilisant Pandoc).

La magie se passe dans ce script Python . Il exécute un simple serveur Web local que vous pouvez utiliser pour vous connecter à votre compte Microsoft et télécharge ensuite toutes vos notes au format HTML, ainsi que les images et les pièces jointes dans leur format d'origine, et les stocke dans la hiérarchie des fichiers en préservant la structure d'origine. de vos cahiers (y compris l'ordre des pages et les sous-pages).

Avant de pouvoir exécuter le script, vous devez enregistrer une "application" dans Microsoft Azure afin qu'il puisse accéder à l'API Graph:

  1. Allez à https://aad.portal.Azure.com/ et connectez-vous avec votre compte Microsoft.
  2. Sélectionnez "Azure Active Directory", puis "Enregistrements d'application" sous "Gérer".
  3. Sélectionnez "Nouvelle inscription". Choisissez un nom, définissez "Types de comptes pris en charge" sur "Comptes de tout répertoire d'organisation et comptes Microsoft personnels" et sous "Redirection URI", sélectionnez Web et entrez http://localhost:5000/getToken. Registre.
  4. Copiez le "ID de l'application (client)" et collez-le sous le nom client_id au début du script Python.
  5. Sélectionnez "Certificats & secrets" sous "Gérer". Appuyez sur "Nouveau secret client", choisissez un nom et confirmez.
  6. Copiez le secret du client et collez-le sous le nom secret dans le script Python.
  7. Sélectionnez "Autorisations API" sous "Gérer". Appuyez sur "Ajouter une autorisation", faites défiler la liste et sélectionnez OneNote, choisissez "Autorisations déléguées", puis cochez les cases "Notes.Read" et "Notes.Read.All". Appuyez sur "Ajouter des autorisations".

Ensuite, vous devez installer les dépendances Python. Assurez-vous d'avoir installé Python 3.7 (ou plus récent) et installez les dépendances à l'aide de la commande pip install flask msal requests_oauthlib.

Maintenant, vous pouvez exécuter le script. Dans un terminal, accédez au répertoire dans lequel se trouve le script et exécutez-le à l'aide de python onenote_export.py. Cela démarrera un serveur Web local sur le port 5000.

Dans votre navigateur, accédez à http: // localhost: 50 et connectez-vous à votre compte Microsoft. La première fois que vous le faites, vous devrez également accepter que l'application puisse lire vos notes OneNote. (Cela ne permet à aucun tiers d'accéder à vos données, tant que vous ne partagez pas l'ID et le secret du client que vous avez créés sur le portail Azure). Après cela, retournez au terminal pour suivre la progression.

Remarque: Microsoft limite le nombre de demandes que vous pouvez effectuer au cours d'une période donnée. Par conséquent, si vous avez plusieurs notes, vous pourrez éventuellement voir des messages comme celui-ci dans le terminal: Too many requests, waiting 20s and trying again. Ce n'est pas un problème, mais cela signifie que le processus entier peut prendre un certain temps. En outre, la session de connexion peut expirer après un certain temps, ce qui entraîne un TokenExpiredError. Si cela se produit, rechargez simplement http: // localhost: 50 et le script continuera (en ignorant les fichiers déjà téléchargés).

1
danmou