サクッとできたらいいなということで。
ポイントはこんなとこ。
- ファイルの拡張子をdocxからpdfに変更したパスを作る
- WordのCOMオブジェクトを取得する
- WordのCOMオブジェクトを使ってWord文章のファイルの読み込む
- ExportAsFixedFormat()でPDF形式でファイルを出力する
んで、スクリプトの内容はこんな感じ。
# 読み取るWordの情報を変数に設定する
$source = "C:\Users\tetsuyanbo\Desktop\Sample.docx"
$extension = ".pdf"
$application = $null
#
# ここからWordをPDFに変換する処理
#
try
{
# 拡張子をdocxからpdfに変更する
$target = [System.IO.Path]::ChangeExtension($source, $extension)
# ファイルがある場合は削除する
# ※ファイルを開いている場合は例外が投げられてエラー終了するのは後回しに...
$exist = Test-Path $target
if($exist -eq $true)
{
Write-Host $target は更新したいので削除したわ
Remove-Item $target
}
# WordのCOMオブジェクトを取得する
$application = New-Object -ComObject Word.Application
# Wordの動作を設定する
$application.Visible = $false
# Wordでドキュメントを開く
# ※ドキュメントを閉じる処理はfinallyで実行する
$documents = $application.Documents
$document = $application.Documents.Open($source)
# WordをPDFに変換する
$document.ExportAsFixedFormat($target, [Microsoft.Office.Interop.Word.WdExportFormat]::wdExportFormatPDF)
Write-Host $source を $target に変換したわ
}
catch
{
# エラーメッセージを表示する
Write-Error("Error"+$_.Exception)
}
finally
{
# COMオブジェクトを開放する
# ※ReleaseComObjectは戻り値0を返してくるんだけど
# コンソールに0が表示されるので変数で受け取って表示しないようにする
if($document -ne $null)
{
$document.Close()
$result = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($document)
}
if($documents -ne $null)
{
$result = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($documents)
}
if($application -ne $null)
{
# Wordを閉じる
$application.Quit()
$result = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($application)
}
}
# 実行はおしまい
Write-Host "PowerShellの実行はおしまい"
んで、サンプルデータとしてこんなWordのファイルを用意しといた。
スクリプトを実行するときはこんな感じ。
powershell -ExecutionPolicy Bypass -File Proto.ps1
んで、実行してみるとこんな感じのメッセージが表示されて…
C:\Users\tetsuyanbo\Desktop\Sample.docx を C:\Users\tetsuyanbo\Desktop\Sample.pdf に変換したわ PowerShellの実行はおしまい
ファイルはちゃんとできとる。
PDFのファイルができとるので開いてみるとこんな感じ。
ちなみに、すでにファイルがあった場合でも一応動いてるっぽ。
C:\Users\tetsuyanbo\Desktop\Sample.pdf は更新したいので削除したわ C:\Users\tetsuyanbo\Desktop\Sample.docx を C:\Users\tetsuyanbo\Desktop\Sample.pdf に変換したわ PowerShellの実行はおしまい
そんなこんなで、明日への自分へのメモってことで。


