Office関連

[PowerShell]Word文書の透かし文字を変更するスクリプト

MSDNフォーラム「PowerShellを使って、Word文書の透かし文字を変更したい」、との質問がありました。

すぐに思いつくのは、PowerShellからWordアプリケーションを操作することですが、下記コードのようにCOMオブジェクトの解放処理が必要になるので、非常に冗長です。

function ModifyWaterMarkText($file_path, $new_text){
  $objApp = New-Object -ComObject Word.Application
  $objApp.Visible = $true
  $objDocs = $objApp.Documents #Word.Documents
  $objDoc = $objDocs.Open($file_path) #Word.Document
  $objWin = $objDoc.ActiveWindow #Word.Window
  $objPane = $objWin.ActivePane #Word.Pane
  $objView = $objPane.View #Word.View
  $tmpSv = $objView.SeekView
  $objView.SeekView = 9 #WdSeekView.wdSeekCurrentPageHeader
  $objSel = $objApp.Selection #Word.Selection
  $objHF = $objSel.HeaderFooter #Word.HeaderFooter
  $objShapes = $objHF.Shapes #Word.Shapes
  If($objShapes.Count -gt 0){
    $objShape = $objShapes.Item(1) #Word.Shape
    $objTef = $objShape.TextEffect #Word.TextEffectFormat
    $objTef.Text = $new_text
  }
  $objView.SeekView = $tmpSv
  $objDoc.Close(-1) #WdSaveOptions.wdSaveChanges

  [Runtime.Interopservices.Marshal]::ReleaseComObject($objTef) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objShape) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objShapes) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objHF) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objSel) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objView) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objPane) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objWin) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objDoc) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objDocs) > $null

  [GC]::Collect()
  [GC]::WaitForPendingFinalizers()
  [GC]::Collect()

  $objApp.Quit()
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objApp) > $null

  [GC]::Collect()
  [GC]::WaitForPendingFinalizers()
  [GC]::Collect()
}

ModifyWaterMarkText "C:\wk\SampleWaterMark.docx" "Internal"

すべてのセクションをループさせれば多少はコードが短くなるかと思いましたが↓、やはりこちらも冗長です。

function ModifyWaterMarkText($file_path, $new_text){
  $objApp = New-Object -ComObject Word.Application
  $objApp.Visible = $true
  $objDocs = $objApp.Documents #Word.Documents
  $objDoc = $objDocs.Open($file_path) #Word.Document
  $objSecs = $objDoc.Sections #Word.Sections
  for($i=1; $i -le $objSecs.Count; $i++){
    $objSec = $objSecs.Item($i)
    $objHdrs = $objSec.Headers #Word.HeadersFooters
    for($j=1; $j -le $objHdrs.Count; $j++){
      $objHdr = $objHdrs.Item($j) #Word.HeaderFooter
      $objShapes = $objHdr.Shapes
      If($objShapes.Count -gt 0){
        $objShape = $objShapes.Item(1) #Word.Shape
        $objTef = $objShape.TextEffect #Word.TextEffectFormat
        $objTef.Text = $new_text
        [Runtime.Interopservices.Marshal]::ReleaseComObject($objTef) > $null
        [Runtime.Interopservices.Marshal]::ReleaseComObject($objShape) > $null
      }
      [Runtime.Interopservices.Marshal]::ReleaseComObject($objShapes) > $null
      [Runtime.Interopservices.Marshal]::ReleaseComObject($objHdr) > $null
    }
    [Runtime.Interopservices.Marshal]::ReleaseComObject($objHdrs) > $null
    [Runtime.Interopservices.Marshal]::ReleaseComObject($objSec) > $null
  }
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objSecs) > $null
  $objDoc.Close(-1) #WdSaveOptions.wdSaveChanges
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objDoc) > $null
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objDocs) > $null

  [GC]::Collect()
  [GC]::WaitForPendingFinalizers()
  [GC]::Collect()

  $objApp.Quit()
  [Runtime.Interopservices.Marshal]::ReleaseComObject($objApp) > $null

  [GC]::Collect()
  [GC]::WaitForPendingFinalizers()
  [GC]::Collect()
}

ModifyWaterMarkText "C:\wk\SampleWaterMark.docx" "Internal"

WordやExcelといったOfficeアプリケーションを外部のプログラムから操作する場合、特にPowerShellを使わなければならない理由が無いのであれば、VBSやVBAで処理した方が、個人的には楽だと思います。

参考Webページ

2019年9月の人気記事前のページ

アイカツオンパレード!が始まりました。次のページ

関連記事

  1. Office アドイン

    [Office用アプリ]「ActiveViewChanged」イベントと「getActiveView…

    v1.1で追加された、ビューが変更された時に発生するイベント「Acti…

  2. Office アドイン

    [Office用アプリ]コピー&ペースト用マニフェストファイル

    Office 用アプリを作るとき、過去に作ったアプリのマニフェストファ…

  3. Office関連

    Excel 2016でUTF-8のCSVファイルがサポートされるようになりました。

    Office 2016の10月の機能更新によって、ExcelでUTF-…

  4. アイコン一覧

    Office 2013 アイコン一覧(G)

    ・Office 2013 アイコン一覧 NUM…

  5. Office関連

    [雑感]Office 365 Soloに向く人、向かない人

    ここ一週間ほどOffice 365 Soloを触ってみて、ある程度のこ…

  6. Office関連

    Windows 10 Technical PreviewにOffice XPをインストールしてみまし…

    「最新ビルドを詳細レビュー! Windows 10 Technical…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP