はじめに
hkob の雑記録の第348回目は、Notion の二つのアップデートです。本記事は2025年ユカスタマスの14日目(2023年ユカスタマスの745日目)の記事になります。
きっかけは学生のアドベントカレンダー
12月の Notion 座談会では、海外のアンバサダー、日本一般、日本学生のアドベントカレンダーを初回しています。今回もいろんな人の使い方が見られて面白かったのですが、その中でかぷちーのさんの記事が話題になりました。
遅くなってしまってすみません!@n_students_jp 主催のアドカレで11日目の記事を書かせていただきました!
— かぷちーの。 (@cappuccino_s26) 2025年12月11日
自分への反省点だらけの記事ですが読んでくだされば嬉しいです😭🙏🏻🙏🏻
【要改善】Notionを活用して大学生活9か月を過ごしてみて。|かぷちーの。 https://t.co/8e64xpkvAu
その中で気になったのは以下の文章でした。
加えることがあるとすれば、レジュメがPDF形式しかない場合。
私はNotionで1枚ずつスライドを表示したい派なので、わざわざPDFダウンロード→ChatGPTでjpegに変換→zipにして保存→Notionに持ってくるとかいう非効率でしかない方法をとっています…。
以前も誰かの記事で同じ話があった気がしますね。座談会の中でも、先日の名刺でファイルアップロードを実装したばかりなので、すぐに作れそうですという話になりました。夜遅かったので、翌朝から実装に入りました。
実装
PDF の取得と定数設定
最初は共有シートから PDF を受け取るようにします。単にアプリとして起動した時には、クリップボードから PDF を取得します。また、いつものように NOTION_API_KEY と data_source_id を記録しておきます。

タイトル入力とページ作成
次にページタイトルを入力します。次に入力したテキストをタイトルとしたページを作成します。後でこのページに block を挿入するので、レスポンスから id (page_id) を取得しておきます。

ページを Notion で開く
ページが作成できたので、レスポンスから取得した url を使って、ページを Notion で開きます。URL scheme を notion に変更して URL を開きます。

PDF を分割して JPEG に変換
次に入力された PDF をページ分割してページごとに JPEG に変換していきます。PDF のページ分割が簡単にできるのがショートカットアプリの便利なところですね。

分割されたページのテキストを取得
次に PDF ページからテキストを取得し、改行文字を \n という文字列に変換します。単体の RichText object の最大サイズが8000バイトなので、先頭の2000文字分だけ取り出しています。真面目にやるなら複数の RichText object の配列に変更するのですが、今回はサボって先頭の2000文字だけの抽出にしています。

FileUpload object の作成
次にファイルをアップロードするための FileUpload object を作成します。指定された upload_url にファイルをアップロードします。その後、ここで取得した id をさまざまな FileObject としてブロックなどに接続します。

ファイルアップロード
ファイルアップロードは非常に単純でフォームで送信するだけです。

追加する ColumnList block の json 作成
ここまで準備できれば、追加する ColumnList block の payload json を作成します。流石にこれは手書きできないので、NotionRubyMapping に作成してもらいます。
# ColumnListBlock を作成 (ImageBlock と ParagramBlock を並べたもの) block = ColumnListBlock.new [ ImageBlock.new("https://cdn.worldvectorlogo.com/logos/notion-logo-1.svg", caption: "Notion logo"), ParagraphBlock.new("abc") ] => NotionRubyMapping::ColumnListBlock- # 適当なページを取得 page = Page.find "https://www.notion.so/abc-2c70ce2a652081599aaec1aabd14434f" => NotionRubyMapping::Page-2c70ce2a652081599aaec1aabd14434f # このページに上のブロックを追加するスクリプトを作成 print page.append_block_children block, dry_run: true #!/bin/sh curl -X PATCH 'https://api.notion.com/v1/blocks/2c70ce2a652081599aaec1aabd14434f/children' \ -H 'Notion-Version: 2025-09-03' \ -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \ -H 'Content-Type: application/json' \ --data '{"children":[{"type":"column_list","object":"block","column_list":{"children":[{"type":"column","object":"block","column":{"children":[{"type":"image","object":"block","image":{"type":"external","external":{"url":"https://cdn.worldvectorlogo.com/logos/notion-logo-1.svg"},"caption":[{"type":"text","text":{"content":"Notion logo","link":null},"plain_text":"Notion logo","href":null}]}}]}},{"type":"column","object":"block","column":{"children":[{"type":"paragraph","object":"block","paragraph":{"rich_text":[{"type":"text","text":{"content":"abc","link":null},"plain_text":"abc","href":null}],"color":"default"}}]}}]}}]}'=> nil
ここでは簡単のために external な画像ブロックにしましたが、今回はこの部分を file_upload に変更すればいいだけです。また、テキストの部分は先ほど取り出した先頭の 2000 文字を置いています。

block の追加処理
最後にこの payload を使って、ブロックを追加します。URL の中に最初に作成した page_id が含まれるので、ここでもテキストを使って page_id の埋め込みをしています。

動作確認
うまく設定できたので、動作確認をしてみました。様子を X にポストしたので、こちらをご覧ください。
昨日の #Notion座談会 でお約束した「PDFtoImageblocks」を朝活で作ってみました。
— hkob|Notion Ambassador (@hkob) 2025年12月12日
1. PDFファイルから共有で実行
2. 入力したタイトルのNotion ページを作成
3. PDFをページごとに分割してJPEGに変換して、抽出したテキストと合わせてページ内に貼り付け#Notion #NotionAPI pic.twitter.com/djd9ZQ8CJW
実際に PC 版の画面では、横に2列で表示されています。無事に動作しているようです。

おわりに
確かに学生に配布された PDF にコメント書きたければこういう形でページが作成されると便利そうだなと思いました。とりあえずこちらからショートカットを配布してみますので、皆さんでブロックの構成などをカスタマイズしてみてください。