異邦人になってみた~上海の人blog

上海在住です。上海情報満載です。また中国時代劇をよく見ています、中国旅行の事、weiboやQQの設定、一眼レフカメラの写真掲載、上海での日々の生活情報を書いています

 このブログについて(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以外にも使えそうですね。