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 2010 開発者用リファレンスをHTML形式で”快適に”閲覧す…

    前回の記事で7-Zipを使ってHXS形式のOffice製品のヘルプを解…

  2. Excel

    フォルダ(サブフォルダ含む)内の特定の拡張子のファイルに処理を行うVBAマクロ

    「Wordマクロ サブフォルダ ファイル処理」といったキーワードでのア…

  3. アイコン一覧

    Office 365アイコン(imageMso)一覧(C)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  4. Office関連

    Excel Services JavaScript APIを試してみました(1)

    前回の記事で紹介した「ExcelMashup.com」、このサイトによ…

  5. Office関連

    [Excel Services ECMAScript]jPrintAreaで埋め込んだブック部分のみ…

    jQuery + jPrintAreaを利用して、埋め込んだExcel…

  6. Office関連

    Outlookの連絡先をvcf形式で一括保存する方法

    Outlookの連絡先をvcf形式で保存する場合、通常は「連絡先を v…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP