25/07/21 15:30 コード・コマンドを修正しました。
25/07/22 02:50 ファイル名に記号や空白が入っていても動作するよう修正。
試験問題などPDFで見る事が多いと思います。
スマホでは1ページ表示が一般的ですが、
PCでは見開き表示にすることで、1度に2ページ分の情報を表示できるため、
より多くの情報を一度に確認できるというメリットがあります。
ただPDFビューワーの種類によっては
ページとページの間に境界線が入ったり、
左右ページを逆にしたいなど(好みですが)あったりすると思います。
こんな感じの境界線
はじめは気にならなかったのですが、ある時、目についてから
ものすごく気になってしまったので
PDFを見開きで快適に見るためのあれやこれやをやっていけたらと思います。
環境はwindowsです。Macの方はごめんなさい。
SumatraPDFの設定
今回は無料のSumatraPDFというツールを使っていこうと思います。
色々なPDFビューワーを探しましたが、こちらがいろいろカスタマイズ出来て良さそうでした。
ダウンロード&インストールは割愛。
ドキュメントを開くとこんな感じ。
見開きにするのは
ハンバーガーメニュー > 表示 > 見開き を選択。

ちなみにブックビューを選択すると、
表紙が1Pのみ表示になって、以降見開き表示になります。
まあ開くたびに都度やればいいのですが
今回はめんどくさいのでデフォルトで見開き表示になるように設定していきます。
境界線を消す
ではまず境界線を消していこうと思います。
インストール時など特に設定を変えていなければ
以下の場所にSumatraPDF-settings.txtという設定ファイルがあると思います。
C:\Users\[ユーザー名]\AppData\Local\SumatraPDF
これをメモ帳など何でもいいのでエディタで開きます。
FixedPageUI、ComicBookUI の項目にある
PageSpacingというのが垂直、水平方向の余白設定です。
これを0 0にします
FixedPageUI [
TextColor = #000000
BackgroundColor = #ffffff
SelectionColor = #f5fc0c
WindowMargin = 2 4 2 4
PageSpacing = 0 0
InvertColors = false
HideScrollbars = false
]
ComicBookUI [
WindowMargin = 0 0 0 0
PageSpacing = 0 0
]
SumatraPDFを再起動すると、余白が消えているかと思います。
左右ページを逆にする
これは好みですが、左右ページを反転したいときもあるかと思います。
デフォルトの設定だとこの設定がないため、追加していきます。
L58行目付近のShortcutsに以下の設定を追加します。
Shortcuts [
[
Cmd = CmdToggleMangaMode
Key = Shift + M
]
]
Keyはショートカットを割り当てるキーなので、お好みで変えてみてください。
設定を保存してSumatraPDFでショートカットキーを押下すると
見事、左右逆になります!
押下するたびに逆転するので、戻したければもう一度押下でOK。
こちらは以下の記事を参考にさせていただきました。
CmdToggleMangaModeのようなコマンドの本来の使い方は
Ctrl + kでコマンドパレットを呼び出し、そこでコマンドを実行します。
ここから先はお好みで設定してください。
結構、長丁場になると思います。
起動時にデフォルトで見開き表示にする
これはお好み設定ですが、
私のように起動時に毎回ショートカットをたたくのが面倒な人は
こちらもやってみてもらえるといいんじゃないかと思います。
少しだけ複雑になります。
SumatraPDFでは「起動時」に限定した設定項目がないため、
VBScriptを作成して、スクリプトから先程の設定に使ったコマンドを投げていくことにします。
VBScriptの作成
名前は何でもいいので、エディタで新しく拡張子を.vbsとしたVBScriptファイルを作成します。
保存する際にエンコードをシフトJISに設定して下さい。
私はわかりやすいようにSumatraPDF(custom_start).vbsとしました。
作成する場所もどこでもいいですが、これまで同様、SumatraPDF本体のある
C:\Users\[ユーザー名]\AppData\Local\SumatraPDF\に作成しました。
保存する際にエンコードをシフトJISに設定していないと、
EXEファイルへ変換した後、pdfを開く際にエラーが発生します。
VBScriptファイルに以下を記述します。
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject") ' FileSystemObjectを再度利用
Dim strPdfPath
strPdfPath = WScript.Arguments(0)
' 取得したパスがPDFファイルか確認
Dim fileExtension
If objFSO.FileExists(strPdfPath) Then
fileExtension = LCase(objFSO.GetExtensionName(strPdfPath))
Else
' ファイルが存在しない場合(パスが不正など)、拡張子を空にする
' VBScriptが受け取るパスが不正だった場合の最終的なエラー処理
MsgBox "指定されたPDFファイルが見つからないか、パスが正しくありません: " & strPdfPath, vbExclamation, "ファイルエラー"
WScript.Quit
End If
If fileExtension <> "pdf" Then
MsgBox "指定されたファイルはPDFではありません。PDFファイルをダブルクリックしてください。", vbExclamation, "不正なファイルタイプ"
WScript.Quit
End If
' SumatraPDFの実行パスを定義
Const SUMATRAPDF_EXE = "C:\Users\[ユーザー名]\AppData\Local\SumatraPDF\SumatraPDF.exe"
' PDFファイルを開く
objShell.Run Chr(34) & SUMATRAPDF_EXE & Chr(34) & " " & Chr(34) & strPdfPath & Chr(34), 1, False
' SumatraPDFが完全に起動し、PDFが読み込まれるまで待機
WScript.Sleep 500
' 開いているSumatraPDFのインスタンスに対してDDEコマンドを送信
objShell.Run Chr(34) & SUMATRAPDF_EXE & Chr(34) & " -dde " & Chr(34) & "[CmdFacingView][CmdToggleMangaMode]" & Chr(34), 0, False
Set objShell = Nothing
少し解説をすると、SumatraPDFを起動した後、-ddeオプションを使って、
CmdFacingViewとCmdToggleMangaModeのコマンドを実行しています。
起動と同時に-ddeを送るようにも試してみたのですが、
うまく反映されなかったため、sleepを設定しています。
VBScriptからEXEへの変換
SumatraPDFを実行したいときにこのVBSをダブルクリックで実行すればいいのですが
アイコンがVBSだと、ぱっと見で何だかわからないですし
VBSのままだとピン止めできない為、ここではもう一工夫してみようと思います。
VBSをEXEに変換して、ピン止めできるようにしつつ、アイコンをSumatraPDF(任意の物)にしようと思います。
アイコンの抽出(任意)
任意の場所に.ps1という拡張子でファイルを作成しましょう。
これまでと同様の場所にpick_icon.ps1という名前で作成することにします。
# System.Drawing アセンブリをロード
Add-Type -AssemblyName System.Drawing
$exePath = "C:\Users\[ユーザー名]\AppData\Local\SumatraPDF\SumatraPDF.exe"
$outputPath = "C:\Users\[ユーザー名]\AppData\Local\SumatraPDF\SumatraPDF.ico" # 保存したいパスを指定
# アイコンを抽出
$icon = [System.Drawing.Icon]::ExtractAssociatedIcon($exePath)
# アイコンが正常に抽出されたかを確認
if ($icon -eq $null) {
Write-Host "エラー: 指定されたEXEファイルからアイコンを抽出できませんでした。パスが正しいか確認してください。" -ForegroundColor Red
Write-Host "Enterキーを押して終了します。"
Read-Host
exit
} else {
# アイコンをファイルとして保存
$stream = New-Object System.IO.FileStream($outputPath, [System.IO.FileMode]::Create)
$icon.Save($stream)
$stream.Close()
}
ここで一点注意があります
ファイルを保存する際に、エンコードを UTF-8(BOMつき) で保存してください。
BOM付きにしないと実行時エラーになってしまいます。
さて、ファイルが作成出来たら、PowerShellの設定を変更していきます。
まずは管理者権限でPowerShellを起動します。
PowerShellに以下を入力してEnterを押下します。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
すると対話で以下が返ってきます
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"):
Yキーを押下し、Enterで確定します。
... [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
これでPowerShellの設定ができたので、pick_icon.ps1を実行していきます。
pick_icon.ps1 を右クリックし、PowerShell で実行を押下します。
AutoHotKeyの導入
以下のサイトからAutoHotKeyをダウンロード、インストールします。
AutoHotKey v2.0
変換用スクリプト(ahk)の作成
NewScript を選択して、フォルダと虫眼鏡のアイコンを押下し、
SumatraPDFのフォルダを参照します。

ファイル名にconvertなど名前を付けて保存します。(拡張子は自動で付くので不要。ファイル名は任意です。)

Editボタンを押下し、好きなエディタでファイルを開きます。

convert.ahkに以下を記述し、保存します。
; AutoHotkey Script (v2.x)
; VBScriptファイルのパス
vbsFile := "C:\Users\[ユーザー名]\AppData\Local\SumatraPDF\SumatraPDF(custom_start).vbs"
; SumatraPDFの実行パス
sumatraPdfExe := "C:\Users\[ユーザー名]\AppData\Local\SumatraPDF\SumatraPDF.exe"
; DDEコマンド文字列
ddeCommands := "[CmdFacingView][CmdToggleMangaMode]"
; コマンドライン引数を取得し、VBScript用に整形
argsString := ""
if (A_Args.Length > 0) {
; PDFファイルをダブルクリックした場合、A_Args[1]にフルパスが渡されます。
; このパスをそのままVBScriptに渡すことで、スペースなどが含まれていても正しく扱われます。
argsString := A_Args[1]
}
; コマンドライン引数があれば(PDFがダブルクリックされた場合)
if (A_Args.Length > 0)
{
; VBScriptを実行し、PDFパスを引数として渡す
vbsCommand := Chr(34) . "wscript.exe" . Chr(34) . " " . Chr(34) . vbsFile . Chr(34) . " " . Chr(34) . argsString . Chr(34)
Run(vbsCommand, , "Hide")
; VBScriptの処理完了を待機
Sleep 1500
}
else ; コマンドライン引数がなければ(EXEが直接起動された場合)
{
; SumatraPDFを通常起動(ファイル指定なし)
Run(Chr(34) . sumatraPdfExe . Chr(34), , "Hide")
; 起動を待機
Sleep 1000
; 起動したSumatraPDFに対してDDEコマンドを送信
Run(Chr(34) . sumatraPdfExe . Chr(34) . " -dde " . Chr(34) . ddeCommands . Chr(34), , "Hide")
}
ExitApp
後述するCompile実行時に必要なモジュールが足りないというポップアップが出てくるかもしれません。
その場合はポップアップに従いインストールしてください。
VBSからEXEへの変換
上記でInfoにも記載しましたが、
次のようなポップアップが出たらOKを押下してAhk2Exeをインストールしましょう。

すると、Ahk2Exeが立ち上がるので、こちらを使ってVBSからEXEにコンパイルしていきます。

Source (script file) に先程のahkファイルを選択します。
Destination (.exe file)は出力するexeファイルのパス&名前指定なので、これまで同様SumatraPDF本体のある場所にSumatraPDF(custom_start)などの名前で指定します。(こちらも拡張子不要。)
任意のアイコンを設定する
Optionsの Custom Icon(.ico file) の Browse ボタンを押下します。
先程やった、アイコンの抽出で抽出したアイコンを指定して、開くボタンを押下。
すきなアイコンがあればそれを指定してももちろんOK。

指定出来たら、Convert ボタンを押下してコンパイルを実行しましょう。

Successfully のポップアップが表示され、exeファイルが生成されれば完了です!
お疲れ様でした!

もし、アイコンがうまく反映されていない時は?
windowsはアイコンもキャッシュしているので、キャッシュのせいでうまく反映されないケースがあります。
その場合は次の手順を試してみてください
-
タスクマネージャーを開きます(Ctrl+Shift+Esc)
-
「プロセス」タブで「エクスプローラー」を探します
-
右クリックして「再起動」を選択します
これで再度エクスプローラーを開いて、exeのアイコンを確認してみてください。
もしこれでも反映されない場合は、アイコンのパスなどが間違っていないか確認してみてください。
pdfファイルを開いたときに呼び出す
見開きで表示したいpdfファイルを右クリック > プロパティ
プログラム の項目にある変更ボタンを押下します。
.pdfファイルの既定のアプリを選択するというポップアップが出てくるので
一番下までスクロールし、PC でアプリを選択する を押下します。

先程作成したSumatraPDF(custom_start).exeを選択し、開くボタンを押下します。

適用して、OKボタンを押下します。
これでPDFファイルを開いたときに自動的に見開きで表示されるようになりました!
長い旅でしたがお疲れ様でした!
おまけ
見開きで開きたくないファイルを
右クリック > プログラムから開く > SumatraPDF で通常起動ができます。

作成したSumatraPDF(custom_start).exeをタスクバーにでもピン止めしておいて、
そいつを起動してください。
VBScriptの作成の項目で設定した
' ~~ 略 ~~
' 開いているSumatraPDFのインスタンスに対してDDEコマンドを送信
objShell.Run Chr(34) & SUMATRAPDF_EXE & Chr(34) & " -dde " & Chr(34) & "[CmdFacingView][CmdToggleMangaMode]" & Chr(34), 0, False
こちらの部分を CmdFacingView から CmdBookViewに変更してください。
詳しくはこちらのドキュメントを参照。
SumatraPDFの仕様で、最初に表示されるタブとそれ以外のタブが同じClass名となっているため、
最初に表示されるアクティブなpdf以外、自動で反転できなかったです。
おとなしくショートカットを使ってください。
まとめ
今回いろいろ触っていて、後からこうしたい、ああしたいが色々出てきてしまったため
あれやこれやと設定が長くなってしまいました。
SumatraPDF だったり、AutoHotKey は今回初めて触りましたが
まだまだ色々なことが出来そうで、とてもいい経験になりました。





















