Kindle書籍PDF化完全ガイド|読んだ本を自分の知識に

Kindle書籍PDF化完全ガイド|読んだ本を自分の知識に


Kindleでの読書は、リアルの本にない魅力があります。重さに制限されない、スマホで読むことができるので時間があれば読書できるといった点です。中でも最大の魅力は「簡単にデータベース化できる」こと。

ハイライトやメモをダウンロードできるので読書後にまとめて自分にとって使える内容として資料化することも可能です。今回はさらに一歩進んで、書籍全文を取り込んでデータ化できる方法があるときいたのでAIを使って実装。Macに標準でついてくるアプリ「Automator」(オートメーター)で取り込むことにしました。

この方法は自分で使うために行う作業です。公開したり提供したりすると著作権に抵触するので気をつけてください。あくまで自己使用の範囲でお願いします。

Kindleで読む良さ。デジタルの利点

  • 電子化されていることが最大のメリット
  • 紙の書籍を裁断して取り込む方法はやめた
  • 書籍全体を取り込むから早く読める

電子化されていることが最大のメリット

Kindleのアプリで読書する最大の利点は、書籍データが電子化されている点です。「当たり前でしょ」と言われそうですが、紙では絶対に得られない良さはまさにこの点。デジタルで提供されることが、このあとの「自己資本化」に必須だからです。

自己資本化とは、デジタルデータを知的保管庫にためていき必要なタイミングで取り出したり活用したりすることです。AIの登場によって取り出し・活用が容易になった現在、知的保管庫の中身を以下に充実させるかが重要になっていると感じています。

知的保管庫としはGoogleドライブやOneDriveばかりではなく、NotionやObsidian、メモなど様々なツールがあります。状況によって使い分けしていきますが、共通していることは「保存できるのはデジタルデータ」であること。いかに効率的にデジタルデータに変換して知的保管庫に入れていくかが課題になってきます。

紙の書籍を裁断して取り込む方法はやめた

紙の書籍であっても、裁断してPDF化すれば似たような効果を得られます。ただ裁断は大きな裁断機や手間が必要で、さらにPDF化するためにスキャナも必要です。

実際にこの方法に取り組んだこともありましたが、以下の5つの点からやめました。

紙の書籍をPDF化するのをやめた5つの理由

  • 裁断の作業に手間がかかる
  • 裁断した後の紙の形が、きれいにそろわない。大きさが微妙に違う
  • ゴミが出る。裁断したあとの本を捨てるのが大変
  • スキャナに裁断後の本をセットするのが大変。本の厚さによってトレイに一度に載せられない
  • 使っていなときの裁断機とスキャナは意外と大きくて、邪魔

いや、マジで裁断って大変なんです。大きくて重たい裁断機を引っ張り出して力を込めて本を切る。この作業をしないといけないだけで心理的ハードルが20階建てのビルぐらい高くなります。

面倒くさい=やらない

現物の本は読み終えると売ることができます。しかし裁断したら、売るのは難しくなります。紙でも電子でも費用は同じどころか電子の方が安いことだってあります。それなら「最初から電子データで購入すれば楽だしお得」だではないでしょうか。

書籍全体を取り込むから早く読める

今回の電子化では書籍全体をPDFにします。全ページを取り込むので、読み漏らしても大丈夫。この安心感があることで得られたメリットがあります。それは本を読むスピードが早くなったことです。

本を読むスピードが早くなった理由

本を読むスピードが早くなった最大の理由は「読みたいと思ったところだけ読む」という読み方が、ちゅうちょなく出来るからです。

全体が残っているので「もったいない」気持ちになりません。書籍は物理的に存在しないので、読み残した本が、たくさんあっても部屋は狭くもなりません。

今必要なところしか読まない=全部を読まない=読むところが少ない=速い!

「読みたいところだけ読む」という方法は、本をたくさん読むための手段としてよく紹介されています。それでも実践できていなかったのは「全部読まないと損する気がする」ためでした。

全文保存しておけば「損する」こともありませんし、必要なところだけ安心して読めます。これは大きなメリットです。

気になるところだけ読む

私が実践する読書法は、次のような感じです。対象はあくまでビジネス書などで、小説のように最初から読まないといけない本は別です。

私の読書法

  1. 1. 気になるタイトルの本を選ぶ
  2. 2. はしがきなど冒頭部分を読む
  3. 3. 目次を見て、面白そうなところを探す
  4. 4. 読みたいと思う部分から読み始める
  5. 5. 気になる部分にはハイライトを引き、メモを取る
  6. 6. 全体を電子化する
  7. 7. ハイライトとメモを取り込む

