リンクをクリップボードにコピー
コピー完了
当方、ExcelのVBAにて一括印刷ツールを作成しております。
検索してなかなか情報にたどりつけなかったので、こちらにご質問させていただきます。
ExcelのVBAからPDFのパスワード有無を判定できる方法を探しています。
ご存じの方、ご教示いたたければ幸いです。
当方の環境は
Acrobat Reader DCのバージョン
2021.005.20060
Excelのバージョン
Office365 MSO 16.0.13127.21698 64ビット
です。
VBAでページ数を取得は、VBscript.RegExpで可能でした。
以下VBAコードは
Sub PDFページ数カウント()
Dim RegExp As Object, xFileNum As String, xStr As String
Set RegExp = CreateObject("VBscript.RegExp")
RegExp.Global = True
RegExp.Pattern = "/Type\s*/Page[^s]"
xFileNum = FreeFile
Open ("※PDFファイルパス") For Binary As #xFileNum
xStr = Space(LOF(xFileNum))
Get #xFileNum, , xStr
Close #xFileNum
Debug.Print RegExp.Execute(xStr).Count
Set RegExp = Nothing
End Sub
VBA印刷は、Wscript.Shellで可能でした。
以下VBAコードは
Sub PDF印刷()
Dim Fso As Variant, FName As String, WSH As Variant
Dim printPdf As String
Set Fso = CreateObject("Scripting.FileSystemObject")
FName = "※PDFファイルパス"
printPdf = "AcroRd32.exe /h /p " & FName
Set WSH = CreateObject("Wscript.Shell")
WSH.Run (printPdf)
Set Fso = Nothing
Set WSH = Nothing
End Sub
VBA側より、PDFファイルのファイルパスワードがかかっているか、かかっていないか
判定できる方法はありますでしょうか?かかっていない場合は印刷し、かかっている場合は印刷しない処理に進みます。
VBscript.RegExp で行うのか、Wscript.Shellで行うのかまったく情報がありません。
ご返信お待ちしております。
リンクをクリップボードにコピー
コピー完了
VBAについては全くの門外漢なのですが、そのスクリプト自体はPDFファイルをダイレクトに参照して中身を検索しているのですよね?
EncryptがかかったFileStream中ではキーワードが引っかかりませんから意図通りにページ数が取得できなければスクランブルがかかっていると判断できそうです。というかEncryptで検索してもいいかもしれません。
ひとつ申し添えておくとPDFのページ数カウントは「Type Pages」をカウントするだけでは不十分です。バージョンやシリアライズの有無によってはCountキーワードを参照したりType Pagesに続く行のCountを参照したりといくつかを併用する必要があるでしょう。
リンクをクリップボードにコピー
コピー完了
Ten A様
ご返信ありがとうございます。
Encryptで検索したところ、パスワードがかかっているものに対してはヒットし、かかっていないものは0で、判別できました。ありがとうございました。
ページ数取得に関しては、まだ検証していませんが試してみます。
誠に感謝しております。