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日)