異邦人になってみた~~上海生活写真ブログ

中国上海市在住です。もう10年を超えました。休日は星空(天の川)撮影やポートレート撮影等、連休時はカメラを持って中国各地を旅行してます。最近は内モンゴル自治区によく行っています。

 このブログについて(about)
  中国旅行/観光/写真記事一覧(省別)

ワードをPDFに一括で変換する-急がば回れ

ワードをPDFに変換

ワード文章を一括でPDFに変換する必要があり、最初は少なかったので開いてPDFで保存していましたが、だんだん増えてきて。。。
さすがに無理。。。と思い、簡単に実行できるスクリプトが無いか調べてみたところPowerShellというのがよさそうだとわかりました。
別の物をインストールしなくてよい、Windowsに標準で入ってるスクリプトというところが良いですね。
コマンドブロンプトからPowerShellコマンドをたたいてみてPS>になればOKだと思われます。

PowerShellスクリプトの内容

今回はこのスクリプトファイルがある場所からフォルダを検索してWordファイルを見つけたらPDFを作成して保存するようにします。
※Wordファイルは残します。


以下のコマンドでディレクトリを再帰的に検索してWordファイルを探します。
Get-ChildItemコマンドでディレクトリを検索しますコマンドを入れると一覧が出てきますが、そのフォルダの内容だけが出力されます。
これはパラメータで表示内容を変更することができます。

  • Recurse→再帰パラメータ
  • include→拡張子検索パラメータ、複数ある場合はコンマで区切る。

PS> Get-ChildItem -Recurse -include *.doc , *.docx

この結果を変数に入れてループさせます。

その中で、ワードを開いて保存するだけですが、ワードオブジェクトはnew-object -com word.applicationで作れるようです。
Rubyで作成するのとちょっと似てますね。というかどの言語も大体こんな感じですかね

注意点

作っていていくつか問題が出ました。
・WordオブジェクトをQuitしないとプロセスが複数立ち上がり、動作がおかしくなる。いっぱいになるとエラーとなる
・SaveAsの引数はrefにしないとエラーになる
  引数 '1' は System.Management.Automation.PSReference でなければなりません。[ref] を使用してください。
  引数 '2' は System.Management.Automation.PSReference でなければなりません。[ref] を使用してください。
参照渡しが必要なものは明示的に[ref]と入れないと駄目なようです。

という事で10ステップぐらいのスクリプトです。
名前は適当につけてOKですが、拡張子は[ps1]にする必要があります。拡張子を帰るとアイコンがそれ用になると思います。
以下はスクリプトです。

############################################################
#PowerShell Script($PSVersionTable 2.0.50727.8789)
#ワードを開いてPDFで保存する。
#当ファイルを置いた場所からサブフォルダまで再帰的に検索を行う(-Recurse)
#一回目に必要かも?実行ポリシーの変更↓
#      Set-ExecutionPolicy RemoteSigned
#17 wdFormatPDF(PDF形式)SaveAs2の保存形式17
############################################################
#wordオブジェクトの作成
$ObjWord = new-object -com word.application

#ディレクトリ検索
$WdFiles = Get-ChildItem -Recurse -include *.doc , *.docx
foreach($WdFile in $WdFiles)
{
   try
   {
     $Docx = $ObjWord.Documents.OpenNoRepairDialog($WdFile.FullName)
     $Docx.SaveAs2([ref]$wdFile.FullName.Replace($WdFile.Extension,".pdf"),[ref]17)
     $Docx.Close()
     Write-Host "$WdFile.FullName"
   }
   catch
   {
     Write-Host "$error"
   }
   finally
   {
   }
}
$ObjWord.Quit()

※エラー処理は適当です。

カレントディレクトリに置いた場合、
PS D:XXX> .\XXXXXX.ps1
のように頭に.\を入れる必要があるようです。
これでOKですが1ドキュメントに体感1秒ぐらいかかる感じです。


上の2行を変更すればWord以外にも使えそうですね。