1〜5までは紙の書籍をパラパラめくり、気になるところに線を引いたり付箋を付けたりする読み方と同じです。

保存作業で記憶に定着

読書法のうち「6. 全体を電子化する」、「7.ハイライトとメモを取り込む」は、NotionやObsidianなど知的保管庫に保存するために必要な手作業です。若干面倒ですが、この作業が書籍の内容を記憶に焼き付けるのに有効だと感じています。

「6. 全体を電子化する」はKindle書籍を全ページスクリーンショットで撮影し、PDFに変換していく作業です。Macの標準ソフトAutometorにプログラムを書き込んで自動化の仕組みを構築。PDF変換は手作業で進めます。あえて手作業なのは、全部の画像を1つのPDFにしないためです。あまりに巨大なPDFを作ってしまうとテキスト読み取りが不正確になったり読み取れなかったりするリスクがあります。そのため取り込んだ画像を適当に分けて複数のPDFファイルを作成します。

「7.ハイライトとメモを取り込む」は、Obsidianというソフトのプラグインで自動的に取り込みます。

AIを使ってPDFをテキスト化しても、誤記なく取り込むことはまだまだ難しいのが実情。それでも書籍の文章をそのまま取り込もうとした段階で間違いに気づけば、原文と照らし合わせることで修正できます。

一方で間違えたまま文章を要約させると、さらに間違いが広がり、事実誤認がないか、解釈違いはないかを確認する作業が大変になります。

Kindle書籍の電子化はAIで解決

  • Kindle書籍電子化の流れ
  • Autometor(オートメーター)を開く
  • クイックアクションにするスクリプトを書く
  • クイックアクションの使い方
  • PDF化できれば取り込みが容易に

Kindle書籍電子化の流れ

Kindle書籍の電子化の流れは次の通りです。

  1. 1.kindleアプリで、取り込みたい書籍を開き、表紙を表示して全画面表示にする。
  2. 2. 取り込む書籍の画像を保存するためのフォルダをつくる。
  3. 3. 保存先のフォルダを右クリック。クイックアクションで取り込み開始。
  4. 4. 保存先フォルダ、連番の桁数、ページ数などを答えていき設定。
  5. 5. 作成された画像ファイルを20〜30個選択して右クリック > クイックアクションから「PDF作成」。全画像をPDF 化するまで繰り返し。

1.で全画面表示にするのはスクリーンショットを撮るためです。クイックアクションが起動すると自動的に一番前にKindleが表示される設計にしています。

鍵は、「3. 保存先のフォルダを右クリック。クイックアクションで取り込み開始。」です。この部分のスクリプトはネット情報で得たスクリプトを素に、ChatGPTで改良してもらいました。

Autometor(オートメーター)を開く

Autometorとは、Macに標準で搭載されている自動化ツールです。

アップル公式のユーザーガイドで紹介されている使い方は以下の3点。

  • 繰り返してやる作業を自動化する
  • 自分独自の作業手順を自動化してもらう
  • ショートカットアプリに取り込んで使うことができる

ざっくりいうと「2回以上繰り返す作業なら自動化することで楽ができる」というアプリです。

クイックアクションにするスクリプトを書く

アップル公式のAutometor概要のページを読むと簡単使えそうなアプリです。

Automatorでは、複雑なプログラミング言語やスクリプト言語の知識がなくても自動化を設定できます。

Automatorユーザガイド

確かにゴリゴリのプログラマーから見ればそうかもしれませんが、こっちは遥かにレベルの低い一般人。鵜呑みにしてはいけません。素人をなめんなよ!

こんな弱者の最強の味方が「ChatGPT」などの生成AI。この最強の生成AIバフ(ゲーム用語。キャラクターの能力を一時的に強化する効果のこと)を使えば、シン・プログラミング素人でも本当に簡単にAutometorも使うことができます。

実際に、「kindle書籍の全ページをスクリーンショットを自動で撮影する」スクリプトを作成できました。

完成したスクリプトは以下の通りです。このスクリプトをAutometorに貼りつけてクイックアクションを作ります。

(*
  Kindle Auto Screenshot – Quick Action(選択名フォールバック付き)
  - 送り: keystroke (ASCII 28/29)
  - タイトル初期値: Kindleから取得 → 失敗なら Finderの選択項目名 → p
  - 入力 → 確認 → Kindleへ切替 → 本文フォーカス → %内側トリミングした矩形を -R で撮影 → ページ送り
  必要権限: アクセシビリティ / 画面収録 に Automator / Automator Runner
*)

