🫣

PDF からコピーしたフォント情報をコマンドラインからサクッと確認する

2023/10/26に公開

Adobe Reader などの PDF ビューワで文字列をコピーすると、テキスト情報なども一緒にクリップボードに格納されるので、Microsoft Word に貼り付けてどんなフォントが使われているのか調べるという小技があります。
それだけでも十分に便利ではありますが、Word の起動がもっさりしていて億劫なのも確かです。たくさん調べるときに 貼り付け→フォントの確認 を繰り返すのも指がつりそうです。

ということで、もっと楽にフォント情報を調べる PowerShell コマンドを作ってみました。

できたもの


ターミナルは WezTerm を使用。

Science のジャーナルのノンブルは MillerDaily 9ポイント Bold スタイルで、ハシラ(柱)は6ポイント Regular スタイル…… みたいな情報がコマンドラインに表示されます。

コード
function Get-ClipboardFontInfo {
    param (
        [switch]$detail
    )
    $cb = [System.Windows.Forms.Clipboard]::GetData([System.Windows.Forms.DataFormats]::Rtf) # クリップボードのデータをリッチテキスト形式で取得
    if (-not $cb) {
        "No Rich Text Data..." | Write-Host
        return
    }
    $rtb = [System.Windows.Forms.RichTextBox]::new() # 不可視のリッチテキストボックスを生成
    $rtb.Rtf = $cb # テキストボックスにコピーした情報を反映
    $font = $null
    for ($i = 0; $i -lt $rtb.Text.length; $i++) {
        $rtb.Select($i, 1) # テキストボックスを1文字ずつ選択していく
        $font = $rtb.SelectionFont # 選択された部分のフォント情報を取得
        if ($detail) {
            $font | Add-Member -MemberType NoteProperty -Name "Text" -Value $rtb.SelectedText # 取得した情報には選択中の文字情報がないので追加しておく
            $font | Write-Output # -detail を付記して実行した場合は全部のデータを表示する
        }
        else {
            # フォント名などの主なデータのみ必要であれば PSCustomObject として返す
            [PSCustomObject]@{
            "Text" = $rtb.SelectedText;
            "OriginalFontName" = $font.OriginalFontName;
            "Size" = $font.SizeInPoints;
            "Style" = $font.Style;
            } | Write-Output
        }
        $font | Clear-Variable -ErrorAction SilentlyContinue # $font 変数をリセット
    }
    $rtb | Clear-Variable -ErrorAction SilentlyContinue # テキストボックスの変数をリセット
}

最後にテキストボックスの変数をリセットしているのはあまり意味がないかもしれません(関数を抜けた時点で変数は解放されるので)。
とはいえ不可視のテキストボックスが居座るようなことになったら寝覚めが悪いので念のための1行です。詳しい人教えてください。

環境:

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.3.8
PSEdition                      Core
GitCommitId                    7.3.8
OS                             Microsoft Windows 10.0.22621
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

PowerShell 7 上で開発しましたが Windows PowerShell でも動作するのを確認しています(他OSは未検証)。

何をやっているのか

  1. (実際には表示されない)リッチテキストボックスを生成する
  2. テキストボックスにコピーした内容を反映させる
  3. SelectionFont プロパティでテキストボックス内のカーソル位置のフォント情報を取得できるので、カーソルを1文字ずつ動かしながらフォント情報を見ていく

Adobe などのビューワでのコピー動作では、正確にはリッチテキスト形式のデータがクリップボードに格納されています。
なので、.NET の方法でリッチテキストデータをパースしてやればいいわけです。

具体的な使い方

上記コードを script.ps1 などと保存して、

. .\script.ps1

のように読み込んでやると、コンソールを閉じるまで上記の Get-ClipboardFontInfo コマンドを使えるようになります(ドットソース 方式)。

毎回読み込むのが面倒であれば $PROFILE に上記コードを貼り付けてやると簡単です。

Get-ClipboardFontInfo コマンドが有効化されていれば、Get-cli ぐらいまで入力して Tab を押すと補完されるはずです。
あとは、調べたい文字を PDF ビューワ上でコピーして、Get-ClipboardFontInfo を実行すれば、コンソールに情報が表示されます。

Discussion