変更履歴
231108
現在、Pythonのバージョンが3.12だとpipでのインストールに失敗することがあるようです。
バージョン3.10または3.11のPythonを使うのがオススメです。
詳細を記載しました。
インストールの失敗について、ご報告いただきありがとうございました。
230614
Notionデータベース作成の方法に誤りがあったため修正しました。
First
プロパティも、Select
タイプにする必要があります。
ご指摘ありがとうございました。
前置き
私はこんな感じでNotionを使って論文の管理をしているのですが、
その際に使っているPythonプログラムをコマンドラインツールとしてまとめて、配布してみました。
その名も Papnt です。
所詮素人が作ったプログラムなので大目に見てください。
このプログラムを使った結果について、一切責任は取れません。
なにができるの?
- Notionデータベースに論文DOIを入力→
papnt doi
→論文の詳細な情報がデータベースに追加されている! - Notionデータベースに論文PDFをアップ→
papnt pdf
→論文の詳細な情報がデータベースに追加されている! -
papnt paths (論文PDFのパス)
→論文の詳細な情報がデータベースに追加されている! - Notionデータベースのうち引用したい論文にタグをつける→
papnt makebib
→bibファイルが作られている!
以下は使い方です。
Notion側の準備
データベース作成
特定の名前・タイプをもったプロパティから成る、空のデータベースを作ります。
以下の手順に従うと、比較的簡単にできあがります。
まず、以下をコピーし、Notionのどこかのページにペーストしてください。
|Name|First|Year|PDF|Journal|Type|Authors|Title|Cite in|Citekey|Edition|Publisher|Volume|Issue|Pages|Subject|DOI|HowPublished|info|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
||Select|Number|Files & media|Select|Select|Multiselect||Multiselect|||Select||||Multiselect|||Checkbox|
シンプルテーブルが作られるはずです。
このシンプルテーブルについて、OptionからHeader row(行見出し)をオンにします。
右角の3点ボタンから、Turn into database(データベースに変換)します。
1行目に書かれているとおりのプロパティタイプに変更していってください。
たとえば、Yearの列には「Number」と書かれているので、プロパティタイプをNumberにしてください。
1行目に何も書いていない列(プロパティ)はTextタイプのままにしておいてください。
この作業が終わったら、一行目は削除してしまってください。
これで論文情報を記入するデータベースが完成しました。
ここで作った以外のプロパティを持たせても大丈夫です。
例えば、ページを生成した日付などのプロパティがあると便利です。
プロパティの表示順や、表示・非表示設定は自由です。
プロパティの名前を変えていただくこともできます。
しかし、設定のために一手間かかるのでいったんこの名前のまま進めましょう。
Notion APIとの接続
作成したデータベースを、Notion APIで操作できるように設定してください。
詳細は、「Notion API データベース」あたりでググってください。
TokenkeyとDatabase IDを取得し、作成したIntegrationをデータベースにadd connectionできればOKです。
Papntのインストール
pipでインストール
ご自身でPython環境をお持ちでしたら、以下のコマンドでインストール完了です。
% pip3 install git+https://github.com/issakuss/papnt.git@main
いくつかのパッケージがご使用の環境にインストールされるのでご注意ください。
また、Python >= 3.10 が必要です。
現在、Python3.12を使用していると、pipでのインストールに失敗することがあるようです。
3.10か、3.11を使うのがオススメです。
詳細
PDFからDOIを読み取るのにpdf2doiというパッケージを使っています。
このパッケージはPyMuPDF==1.21.0のインストールを指定しています。
(https://github.com/MicheleCotrufo/pdf2doi/blob/master/requirements.txt)
ところが、Python3.12用のwheelは、PyMuPDF==1.23.5まで用意されていないようです。
(https://github.com/pymupdf/PyMuPDF/issues/2723)
そのためPython3.12からですと、sdistを用いてPyMuPDFをインストールすることになります。
この場合、VisualStudioなど、あれこれとソフトが必要になるようです。
(https://github.com/pymupdf/PyMuPDF/issues/2037)
Homebrewでインストール
macOSをご使用でしたら、Homebrewを使って以下のコマンドでインストールするのがオススメです。
% brew install issakuss/papnt/papnt
Python環境ごとインストールするので、面倒なことを考える必要がありません。
ただし、インストールに少々時間がかかります。
私の環境だと6分ほどかかりました。
Papntの設定
papnt
とだけ打って実行すると、以下のようなメッセージが出ます。
表示されたパスにあるconfig.iniを、テキストエディットやメモ帳など、お手元のエディタで開いてください。
以下のように表示されるはずです。
[database]
tokenkey = ''
database_id = ''
[propnames] ; Propety Names
; bib name = property name
; Check bib names: https://ja.wikipedia.org/wiki/BibTeX
; Note that bib names will be used as lower case
doi = DOI
author = Authors
title = Title
edition = Edition
year = Year
journal = Journal
volume = Volume
pages = Pages
publisher = Publisher
ID = Citekey
ENTRYTYPE = Type
howpublished = HowPublished
; Other property
output_target = Cite in
pdf = PDF
[abbr] ; Specifiation of abbreviation
Full Name = Abbreviated
PLOS ONE = PLOS ONE
[misc]
; Directory to save bib files
dir_save_bib = ''
必須項目
以下の2項目には、それぞれNotionデータベースにアクセスするためのTokenkeyとDatabase IDを入力してください。
[database]
tokenkey = secret_vjaQgg2FGGjfaFQFGgagafFgjoiHffaefHFfaeKeeLs
; ↑こんな感じのsecret_から始まる50桁です(適当に作った例です)
database_id = ac4ss3gajfhkga887fav2343tgggaq34
; ↑こんな感じの32桁です(適当に作った例です)
さらに、以下にbibファイルの保存先を指定してください。
[misc]
; Directory to save bib files
dir_save_bib = ''
以下は例です。
[misc]
; Directory to save bib files
dir_save_bib = /Users/issakuss/Desktop
プロパティ名の設定
もしプロパティの名前を変更する場合は、[propnames]
を編集してください。
たとえば、Authors
というプロパティ名をChosya
に変えたい場合は、
author = Chosya
としてください。
コマンドの実行
Terminalなりコマンドプロンプトなりでコマンドを打って使用してください。
papnt doi
データベースに記入されたDOIをもとに、情報を埋めるコマンドです。
これを使うにはまず、データベース内のページにDOIを記入します。
papnt doi
を実行すると、自動で論文情報が入力されます。
情報が埋められると、info
というプロパティに自動でチェックがつきます。
papnt doi
は、DOI
に入力があり、かつinfo
にチェックがついていないページを探します。
そしてヒットしたすべてのページの情報を、入力されたDOIをもとに埋めます。
より詳細な挙動
- Notion APIでデータベースを取得します。
- そこから、
DOI
に入力があり、かつinfo
にチェックがついていないページを探します。 - ヒットしたすべてのページにおいて、入力されたDOIをもとに論文情報を収集します。
DOIから論文情報を収集するのには、crossrefapiを使います。 - 収集した論文情報をNotion Propertyの形に整えます。
- Notion APIを使ってデータベースに反映させます。
papnt pdf
データベースにアップロードされたPDFファイルをもとに、情報を埋めます。
これを使うにはまず、データベース内のページにPDFファイルをアップロードします。
papnt pdf
を実行すると、自動で論文情報が入力されます。
papnt doi
と同様、PDF
にファイルがあり、かつinfo
にチェックがついていないページを探します。
そしてヒットしたすべてのページの情報を、PDFに書かれたDOIをもとに入力します。
PDFからDOIを抽出できない場合があります。
その際は手動でDOIをコピーして、papnt doi
を使用してください。
誤ったDOIに基づいて情報入力してしまうこともあるのでご注意ください。
より詳細な挙動
- Notion APIでデータベースを取得します。
- そこから、
PDF
にファイルがあり、かつinfo
にチェックがついていないページを探します。 - PDFファイルを"you-can-delete-this-file.pdf"という名前でダウンロードします。
このファイルは自動的に削除されます。 - pdf2doiを用いてDOIを抽出します。
- 以降は
papnt doi
の挙動3以降と同様です。
papnt paths
ローカルにある論文PDFファイルのパスを指定すると、その論文の情報をデータベースに追加します。
以下のようにして、論文PDFファイルのパスを指定して実行します。
papnt paths /Users/issakuss/Downloads/sample1.pdf
すると、データベースにページが追加され、情報が入力されます。
PDFのアップロードまではされません。
NotionのAPIに、ファイルアップロード機能がないためです。
複数のファイルをカンマで区切って入力することで、複数の論文をいっぺんに追加することもできます。
papnt paths /Users/issakuss/Downloads/sample2.pdf,/Users/issakuss/Downloads/sample3.pdf
より詳細な挙動
- 入力されたファイルパスをカンマで区切ります。
- それぞれのパスに対して、
papnt pdf
の挙動4以降と同様の処理をします。
papnt makebib
特定のタグをつけた論文からbibファイルを作成するコマンドです。
これを使うにはまず、bibファイルに含めるページのCite in
プロパティに任意のタグをつけます。
たとえば、next-paper
というタグをつけてみましょう。
別のタグ(たとえばlatest-paper
)がついていても問題ありません。
続いて、以下のコマンドを打ちます。
% papnt makebib next-paper
しばらくすると、next-paper.bibという名前でファイルが生成されます。
保存先は、config.iniファイルで指定したディレクトリです。
より詳細な挙動
- Notion APIでデータベースを取得します。
- そこから、指定されたタグのついたページを探します。
- ページに書いてある論文情報をもとにbibファイルを生成します。
さらに、同じディレクトリにnext-paper.jsonというファイルも生成されます。
これには、生成したbibファイルに含まれるすべてのジャーナル名の略称情報が含まれています。
{
"default": {
"container-title": {
"Frontiers in Psychology": "Front. Psychol.",
"Scientific Reports": "Sci. Rep."
}
}
}
たとえばPandocなら、--citation-abbreviations
オプションを使用してこのjsonファイルを指定することで、省略したジャーナル名を参考文献リストに記載することができます。
一部、省略がうまくいかないことがあります。
たとえば「PLOS ONE」が、「PLO ONE」になったりします。
そういったジャーナル名に対応するためには、config.iniに手動で省略形を記載してください。
[abbr] ; Specifiation of abbreviation
Full Name = Abbreviated
PLOS ONE = PLOS ONE
左に省略前のジャーナル名、右に省略後のジャーナル名を書いてください。
jsonファイルの生成に反映されます。
より詳細な挙動
- 生成されたbibファイルを読み込みます。
- bibファイルに含まれるジャーナル名の一覧を作ります。
- 各ジャーナル名について、iso4を使って省略名を生成します。
- config.iniによって指定されている省略名があれば、それをもって上書きします。
- jsonファイルとして出力します。
(おまけ)PDFを副クリックしてNotionデータベースに追加
macOS限定です。
まず、こちらのサイトからGet File Path.action
をDLしてインストールしてください。
ポップアップに従って「他社製のAutomatorアクションを有効にする」にチェックすることが求められます。
私の環境だとなぜかチェックができない(チェックボックスが反応しない)のですが、
Automatorアプリを開き、メニューバー→Automator→他社製のAutomatorアクション… でなんとかなりました。
私の環境だとさらにセキュリティに弾かれたのですが、Terminalから
sudo spctl --master-enable
でなんとかなりました。
一時的にセキュリティが弱められるので、使い方等よくググってからお試しください。
add-pdfs-to-notion-db.workflow.zipをDLして、解凍してください。
workflowファイルをダブルクリックしてインストールしてください。
その後適当な論文PDFを副クリックすると、クイックアクションにNotionDBに追加
が加わっているはずです。
これを実行してみてうまくいくようならそれでOKです。
「command not found: papnt」的なエラーが出ましたら、papntのPATHを設定してやる必要があります。
エラーメッセージにあるワークフローを表示
ボタンを押して、NotionDBに追加.workflow
をAutomatorで編集しましょう。
シェルスクリプトを実行
の項目に注目。
初期設定で、PATH=/opt/homebrew/bin:$PATH
となっています。
/opt/homebrew/bin
にpapntがないと「command not found: papnt」となります。
ご自身の環境のどこにpapntがあるかを調べるために、ターミナルを開いてwhich papnt
をします。
これで出てきたパスから、最後のpapnt
を除いて.workflowファイルを書き換えてください。
たとえば、which papnt
したときに
/opt/homebrew/Caskroom/miniconda/base/envs/papnt/bin/papnt
と表示されたなら、
こうです。
大目に見てください
macOSでのみ動作チェックしたので、Windowsでもうまく動くか未確認です。
もっといろんな環境で確認してからリリース(?)しようかと思ったのですが、
いつまで経っても世に出せなさそうだったので見切り発車です。
うまく動かない旨ご報告いただければ、できるだけ対応します。
時間はかかります。
パソコンに被害を及ぼしうるようなシロモノではないと思うのですが、
所詮シロウトのプログラムなのでご警戒ください。
ご不安であれば、ご自身でコード読み取っていただいて、
使えそうな部分だけピックアップするような形ででも使ってください。
pdf2doi
の限界などのために、誤った論文情報を持ってくるようなことはしばしばあります。
論文情報が正しいかどうか、必ずご自身でご確認ください。