こんにちは、すごい改善のAitoです。
さてさて、本日の話題はPDFとパスワードについてです。それぞれ単体では仕事でもプライベートでもよく使うことでしょう。しかし組み合わせるとなると……特にWindowsデフォルト環境下においてはちょっとどころではなく困りものです。今回はPDFファイルにパスワードを付けたいという課題について考えていきましょう。デフォルト環境では対応しきれない部分も多いため、フリーソフトを使ったら便利ですね。特に暗号に関わる部分は非専門家が自分で書くのは逆に危険なので信頼のおけるソフトの利用を強くおすすめします。
1. パスワード付きZIP化
そもそもなぜパスワード付きPDFが必要なのでしょう。パスワードが重要で、アクセス権を持った人だけが見ることができれば形式は何でもよいという方は多い気がします。それならばパスワード付きZIPでもいいのでは……?ということでExcelからパスワード付きZIPを作成する方法を解説していきます。
使用するのはこちら。
・7-Zip
言わずと知れた老舗アーカイバです。様々な形式に対応していますし、速いです。7-ZipをVBAからコマンドラインで呼び出して使用する方法を検討しましょう。
例えばこんな場合を考えてみます。
A列にZIP化したいファイルの名前が入っており、B列にそのファイルをZIP化した際にかけるパスワードが入っています。すべてのファイルに対してパスワード付きZIPを作成したいケースを考えます。
7-Zipの呼び出しコマンドは次のように仕様が定められています。
[7-Zipのプログラム本体があるパス] a -mem=AES256 -ssw -p[パスワード] [ZIP化後のファイル名] [ZIP化したいファイル名]
従来の方式では暗号化しても容易に解読ができてしまうため、より強固なAES-256形式での暗号化をおすすめします。
さて、コマンドをVBAから呼び出して使うことにしましょう。自動化とCLIは相性が良いですね。コーディングするとこのようになります。
Option Explicit
Sub ZIP化_7zip()
Dim folderPath As String: folderPath = ThisWorkbook.Path + "\"
Dim objWSH As Object, objwExec As Object, Result As String
Set objWSH = CreateObject("WScript.Shell")
Dim cmd As String
Dim i As Long
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
cmd = "%ComSpec% /c " + Chr(34) _
+ """C:\Program Files\7-Zip\7z.exe""" _
+ " a -mem=AES256 -ssw -p" + CStr(Cells(i, 2).Value) _
+ Space(1) _
+ Chr(34) + folderPath + GetFileNameWithoutExtention(CStr(Cells(i, 1).Value)) + ".zip" + Chr(34) _
+ Space(1) _
+ Chr(34) + folderPath + CStr(Cells(i, 1).Value) + Chr(34) _
+ Chr(34)
Set objwExec = objWSH.Exec(cmd)
Do While objwExec.Status = 0
DoEvents
Loop
Result = objwExec.StdOut.ReadAll
Debug.Print Result
Next
Set objwExec = Nothing
Set objWSH = Nothing
End Sub
Function GetFileNameWithoutExtention(ByVal fileName As String) As String
Dim rightPoint As Long
Dim ret As String
rightPoint = InStrRev(fileName, ".")
ret = Left(fileName, rightPoint - 1)
GetFileNameWithoutExtention = ret
End Function
ちょこっとだけ解説すると、WScriptというものを使ってコマンドプロンプトに実行するファイル(今回は7-Zip)に対するコマンドを投げることができるんです。CreateObject(“WScript.Shell”)がその機能の呼び出しですね。今回はパスワードを付けて圧縮するコマンドを使いました。コマンドの仕様などはこちらをご覧ください。
https://7-zip.opensource.jp/howto/dos-command-password.html
他にもLhaplusを使う方法もありますので、興味を持たれた方・環境がそちらの方は調べてみてください。
ここまで読んで、フリーソフト以外の解決手段はないのか!と思われた方もいらっしゃるでしょう。Windowsのデフォルト環境で作成出来たら良かったのですが、Windows Vista以降パスワード付きZIPを作る機能が廃止されたんです。デフォルトのままで…となると環境自体をアップデートした方がよいです。ExcelにこだわりがなければPythonなど別の言語を用いて作ることもできます。ここはお好みで。
2. どうしてもパスワード付きPDFを作らざるを得ない場合
2.1. Adobeの環境が使える場合
どうしてもパスワード付きPDFを作らなければならない場合が出てきた時を想定しましょう。Acrobat Proを契約している場合はアクションウィザードを使ってください。ただし、個別にパスワードを設定したいなど細かなカスタマイズをしたい場合は、javascriptを書くことになるため対応できない場合は別の手法を考える必要があります。今回はjavascriptがメインではないので解説は省略します。
もしくはAdobe Acrobat Services APIの利用を検討してください。こちらも別言語での実装となるため、わからない場合は後述する方法を検討ください。
2.2. Wordを使う方法
次はWordを使う方法です。Wordはデフォルトでパスワード付きPDFの出力に対応しています。ExcelからデータをWordに貼り付けて出力すればお目当てのパスワード付きPDFが出来上がるというわけです。こちらはVBAで操作することができないようなので、手動でやる必要があります。ルーティンワーク以外のスポット作業で使ってもよいかもしれません。詳細はこちらをご覧ください。
2.3. フリーソフトを使う方法
お次はExcelからPDFとして出力してその後そのPDFにパスワードを付加する方法について考えてみましょう。フリーソフトを使う方法です。
今回はPDF出力がメインではないのでそこまで丁寧に記載しないため、もしPDF出力についてもっと知りたいという方はこちらをご覧ください。
https://excel-ubara.com/excelvba1/EXCELVBA439.html
https://tech-paclab.com/exportpdf/
事前準備として、pdftkというソフトをダウンロードします。このソフトは昔から使われているものです。インストールするのが嫌だという方はPortable版を調べてみましょう。せっかくなので今回はPortable版で作ってみることにします。
https://portableapps.com/apps/office/pdftk_builder_portable
ここからPortable版をダウンロードして、ダウンロードされたexeファイルを実行して解凍します。インストール先とか出てきますが、気にせずそのまま解凍してください。
こんな感じになりますかね。
では、作っていきましょう。Excelファイルはこんなのを用意してみました。
PDFの出力範囲はこんな感じにしました。
PDF出力してパスワード付加するところまで作っていきましょうか。
VBAはこのように書けます。ここでもWScript.Shellが登場していますね。よく使います。
Option Explicit
Sub ExportAndAddPassword()
Call ExportPDF
Call AddPassword("1234") 'ここでは1234に設定
End Sub
Sub ExportPDF()
Dim ws As Worksheet: Set ws = Worksheets(1)
ws.ExportAsFixedFormat Type:=xlTypePDF
Set ws = Nothing
End Sub
Sub AddPassword(ByVal password)
Dim pdftkPath As String: pdftkPath = """C:\PDFTKBuilderPortable\App\pdftkbuilder\pdftk.exe"""
Dim inputFile As String: inputFile = Chr(34) + ThisWorkbook.Path + "\PDF化してパスワード付与.pdf" + Chr(34)
Dim outputFile As String: outputFile = Chr(34) + ThisWorkbook.Path + "\PDF化してパスワード付与_pw.pdf" + Chr(34)
Dim objWSH As Object, objwExec As Object, Result As String
Dim cmd As String
Set objWSH = CreateObject("WScript.Shell")
cmd = "%ComSpec% /c " + Chr(34) + pdftkPath + " " + inputFile + " output " + outputFile + " user_pw " + password + Chr(34)
Set objwExec = objWSH.Exec(cmd)
Do While objwExec.Status = 0
DoEvents
Loop
Result = objwExec.StdOut.ReadAll
Debug.Print Result
End Sub
出力されたファイルを開こうとするとパスワードを求められます。上手くパスワード付加できていますね!1234と入力すると開きます。
3. まとめ
以上、Excelをパスワード付きPDFにする手法についてざっくりと解説しました。PDFは専用のソフトウェアを使って処理することが望ましいです。一番のおすすめは2.3のフリーソフトを使う方法です。悩んでいる方がいらっしゃったら参考になれば幸いです。
ではまた別の記事でお会いしましょう!最後まで読んでいただきありがとうございました。