管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

WordとExcelをPowershellからPDF化してみる

Powershellだと、再帰的にファイルを探索して、それぞれに対して処理させる、というのが楽そうだったので、WordとExcelをPowershellからPDF化してみる。

コード

param(
    [string]$filename    # 処理対象ファイル名
)

# エラーがあった時点で処理終了
$ErrorActionPreference = "stop"

function script:getPDFFileName($filename) {
    # 元のファイル名.pdfで元ファイルの場所にPDF保存
    return (Join-Path (Split-Path -Parent $filename) (Get-Item $filename).BaseName) + ".pdf"
}

function script:doExceltoPDF($filename) {
    $excel = New-Object -ComObject Excel.Application
    # Excelを画面上には表示させないが、警告メッセージは表示
    $excel.Visible = $false
    $excel.DisplayAlerts = $true
    $book = $excel.Workbooks.Open($filename)

    # 元のファイル名.pdfで元ファイルの場所にPDF保存
    $pdfFilename = getPDFFileName $filename

    # 全ページをPDF化する
    # 印刷範囲を加味する
    $xlTypePDF = 0
    $xlQualityStandard = 0
    $book.ExportAsFixedFormat($xlTypePDF, $pdfFilename, $xlQualityStandard, $true, $false)

    # エクセルを閉じる
    $book.Close($false)
    $book = $null
    $excel.Quit()
    $excel = $null
}

function script:doWordtoPDF($filename) {
    $word = New-Object -ComObject Word.Application
    # Wordを画面上には表示させない
    $word.Visible = $false

    # 2個目の引数:変換ダイアログの要否、3個目の引数:読み込み専用か否か
    $doc = $word.Documents.Open($filename, $false, $true)

    # 元のファイル名.pdfで元ファイルの場所にPDF保存
    $pdfFilename = getPDFFileName $filename

    $wdExportFormatPDF = 17
    $wdExportOptimizeForPrint = 0

    # 全ページを印刷に最適化してPDF化
    $doc.ExportAsFixedFormat($pdfFilename, $wdExportFormatPDF, $false, $wdExportOptimizeForPrint)

    # ワードを閉じる
    $word.Documents.Close($false)
    $word.Quit()
    $word = $null
}

function script:Main($filename) {
    $fileExtension = (Get-Item $filename).Extension

    If ($fileExtension -like "*xls*") {
        echo "excel"

        doExceltoPDF $filename
    }
    ElseIf ($fileExtension -like "*doc*") {
        echo "word"

        doWordtoPDF $filename

    }
}

Main $filename

実行例

PS C:\Users\hoge\Documents\Powershells> .\ファイルを判定して実行.ps1 "C:\Users\hoge\Desktop\ページ高さチェック.xlsx"
excel

PS C:\Users\hoge\Documents\Powershells> .\ファイルを判定して実行.ps1 "C:\Users\hoge\Desktop\1ページ縦.docx"
word