xlogI125’s blog

パソコン作業を効率化したい

PowerShell練習 PDFのしおり名としおり移動先ページ番号をCSV形式でクリップボードにコピー

メモ

  • PowerShellで [Interaction]::CreateObject と [Interaction]::CallByName の練習

使い捨てスクリプト

  • PowerShell.exeに貼り付ける場合は Ctrl + V で行う
  • しおりのアクションに「別の文書内のページに移動」は無いと仮定する
  • エラー処理やCOMオブジェクトの解放を気にしてないで練習以外では実行しない
  • Acrobatがバックグラウンドプロセスとして残るのでタスク マネージャーからタスクを終了する
# PowerShell 5.1, Acrobat Standard DC (2022年10月頃), Windows 11

# PowerShell.exeに貼り付ける場合は Ctrl + V で行う

# [ファイル名]
#  "%USERPROFILE%\Desktop\get_bookmark.ps1"
# [エンコード]
#  UTF-8 (BOM付き)

# [ショートカット(.lnk)]
#  リンク先(T):
#   PowerShell.exe -NoLogo -NoExit -NoProfile -ExecutionPolicy RemoteSigned -File "%USERPROFILE%\Desktop\get_bookmark.ps1"
#  作業フォルダー(S):
#   ""

using namespace System.Runtime.InteropServices
using namespace Microsoft.VisualBasic

Set-StrictMode -Version Latest

Add-Type -AssemblyName System.Runtime.InteropServices
Add-Type -AssemblyName Microsoft.VisualBasic

$a = {
  $null | Set-Clipboard

  try {
    $app = [Interaction]::CreateObject("AcroExch.App")
  }
  catch {
    throw
  }

  # Write-Verbose '$app.Show()' -Verbose
  # [Interaction]::CallByName($app, "Show", [CallType]::Method)

  $avDoc = $app.GetActiveDoc()

  if ($null -eq $avDoc) {
    # Write-Verbose '$app.CloseAllDocs()' -Verbose
    # [Interaction]::CallByName($app, "CloseAllDocs", [CallType]::Method)
    # Write-Verbose '$app.Hide()' -Verbose
    # [Interaction]::CallByName($app, "Hide", [CallType]::Method)
    Write-Verbose '$app.Exit()' -Verbose
    [Interaction]::CallByName($app, "Exit", [CallType]::Method)
    [void][Marshal]::FinalReleaseComObject($app)
    throw '$null -eq $avDoc'
  }

  $pdDoc = $avDoc.GetPDDoc()
  $jso = $pdDoc.GetJSObject()

  $console = [Interaction]::CallByName($jso, "console", [CallType]::Get)
  [Interaction]::CallByName($console, "show", [CallType]::Method)
  [Interaction]::CallByName($console, "clear", [CallType]::Method)
  [void][Interaction]::CallByName($console, "println", [CallType]::Method, "// JavaScript デバッガー")
  [void][Marshal]::FinalReleaseComObject($console)

  $bkmRoot = [Interaction]::CallByName($jso, "bookmarkRoot", [CallType]::Get)

  try {
    $bkms = [Interaction]::CallByName($bkmRoot, "children", [CallType]::Get)
  }
  catch {
    [void][Marshal]::FinalReleaseComObject($bkmRoot)
    [void][Marshal]::FinalReleaseComObject($jso)
    [void][Marshal]::FinalReleaseComObject($pdDoc)
    [void][Marshal]::FinalReleaseComObject($avDoc)
    Write-Verbose '$app.Exit()' -Verbose
    [Interaction]::CallByName($app, "Exit", [CallType]::Method)
    [void][Marshal]::FinalReleaseComObject($app)
    throw
  }

  $bookmark = [PSCustomObject[]]::new($bkms.length)

  $pageNumTemp = [Interaction]::CallByName($jso, "pageNum", [CallType]::Get)

  for ($i = 0; $i -lt $bkms.length; $i++) {
    [Interaction]::CallByName($jso, "pageNum", [CallType]::Let, 0)

    # アクションに「別の文書内のページに移動」は無いと仮定する
    [Interaction]::CallByName($bkms[$i], "execute", [CallType]::Method)

    $bookmark[$i] = [PSCustomObject]@{
      PageNum = [Interaction]::CallByName($jso, "pageNum", [CallType]::Get) + 1; 
      Name = [Interaction]::CallByName($bkms[$i], "name", [CallType]::Get)
    }
  }

  [Interaction]::CallByName($jso, "pageNum", [CallType]::Let, $pageNumTemp)

  for ($i = 0; $i -lt $bkms.length; $i++) {
    [void][Marshal]::FinalReleaseComObject($bkms[$i])
  }

  [void][Marshal]::FinalReleaseComObject($bkmRoot)
  [void][Marshal]::FinalReleaseComObject($jso)
  [void][Marshal]::FinalReleaseComObject($pdDoc)
  [void][Marshal]::FinalReleaseComObject($avDoc)
  Write-Verbose '$app.Exit()' -Verbose
  [Interaction]::CallByName($app, "Exit", [CallType]::Method)
  [void][Marshal]::FinalReleaseComObject($app)

Write-Verbose @"
`$bookmark
$(Out-String -InputObject $bookmark)
"@ -Verbose

Write-Verbose @"
Get-Process -Name Acrobat, AcroCEF
$(Out-String -InputObject (Get-Process -Name Acrobat, AcroCEF) -Width 80)
"@ -Verbose

Write-Verbose @"
`$bookmark | ConvertTo-Csv -NoTypeInformation | Set-Clipboard
"@ -Verbose

  $bookmark | ConvertTo-Csv -NoTypeInformation | Set-Clipboard
}

& $a

過去記事

dy100ms.hatenadiary.jp