on run {input, parameters}
	try
		-- ==== 既定値 ====
		set defaultSave to POSIX path of (path to desktop folder) & "kindleShot/"
		set defaultPages to 10
		set defaultWait to 1.0 -- 初期値 1.0
		set defaultPrefix to "p"
		set defaultStart to 1
		set defaultDigits to 4
		set defaultCrop to "" -- "1600x2200" 等。空で無効
		
		-- ウィンドウ内側の%トリミング
		set leftPct to 5
		set rightPct to 5
		set topPct to 6
		set bottomPct to 6
		
		-- ==== タイトル初期値の決定 ====
		-- 1) Kindleから(取れなければ空文字のまま)
		set guessTitle to ""
		my bringKindleToFront()
		if my waitFrontmost("Kindle", 2.0) then
			delay 0.3
			set guessTitle to my getKindleTitleBasic()
		end if
		set guessTitle to my sanitizeFilename(guessTitle)
		
		-- 2) Finderの選択項目名(Quick Actionの input)でフォールバック
		if guessTitle = "" or guessTitle = "Kindle" or guessTitle = "Amazon Kindle" then
			set selName to my selectionNameFromInput(input)
			if selName ≠ "" then set guessTitle to selName
		end if
		
		-- 3) それでもなければ p
		if guessTitle = "" then set guessTitle to defaultPrefix
		
		-- Finderへ戻す(以降ダイアログ表示)
		try
			tell application "Finder" to activate
		end try
		
		-- ==== 入力ダイアログ ====
		set saveAlias to choose folder with prompt "保存先フォルダを選択(例: " & defaultSave & ""
		set saveDir to POSIX path of saveAlias
		do shell script "/bin/mkdir -p " & quoted form of saveDir
		
		set prefix to text returned of (display dialog "保存名(ファイル名の先頭)を入力" default answer guessTitle buttons {"キャンセル", "OK"} default button "OK")
		set prefix to my sanitizeFilename(prefix)
		
		set pages to (text returned of (display dialog "撮影ページ数" default answer (defaultPages as text) buttons {"キャンセル", "OK"} default button "OK")) as integer
		
		set dirChoice to choose from list {"次へ(右→)", "前へ(左←)"} with title "ページ送り方向" with prompt "Kindleのページ送り方向を選択" default items {"次へ(右→)"} OK button name "OK" cancel button name "キャンセル"
		if dirChoice is false then error number -128
		set goRight to false
		set dirText to (item 1 of dirChoice) as text
		if dirText begins with "次へ" then set goRight to true
		
		set pausetime to (text returned of (display dialog "1ページごとの待機秒数(秒)" default answer (defaultWait as text) buttons {"キャンセル", "OK"} default button "OK")) as real
		
		set startNo to (text returned of (display dialog "連番の開始番号" default answer (defaultStart as text) buttons {"キャンセル", "OK"} default button "OK")) as integer
		set padDigits to (text returned of (display dialog "連番の桁数(例: 4 → 0001)" default answer (defaultDigits as text) buttons {"キャンセル", "OK"} default button "OK")) as integer
		
		set cropText to text returned of (display dialog "中央トリミング『幅x高さ』(例: 1600x2200)未入力でなし" default answer defaultCrop buttons {"スキップ", "OK"} default button "OK")
		set doCrop to false
		set cropW to 0
		set cropH to 0
		if cropText is not "" then
			set AppleScript's text item delimiters to {"x", "×", "X"}
			set tItems to text items of cropText
			set AppleScript's text item delimiters to ""
			if (count of tItems) = 2 then
				try
					set cropW to (item 1 of tItems) as integer
					set cropH to (item 2 of tItems) as integer
					if cropW > 0 and cropH > 0 then set doCrop to true
				end try
			end if
		end if
		
		-- ラベル
		set dirLabel to "前へ(左←)"
		if goRight then set dirLabel to "次へ(右→)"
		set cropLabel to "なし"
		if doCrop then set cropLabel to ((cropW as text) & "x" & (cropH as text))
		
		-- 確認
		set summary to "保存先: " & saveDir & return & ¬
			"保存名: " & prefix & return & ¬
			"ページ数: " & pages & return & ¬
			"送り: " & dirLabel & return & ¬
			"待機: " & (pausetime as text) & "" & return & ¬
			"連番: " & my zpad(startNo, padDigits) & " から" & return & ¬
			"中央トリミング: " & cropLabel & return & ¬
			"ウィンドウ内側トリミング(%): L" & (leftPct as text) & " R" & (rightPct as text) & " T" & (topPct as text) & " B" & (bottomPct as text)
		display dialog summary buttons {"キャンセル", "開始"} default button "開始" with title "Kindle自動スクショ"
		
		-- ==== 撮影 ====
		my bringKindleToFront()
		if my waitFrontmost("Kindle", 3.0) is false then
			display alert "Kindleに切替できませんでした" message "Kindleを一度クリックしてから再実行してください。" as warning
			error number -128
		end if
		
		-- 読書ビューへフォーカス(中央クリック)
		set {xPos, yPos, wSize, hSize} to my getKindleRect()
		set cx to xPos + (wSize div 2)
		set cy to yPos + (hSize div 2)
		try
			tell application "System Events" to click at {cx, cy}
		end try
		
		-- 送りキー(ASCII 28/29
		set keychar to (ASCII character 28)
		if goRight then set keychar to (ASCII character 29)
		
		-- %内側トリミング → -R 矩形
		set trimL to (wSize * leftPct / 100) as integer
		set trimR to (wSize * rightPct / 100) as integer
		set trimT to (hSize * topPct / 100) as integer
		set trimB to (hSize * bottomPct / 100) as integer
		set x2 to xPos + trimL
		set y2 to yPos + trimT
		set w2 to wSize - (trimL + trimR)
		set h2 to hSize - (trimT + trimB)
		if w2 < 100 then set w2 to 100
		if h2 < 100 then set h2 to 100
		set rectStr to (x2 as text) & "," & (y2 as text) & "," & (w2 as text) & "," & (h2 as text)
		
		delay pausetime
		
		repeat with i from startNo to (startNo + pages - 1)
			set spath to saveDir & prefix & my zpad(i, padDigits) & ".png"
			do shell script "/usr/sbin/screencapture -x -R " & rectStr & " " & quoted form of spath
			if doCrop then
				do shell script "/usr/bin/sips -c " & cropH & " " & cropW & " " & quoted form of spath & " --out " & quoted form of spath
			end if
			tell application "System Events" to keystroke keychar
			delay pausetime
		end repeat
		
		return input
		
	on error errMsg number errNum
		if errNum is -128 then return input
		display alert "エラー (" & errNum & ")" message errMsg as critical
		return input
	end try
end run

-- ===== Utilities =====

-- Kindleを前面化
on bringKindleToFront()
	try
		do shell script "/usr/bin/open -a " & quoted form of "Kindle"
	end try
	tell application "Amazon Kindle" to activate
	delay 0.5
	try
		tell application "System Events" to set frontmost of process "Kindle" to true
	end try
end bringKindleToFront

-- 前面化待ち
on waitFrontmost(procName, timeoutSec)
	set t0 to (current date)
	tell application "System Events"
		repeat
			if exists process procName then
				if frontmost of process procName is true then return true
			end if
			if ((current date) - t0) > timeoutSec then exit repeat
			delay 0.1
		end repeat
	end tell
	return false
end waitFrontmost

-- Kindleウィンドウ矩形
on getKindleRect()
	tell application "System Events"
		tell process "Kindle"
			repeat 30 times
				if (count of windows) ≥ 1 then exit repeat
				delay 0.1
			end repeat
			set {xPos, yPos} to position of window 1
			set {wSize, hSize} to size of window 1
			return {xPos, yPos, wSize, hSize}
		end tell
	end tell
end getKindleRect

-- Kindleから基本的なタイトル取得(失敗しやすいが試す)
on getKindleTitleBasic()
	try
		tell application "System Events" to tell process "Kindle"
			if (count of windows) > 0 then
				set t to (name of window 1 as text)
				if t ≠ "" and t ≠ "Kindle" and t ≠ "Amazon Kindle" then return t
				set t2 to value of attribute "AXTitle" of window 1
				if t2 ≠ "" and t2 ≠ "Kindle" and t2 ≠ "Amazon Kindle" then return t2
			end if
		end tell
	end try
	return ""
end getKindleTitleBasic

-- Quick Actionの input から“選択項目名”(拡張子は除く)を取得
on selectionNameFromInput(theInput)
	try
		if theInput is missing value then return ""
		set theItem to item 1 of theInput
		set p to POSIX path of theItem
		-- basename && 拡張子除去
		set base to do shell script "/usr/bin/basename " & quoted form of p
		set nameNoExt to do shell script "/bin/echo " & quoted form of base & " | /usr/bin/sed -E 's/\\.[^.]+$//'"
		return my sanitizeFilename(nameNoExt)
	on error
		return ""
	end try
end selectionNameFromInput

-- ファイル名に安全な文字へ
on sanitizeFilename(t)
	try
		if t is missing value then return ""
	end try
	set s to t as text
	set s to my replaceText(s, " - Kindle", "")
	set s to my replaceText(s, " — Kindle", "")
	set s to my replaceText(s, " – Kindle", "")
	set bads to {"/", ":", "*", "?", quote, "<", ">", "|"}
	repeat with ch in bads
		set s to my replaceText(s, (ch as text), "_")
	end repeat
	set s to my replaceText(s, return, " ")
	set s to my replaceText(s, linefeed, " ")
	try
		set s to do shell script "/bin/echo " & quoted form of s & " | /usr/bin/tr -s ' ' | /usr/bin/sed -e 's/^ *//' -e 's/ *$//'"
	end try
	return s
end sanitizeFilename

on replaceText(str, find, repl)
	set AppleScript's text item delimiters to find
	set parts to text items of (str as text)
	set AppleScript's text item delimiters to repl
	set newstr to parts as text
	set AppleScript's text item delimiters to ""
	return newstr
end replaceText

on zpad(n, digits)
	set s to n as text
	set zeros to "00000000000000000000"
	if (length of s) ≥ digits then return s
	set k to digits - (length of s)
	return (text 1 thru k of zeros) & s
end zpad

実装手順

LaunchpadやアプリケーションフォルダからAutometorを起動します。最初に現れる画面で、左下の「新規書類」をクリックして、先程コピーしたスクリプトを貼り付けます。

続く画面で、以下の通りに設定。

  • ワークフローが受け取る現在の項目:ファイルまたはフォルダ
  • 検索対象:Finder.app

下の白いブロックにスクリプトを貼り付けたら保存。これで完成です。

Screenshot

クイックアクションの使い方

Autometorで自動化処理が終わったら実装できています。

Finderの任意のフォルダ上で右クリックし、「クイックアクション」を選ぶと「Kindle Auto Screenshot」という項目がでます。これが表示されれば成功です。

Screenshot
  1. 1. kindleアプリで書籍を開いてページ数とページをめくる向きを確認する。
  2. 2. アプリを全画面表示して書籍の最初のページを表示する。
  3. 3. Finderに任意のフォルダをつくる。
  4. 4. フォルダ上で右クリックし「Kindle Auto Screenshot」をクリック

その後、ページ数やめくる向きを入力するダイヤログが出るので指示に従って入力。入力し終えたらKindleのスクリーンショットがスタートします。

注意点は、kindle書籍のページ数はかならずしも「全ページの数」ではない点。実際には〇〇ページと表示されていても総ページ数はかなり少ないことが多いはずです。これは不要なページが省略されているためです。

実際の総ページ数が何ページかはわからないので、目安として書籍のページ数マイナス数ページとして取り込み、あとでいらないページのスクリーンショットを削除します。

PDF化できれば取り込みが容易に

Kindle書籍の全ページの画像が用意できたら、30ページぐらいを選択して右クリック。同じくクイックアクションからPDFを作成します

画像選択→PDF処理を繰り返し、全ページをPDF化できたらひとまずゴール。あとはこのPDFをChatGPTやGeminiに読ませたり、Notebook LMに入れて要約を作らせたりすれば文章をテキスト化できます。

テキスト化さえ終わればもう立派なデジタルデータ。使うのも引き出すのも容易です。検索もコピーも思うがまま。あとはどう使うかだけです。

私の使い方については、別の記事でご紹介します。今回はここまでです。

Kindle書籍PDF化完全ガイドのまとめ

  • Kindle書籍をPDF化し、知識としてデータベース化することが目的である
  • デジタル化した書籍を、自身の知的財産として活用する「自己資本化」を提唱
  • 紙書籍の裁断スキャンは手間がかかるため、電子書籍の活用が合理的である
  • 全文データ化の安心感から「読みたい箇所だけ読む」という効率的な読書が可能になる
  • 必要な部分に絞って読むことで、結果的に読書スピードが向上する
  • PDF化への手作業が、書籍内容の記憶を定着させる効果を持つ
  • Macの標準アプリ「Automator」を用いてスクリーンショット撮影を自動化する
  • Automatorで用いるAppleScriptはChatGPTを活用して作成・改良した
  • Kindleのページ送りとスクリーンショット撮影を連続で実行する仕組みである
  • 作成した自動化処理はFinderの「クイックアクション」から実行可能
  • 保存先フォルダを右クリックし、ページ数などを入力して自動撮影を開始する
  • 撮影後の画像ファイルは、複数に分けて手動でPDFファイルへ変換する
  • PDF化したデータはAIでテキスト化し、検索や要あとなどに活用できる
  • この手法は著作権に配慮し、あくまで個人的な利用範囲に限定されるべきである
  • Kindleの表示ページ数と実際の総ページ数が異なる場合があるため注意が必要