結城浩の一言
以下の文章は Claude が作成したものです。
macOS: PDFの指定ページをコマンドラインから開くRubyスクリプト(論理ページ、物理ページ) by Claude
2025年7月19日
スクリプト(Previewを使い、論理ページで開く)
#!/usr/bin/env ruby
# PDFファイルの指定ページをPreviewで開くスクリプト
# ショートカットキー(⌘⌥G)を使用してページ移動ダイアログを開く方式
if ARGV.length != 2
puts "Usage: #{$0} <pdf_file> <page_number>"
puts "Example: #{$0} filename.pdf 3"
exit 1
end
pdf_file = ARGV[0]
page_number = ARGV[1]
# ファイル存在確認
unless File.exist?(pdf_file)
puts "Error: File '#{pdf_file}' not found"
exit 1
end
# ページ番号の妥当性チェック
unless page_number.match?(/^\d+$/) && page_number.to_i > 0
puts "Error: Page number must be a positive integer"
exit 1
end
puts "Opening #{pdf_file} at page #{page_number}..."
# PDFファイルをPreviewで開く
system("open", "-a", "Preview", pdf_file)
sleep 0.5 # ファイルが開かれるまで待機
# ショートカットキーを使ったページ移動手順
applescript_commands = [
# Previewアプリをアクティブにする(フォーカス)
"tell application \"Preview\" to activate",
# アプリがアクティブになるまで少し待機
"delay 0.25",
# ⌘⌥G(Command+Option+G)でページ移動ダイアログを開く
# 日本語環境でも英語環境でも同じショートカットが使える
"tell application \"System Events\" to keystroke \"g\" using {command down, option down}",
# ダイアログが開くまで待機
"delay 0.25",
# ページ番号を入力(既存の内容は自動で選択されるので上書きされる)
"tell application \"System Events\" to keystroke \"#{page_number}\"",
# 入力が完了するまで待機
"delay 0.25",
# Enterキー(key code 36)を押してページ移動を実行
"tell application \"System Events\" to key code 36"
]
# AppleScriptコマンドを順次実行
applescript_commands.each do |cmd|
system("osascript", "-e", cmd)
end
puts "Page navigation completed."
スクリプト(Chromeを使い、物理ページで開く)
#!/usr/bin/env ruby
if ARGV.length != 2
puts "Usage: #{$0} <pdf_file> <page_number>"
exit 1
end
pdf_file = ARGV[0]
page_number = ARGV[1]
unless File.exist?(pdf_file)
puts "Error: File '#{pdf_file}' not found"
exit 1
end
# 絶対パスを取得
abs_path = File.expand_path(pdf_file)
# HTMLファイルを生成
html_content = <<~HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PDF Auto Opener</title>
</head>
<body>
<h1>PDF自動オープン</h1>
<p>PDFを開いています...</p>
<a id="pdfLink" href="file://#{abs_path}#page=#{page_number}" style="display: none;">PDF Link</a>
<script>
window.addEventListener('load', function() {
setTimeout(function() {
document.getElementById('pdfLink').click();
document.querySelector('p').textContent = 'PDFを開きました。';
}, 100);
});
</script>
</body>
</html>
HTML
# 一時HTMLファイルを作成
html_file = "/tmp/open-pdf-page-via-html-#{Time.now.to_i}.html"
File.write(html_file, html_content)
# ブラウザでHTMLファイルを開く
system("open", html_file)
# 少し待ってから一時ファイルを削除
sleep 3
File.delete(html_file) if File.exist?(html_file)
(2025年7月19日)