【Power Shell】自動でPDFファイルを開いて印刷(Microsoft print to PDF)する

背景

PDFを開いて「ファイル」-「プロパティ」-「フォント」を見ると「CIDFont」なるものが設定されており、これが原因であるシステム上でPDFを表示することが出来なかった。

PDFを開いて「Microsoft print to PDF」で印刷しPDFを再作成すると、当該フォントが無くなることが判明した。

前提

1.通常使うプリンタを「Microsoft Print to PDF」にする

2.キーボード入力を自動化させたプログラムをPower Shellで作成し実行する

3.outputフォルダは空にしておくこと
 ※上書き保存確認ダイアログが表示されないようにする為

4.プログラム実行中はパソコン操作を行わない
 ※アクティブウィンドウが変わらないようにする為

手順

1.Power Shellを管理者権限で起動する

2.以下を実行し「実行ポリシーの変更」を行う
┗Set-executionpolicy remotesigned
┗y

3.任意のinputフォルダに印刷対象のPDFを格納する

4.サンプルプログラムを流用してプログラムを作成する
┗inputフォルダとoutputフォルダを修正

5.作成したスクリプトを絶対パス or 相対パスで実行する

●sample.ps1

Add-Type -AssemblyName System.Windows.Forms

# inputフォルダを指定
$inputFolder = "C:\Users\user\Desktop\input"

# outputフォルダを指定
$outputFolder = "C:\Users\user\Desktop\output"

# 対象ファイルのリストを取得
$fileList = Get-ChildItem $inputFolder -Filter *.pdf | Select-Object Name

foreach($fileName in $fileList){

	# 開始日時を出力
	$date = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
	$message = $date + " 開始 " + $fileName.Name
	echo $message

	# ファイルを開く
	$inputFileFullName = $inputFolder + "\" + $fileName.Name
	Invoke-Item $inputFileFullName
	Start-Sleep -s 2
	
	# 印刷ダイアログを開く
	[System.Windows.Forms.SendKeys]::SendWait("^p")
	Start-Sleep -s 2
	
	# ENTERで印刷ボタンをクリック ※サイズが大きいファイルはここで時間が掛かる。念のため15秒とする
	[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
	Start-Sleep -s 15
	
	# 出力するPDFファイル名を指定
	$file = $outputFolder + "\" + $fileName.Name
	[System.Windows.Forms.SendKeys]::SendWait("$file")
	Start-Sleep -s 2
	
	# ENTERで保存ボタンをクリック
	[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
	Start-Sleep -s 2
	
	# 「Microsoft Print to PDF」のプリンタジョブが無くなるまで待つ ※サイズが大きいファイルはここで時間が掛かる。
	do
	{
  		$printJobId = Get-PrintJob -PrinterName "Microsoft Print to PDF" | Select-Object Id
  		$date = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
  		$message = $date + " 印刷中 " + $file
  		echo $message
  		Start-Sleep -s 1
	}
	while (([int]::TryParse($printJobId.Id,[ref]$null)))

	# ファイルを閉じる
	[System.Windows.Forms.SendKeys]::SendWait("^q")
	Start-Sleep -s 2
	
	# 終了日時を出力
	$date = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
	$message = $date + " 終了 " + $fileName.Name
	echo $message
}

実行

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\user> C:\Users\user\Desktop\temp\sample.ps1
タイトルとURLをコピーしました