Qpdf : PDFにセキュリティを設定するVBA関数

TOP へ > Qpdf  > *


shi002_2048-0001-13_2048

概要

PDFにユーザーパスワード、オーナーパスワードを設定するVBA関数です。印刷、変更、取り出しの可否に関する詳細なセキュリティ情報の設定も行います。

難しいオプション名、形式、順番を気にせずに "Y" , "N" , "1" を指定するだけで設定出来ます。

Acrobat OLE を使わずに Qpdf を使用して行います。

Qpdf : PDFにセキュリティを設定するVBA関数

Qpdf とは

フリーソフト Qpdf を知らない人は先にコチラを御覧ください。

使用上の注意

当関数はQPDFの旧バージョンでの使用を想定しています。新バージョンのQPDFで追加された新オプションを使用すると、エラー扱いになるので、その部分は各自で手修正してご利用下さい。

形式

001 Public Sub qpdfSetEncryption( _ 002 ByRef qpdfPara_Password() As String, _ 003 ByVal qpdfPara_keyLength As Long, _ 004 ByRef qpdfPara_Flags() As String, _ 005 ByVal qpdfPara_InPdfPath As String, _ 006 ByVal qpdfPara_InPdfPassword As String, _ 007 ByVal qpdfPara_OutPdfPath As String, _ 008 ByVal qpdfPara_OrverWrite As Boolean, _ 009 ByRef strErr As String)


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

引数

※以下を見る前に必ずコチラを先に見てください。

  1. 第1引数 : qpdfPara_Password( ) As String  (In)
    • qpdfPara_Password(0):ユーザーパスワードをセット
      PDF文書を開く時に使います。
      未設定は””。
    • qpdfPara_Password(1):オーナーパスワードをセット
      印刷制御、変更不可等のセキュリティ設定に使います。未設定は””。
  2. 第2引数 : qpdfPara_keyLength As Long  (In)
    キーの長さ : 40 , 128 , 256
    のいずれかが必須。
  3. 第3引数 : qpdfPara_Flags( ) As String  (In)
    • キーの長さ=40 の時
      • --print=[yn] : 印刷を
        qpdfPara_Flags(0) = "Y":許可する
        qpdfPara_Flags(0) = "N":許可しない
      • --modify=[yn] : 文書の変更を
        qpdfPara_Flags(1) = "Y":許可する
        qpdfPara_Flags(1) = "N":許可しない
      • --extract=[yn] : テキスト/グラフィックの抽出を
        qpdfPara_Flags(2) = "Y":許可する
        qpdfPara_Flags(2) = "N":許可しない
      • --annotate=[yn] : コメントとフォーム記入と署名
        qpdfPara_Flags(3) = "Y":許可する
        qpdfPara_Flags(3) = "N":許可しない
    • キーの長さ=128 の時
      • --accessibility=[yn] : 視覚障害者へのアクセス
        qpdfPara_Flags(0) = "Y" :許可する
        qpdfPara_Flags(0) = "N" :許可しない
      • --extract=[yn] : テキスト/グラフィックの抽出を
        qpdfPara_Flags(1) = "Y": 許可する
        qpdfPara_Flags(1) = "N": 許可しない
      • --print=print-opt : 印刷アクセスを制御
        qpdfPara_Flags(2) = "3"  下記の値
        1. full:"1".完全な印刷が可能
            高解像度の印刷を意味
        2. low:"2".低解像度の印刷のみを許可
        3. none:"3".印刷を許可しない
      • --modify=modify-opt : 変更アクセスを制御
        qpdfPara_Flags(3) = "5" 下記の値
        1. all:"1".完全な文書の変更を許可
        2. annotate:"2".コメント作成およびフォームの操作を許可
        3. form:"3".フォームフィールドの入力と署名を許可
        4. assembly:"4".文書のアセンブリのみを許可
        5. none:"5".変更を許可しない 
      • --cleartext-metadata : メタデータの暗号化を
        qpdfPara_Flags(4) = "Y":防ぐ
        qpdfPara_Flags(4) = "N":防がない
      • --use-aes=[yn] : AES 暗号化を
        qpdfPara_Flags(5) = "Y":使用する
        qpdfPara_Flags(5) = "N":使用しない
      • --force-V4 : V=4暗号化ハンドラを
        qpdfPara_Flags(6) = "Y": 使用する
        qpdfPara_Flags(6) = "N": 使用しない
    • キーの長さ=256 の時
      • --accessibility=[yn] : 視覚障害者へのアクセス
        qpdfPara_Flags(0) = "Y" :許可する
        qpdfPara_Flags(0) = "N" :許可しない
      • --extract=[yn] : テキスト/グラフィックの抽出を
        qpdfPara_Flags(1) = "Y": 許可する
        qpdfPara_Flags(1) = "N": 許可しない
      • --print=print-opt : 印刷アクセスを制御
        qpdfPara_Flags(2) = "3"  下記の値
        1. full:"1".完全な印刷が可能
            高解像度の印刷を意味
        2. low:"2".低解像度の印刷のみを許可
        3. none:"3".印刷を許可しない
      • --modify=modify-opt : 変更アクセスを制御
        qpdfPara_Flags(3) = "5" 下記の値
        1. all:"1".完全な文書の変更を許可
        2. annotate:"2".コメント作成およびフォームの操作を許可
        3. form:"3".フォームフィールドの入力と署名を許可
        4. assembly:"4".文書のアセンブリのみを許可
        5. none:"5".変更を許可しない
      • cleartext-metadata : メタデータの暗号化を
        qpdfPara_Flags(4) = "Y":防ぐ
        qpdfPara_Flags(4) = "N":防がない
      • --use-aes=y : AES 暗号化の使用は256ビットキーでは常にオン
        qpdfPara_Flags(5) = "Y":固定 
      • --force-V4 : 256ビットでは利用不可
        qpdfPara_Flags(6) = "N":固定
      • --force-R5 : 非推奨のR=5暗号化を
        qpdfPara_Flags(7) = "Y":使用する
        qpdfPara_Flags(7) = "N":使用しない
  4. 第3引数:qpdfPara_InPdfPath As String  (In)
    入力のPDFファイルのフルパス
     
  5. 第4引数:qpdfPara_InPdfPassword As String  (In)
    入力のPDFファイルのユーザーパスワード。無ければ””。
  6. 第5引数:qpdfPara_OutPdfPath As String  (In)
    出力のPDFファイルのフルパス
  7. 第6引数:qpdfPara_OrverWrite As Boolean  (In)
    出力のPDFファイルが存在した時に上書きをするか?
    True:上書きをする
    False:上書きをしない
  8. 第7引数:strErr As String  (Out)
    エラーメッセージ。エラー無しは””

戻り値

無し。

関数 / サンプル

事前設定

  1. コチラを参考にQpdf のダウンロードとインストールを行う
  2. Qpdf.exe のフルパスをCON_QPDF_PATHにセット。
  3. デバッグモード:テスト時はgDebugMode = True。実運用時はgDebugMode = False にセット。
  4. Sub Main_Demo() 内のロジックで使わない部分はコメントにセット。
    特にqpdfPara_Flags(x) の編集部分は削除はしない。

サンプル

TEST-3.pdf にオーナーパスワード「abc」を設定し、PS-2T.pdf で出力します。セキュリティ設定は以下の通りです。

  1. キーの長さ:256
  2. 「視覚障害者へのアクセス」を許可する
  3. 「テキスト/グラフィックの抽」を許可しない
  4. 「印刷」を許可しない
  5. 「変更アクセス」まったく許可しない
  6. 「メタデータの暗号化」を防ぐ
  7. 「AES 暗号化の使用は256ビットキー」はオン
  8. 「V=4暗号化ハンドラ」使用しない
  9. 「非推奨のR=5暗号化」は使用する

DownloadcLine-qpdfSetEncryption.xls

001 Option Explicit 002 003 Declare Function WaitForSingleObject Lib "kernel32" _ 004 (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 005 Declare Function CloseHandle Lib "kernel32" _ 006 (ByVal hObject As Long) As Long 007 Declare Function GetExitCodeProcess Lib "kernel32" _ 008 (ByVal hProcess As Long, lpExitCode As Long) As Long 009 Declare Function OpenProcess Lib "kernel32" _ 010 (ByVal dwDesiredAccess As Long, _ 011 ByVal bInheritHandle As Long, _ 012 ByVal dwProcessID As Long) As Long 013 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 014 015 Const SYNCHRONIZE = 1048576 016 Const PROCESS_QUERY_INFORMATION = &H400 017 018 'Qpdf-6.00 qpdf.exe 019 Const CON_QPDF_PATH = "I:¥Tools¥Run¥Qpdf-6.0.0¥bin¥qpdf.exe" 020 ' Teme File No 021 Private gFileCnt As Long 022 ' Debug Mode [ True=On | False=Off ] 023 Private gDebugMode As Boolean 024 025 ' テスト用呼び出し 026 Sub Main_Demo() 027 gDebugMode = True 028 029 Dim qpdfPara_Password(1) As String 030 Dim qpdfPara_keyLength As Long 031 Dim qpdfPara_Flags(7) As String 032 Dim qpdfPara_InPdfPath As String 033 Dim qpdfPara_InPdfPassword As String 034 Dim qpdfPara_OutPdfPath As String 035 Dim qpdfPara_OrverWrite As Boolean 036 Dim strErr As String 037 038 Dim i As Long 039 040 '初期化 041 For i = 0 To UBound(qpdfPara_Password) 042 qpdfPara_Password(i) = "" 043 Next i 044 For i = 0 To UBound(qpdfPara_Flags) 045 qpdfPara_Flags(i) = "" 046 Next i 047 048 'user -Password: ユーザーパスワードを指定します 049 qpdfPara_Password(0) = "" 050 'owner -Password: オーナーパスワードを指定します 051 qpdfPara_Password(1) = "def" 052 'key-length : キーの長さで40, 128, 256 のいずれかを指定 053 qpdfPara_keyLength = 256 054 'flags : これは上記のkey-length の値によって変わります 055 056 '▼未使用箇所はコメントにしましょう 057 Select Case qpdfPara_keyLength 058 Case 40 059 '40(=qpdfPara_keyLength)の時 [Y:許可する][N:許可しない] 060 '0.--print=[yn] : 印刷 061 qpdfPara_Flags(0) = "N" 062 '1.--modify=[yn] : 文書の変更 063 qpdfPara_Flags(1) = "N" 064 '2.--extract=[yn] : テキスト/グラフィックの抽出 065 qpdfPara_Flags(2) = "N" 066 '3.--annotate=[yn] : コメントとフォーム記入と署名 067 qpdfPara_Flags(3) = "Y" 068 ' 069 Case 128 070 '128(=qpdfPara_keyLength)の時 [Y:許可する][N:許可しない] 071 '0.--accessibility=[yn] : 視覚障害者へのアクセスを 072 qpdfPara_Flags(0) = "Y" 073 '1.--extract=[yn] : テキスト/グラフィックの抽出 074 qpdfPara_Flags(1) = "N" 075 '2.--print=print-opt : 印刷アクセスを制御 076 'full : 1.完全な印刷が可能 077 ' 高解像度の印刷を意味してると 078 'low : 2.低解像度の印刷のみを許可 079 'none : 3.印刷を許可しない 080 qpdfPara_Flags(2) = "3" 081 '3.--modify=modify-opt : 変更アクセスを制御 082 'all : 1.完全な文書の変更を許可 083 'annotate: 2.コメント作成およびフォームの操作を許可 084 'form : 3.フォームフィールドの入力と署名を許可 085 'assembly: 4.文書のアセンブリのみを許可 086 'none : 5.変更を許可しない 087 qpdfPara_Flags(3) = "5" 088 '4.--cleartext-metadata : メタデータの暗号化を防ぐ 089 '[Y:防ぐ][N:防がない] 090 qpdfPara_Flags(4) = "Y" 091 '5.--use-aes=[yn] : AES 暗号化を使用するかどうか 092 '[Y:使用する][N:使用しない] 093 qpdfPara_Flags(5) = "Y" 094 '6.--force-V4 : V=4暗号化ハンドラの使用を強いる 095 '[Y:使用する][N:使用しない] 096 qpdfPara_Flags(6) = "Y" 097 ' 098 Case 256 099 '256(=qpdfPara_keyLength)の時 [Y:許可する][N:許可しない] 100 '0.--accessibility=[yn] : 視覚障害者へのアクセスを 101 qpdfPara_Flags(0) = "Y" 102 '1.--extract=[yn] : テキスト/グラフィックの抽出 103 qpdfPara_Flags(1) = "N" 104 '2.--print=print-opt : 印刷アクセスを制御 105 'full : 1.完全な印刷が可能 106 ' 高解像度の印刷を意味してると 107 'low : 2.低解像度の印刷のみを許可 108 'none : 3.印刷を許可しない 109 qpdfPara_Flags(2) = "3" 110 '3.--modify=modify-opt : 変更アクセスを制御 111 'all : 1.完全な文書の変更を許可 112 'annotate: 2.コメント作成およびフォームの操作を許可 113 'form : 3.フォームフィールドの入力と署名を許可 114 'assembly: 4.文書のアセンブリのみを許可 115 'none : 5.変更を許可しない 116 qpdfPara_Flags(3) = "5" 117 '4.--cleartext-metadata : メタデータの暗号化を防ぐ 118 '[Y:防ぐ][N:防がない] 119 qpdfPara_Flags(4) = "Y" 120 '5.--use-aes=y : AES 暗号化の使用は256ビットキーでは常にオン 121 qpdfPara_Flags(5) = "Y" '固定 122 '6.--force-V4 : 256ビットでは利用不可 123 qpdfPara_Flags(6) = "N" '固定 124 '7.--force-R5 : 非推奨のR=5暗号化 125 '[Y:使用する][N:使用しない] 126 qpdfPara_Flags(7) = "Y" 127 128 End Select 129 130 If gDebugMode Then Debug.Print "Start:" & Now 131 ' Dim j As Long 132 ' For j = 0 To **** 133 134 '入力PDFのフルパス 135 qpdfPara_InPdfPath = Application.ActiveWorkbook.Path & _ 136 "¥" & "TEST-3.pdf" 137 '入力PDFの(文書を開く時の)ユーザーパスワード 138 qpdfPara_InPdfPassword = "" 139 '出力PDFのフルパス 140 qpdfPara_OutPdfPath = Application.ActiveWorkbook.Path & _ 141 "¥" & "PS-2T.pdf" 142 143 '出力時は上書きするか? 144 qpdfPara_OrverWrite = True 145 146 strErr = "" 147 Call qpdfSetEncryption( _ 148 qpdfPara_Password(), qpdfPara_keyLength, _ 149 qpdfPara_Flags(), qpdfPara_InPdfPath, _ 150 qpdfPara_InPdfPassword, qpdfPara_OutPdfPath, _ 151 qpdfPara_OrverWrite, strErr) 152 153 If strErr <> "" Then 154 MsgBox strErr, vbCritical, "実行エラー" 155 Exit Sub 156 End If 157 158 ' Next j 159 If gDebugMode Then Debug.Print "End :" & Now 160 161 MsgBox "End" 162 End Sub 163 164 '************************************************** 165 ' 166 ' Set Encryption Options for the PDF file 167 ' 168 ' 機能 : qpdf.exe でセキュリティ設定を行う。 169 ' Create : 2016/06/27 170 ' Update : 2016/06/27 171 ' Vertion : 1.0.0 172 ' 173 ' 引数 : 引数の説明は以下のURLを参照 174 ' http://pdf-file.nnn2.com/?p=867 175 ' 176 ' 戻り値 : 無し 177 ' 178 ' 備考 : strErr<>""の時はエラー扱いとする。 179 ' URL : http://pdf-file.nnn2.com/?p=867 180 ' その他 : 著作権等は主張しません。 181 ' 上記URLにコメントを頂けると嬉しいです。 182 ' 183 '************************************************** 184 185 Public Sub qpdfSetEncryption( _ 186 ByRef qpdfPara_Password() As String, _ 187 ByVal qpdfPara_keyLength As Long, _ 188 ByRef qpdfPara_Flags() As String, _ 189 ByVal qpdfPara_InPdfPath As String, _ 190 ByVal qpdfPara_InPdfPassword As String, _ 191 ByVal qpdfPara_OutPdfPath As String, _ 192 ByVal qpdfPara_OrverWrite As Boolean, _ 193 ByRef strErr As String) 194 195 On Error GoTo Err_qpdfSetEncryption: 196 197 Dim strQpdfPath As String 198 Dim strTempFilePath As String 199 Dim strCmd As String 200 Dim i As Long 201 Dim objFileSystem As Object 202 203 '初期化 204 Set objFileSystem = CreateObject("Scripting.FileSystemObject") 205 strErr = "" 206 207 'エラーチェック 208 If qpdfPara_Password(0) = "" And _ 209 qpdfPara_Password(1) = "" Then 210 strErr = "パスワードが1つも設定されてない" 211 Exit Sub 212 End If 213 If Not (qpdfPara_keyLength = 40 Or _ 214 qpdfPara_keyLength = 128 Or _ 215 qpdfPara_keyLength = 256) Then 216 strErr = "keyLengthが40,128,256で無い" 217 Exit Sub 218 End If 219 If objFileSystem.FileExists(qpdfPara_InPdfPath) = False Then 220 strErr = qpdfPara_InPdfPath & vbCrLf & _ 221 "このファイルは存在しません" 222 Exit Sub 223 End If 224 If objFileSystem.FileExists(qpdfPara_OutPdfPath) = True Then 225 If qpdfPara_OrverWrite = False Then 226 strErr = qpdfPara_OutPdfPath & vbCrLf & _ 227 "このファイルは存在します" 228 Exit Sub 229 End If 230 End If 231 If objFileSystem.FileExists(CON_QPDF_PATH) = False Then 232 strErr = CON_QPDF_PATH & vbCrLf & _ 233 "このファイルは存在しません" 234 Exit Sub 235 End If 236 237 'コマンドラインの編集 238 strCmd = CON_QPDF_PATH & " --encrypt " 239 If qpdfPara_Password(0) <> "" Then 240 strCmd = strCmd & qpdfPara_Password(0) & " " 241 Else 242 strCmd = strCmd & """"" " 243 End If 244 If qpdfPara_Password(1) <> "" Then 245 strCmd = strCmd & qpdfPara_Password(1) & " " 246 Else 247 strCmd = strCmd & """"" " 248 End If 249 strCmd = strCmd & qpdfPara_keyLength & " " 250 251 Select Case qpdfPara_keyLength 252 Case 40 253 '40(=qpdfPara_keyLength)の時 [Y:許可する][N:許可しない] 254 '0.--print=[yn] : 印刷strCmd 255 Select Case qpdfPara_Flags(0) 256 Case "Y": strCmd = strCmd & "--print=y " 257 Case "N": strCmd = strCmd & "--print=n " 258 Case Else 259 strErr = "--print=[yn] に使う " & _ 260 "qpdfPara_Flags(0)が未セットです" 261 Exit Sub 262 End Select 263 '1.--modify=[yn] : 文書の変更 264 Select Case qpdfPara_Flags(1) 265 Case "Y": strCmd = strCmd & "--modify=y " 266 Case "N": strCmd = strCmd & "--modify=n " 267 Case Else 268 strErr = "--modify=[yn] に使う " & _ 269 "qpdfPara_Flags(1)が未セットです" 270 Exit Sub 271 End Select 272 '2.--extract=[yn] : テキスト/グラフィックの抽出 273 Select Case qpdfPara_Flags(2) 274 Case "Y": strCmd = strCmd & "--extract=y " 275 Case "N": strCmd = strCmd & "--extract=n " 276 Case Else 277 strErr = "--extract=[yn] に使う " & _ 278 "qpdfPara_Flags(2)が未セットです" 279 Exit Sub 280 End Select 281 '3.--annotate=[yn] : コメントとフォーム記入と署名 282 Select Case qpdfPara_Flags(3) 283 Case "Y": strCmd = strCmd & "--annotate=y " 284 Case "N": strCmd = strCmd & "--annotate=n " 285 Case Else 286 strErr = "--annotate=[yn] に使う " & _ 287 "qpdfPara_Flags(3)が未セットです" 288 Exit Sub 289 End Select 290 ' 291 Case 128 292 '128(=qpdfPara_keyLength)の時 [Y:許可する][N:許可しない] 293 '0.--accessibility=[yn] : 視覚障害者へのアクセス 294 Select Case qpdfPara_Flags(0) 295 Case "Y": strCmd = strCmd & "--accessibility=y " 296 Case "N": strCmd = strCmd & "--accessibility=n " 297 Case Else 298 strErr = "--accessibility=[yn] に使う " & _ 299 "qpdfPara_Flags(0)が未セットです" 300 Exit Sub 301 End Select 302 '1.--extract=[yn] : テキスト/グラフィックの抽出 303 Select Case qpdfPara_Flags(1) 304 Case "Y": strCmd = strCmd & "--extract=y " 305 Case "N": strCmd = strCmd & "--extract=n " 306 Case Else 307 strErr = "--extract=[yn] に使う " & _ 308 "qpdfPara_Flags(1)が未セットです" 309 Exit Sub 310 End Select 311 '2.--print=print-opt : 印刷アクセスを制御 312 'full : 1.完全な印刷が可能 313 ' 高解像度の印刷を意味してると 314 'low : 2.低解像度の印刷のみを許可 315 'none : 3.印刷を許可しない 316 Select Case qpdfPara_Flags(2) 317 Case "1": strCmd = strCmd & "--print=" & "full " 318 Case "2": strCmd = strCmd & "--print=" & "low " 319 Case "3": strCmd = strCmd & "--print=" & "none " 320 Case Else 321 strErr = "--print=print-opt に使う " & _ 322 "qpdfPara_Flags(2)が未セットです" 323 Exit Sub 324 End Select 325 '3.--modify=modify-opt : 変更アクセスを制御 326 'all : 1.完全な文書の変更を許可 327 'annotate: 2.コメント作成およびフォームの操作を許可 328 'form : 3.フォームフィールドの入力と署名を許可 329 'assembly: 4.文書のアセンブリのみを許可 330 'none : 5.変更を許可しない 331 Select Case qpdfPara_Flags(3) 332 Case "1": strCmd = strCmd & "--modify=" & "all " 333 Case "2": strCmd = strCmd & "--modify=" & "annotate " 334 Case "3": strCmd = strCmd & "--modify=" & "form " 335 Case "4": strCmd = strCmd & "--modify=" & "assembly " 336 Case "5": strCmd = strCmd & "--modify=" & "none " 337 Case Else 338 strErr = "--modify=modify-opt に使う " & _ 339 "qpdfPara_Flags(3)が未セットです" 340 Exit Sub 341 End Select 342 '4.--cleartext-metadata : メタデータの暗号化を防ぐ 343 '[Y:防ぐ][N:防がない] 344 Select Case qpdfPara_Flags(4) 345 Case "Y": strCmd = strCmd & "--cleartext-metadata " 346 Case "N": 347 Case Else 348 strErr = "--cleartext-metadata に使う " & _ 349 "qpdfPara_Flags(4)が未セットです" 350 Exit Sub 351 End Select 352 '5.--use-aes=[yn] : AES 暗号化を使用するかどうかを示す 353 '[Y:使用する][N:使用しない] 354 Select Case qpdfPara_Flags(5) 355 Case "Y": strCmd = strCmd & "--use-aes=y " 356 Case "N": strCmd = strCmd & "--use-aes=n " 357 Case Else 358 strErr = "--use-aes=[yn] に使う " & _ 359 "qpdfPara_Flags(5)が未セットです" 360 Exit Sub 361 End Select 362 '6.--force-V4 : V=4暗号化ハンドラの使用を強いる 363 '[Y:使用する][N:使用しない] 364 Select Case qpdfPara_Flags(6) 365 Case "Y": strCmd = strCmd & "--force-V4 " 366 Case "N": 367 Case Else 368 strErr = "--force-V4 に使う " & _ 369 "qpdfPara_Flags(6)が未セットです" 370 Exit Sub 371 End Select 372 ' 373 Case 256 374 '256(=qpdfPara_keyLength)の時 [Y:許可する][N:許可しない] 375 '0.--accessibility=[yn] : 視覚障害者へのアクセス 376 Select Case qpdfPara_Flags(0) 377 Case "Y": strCmd = strCmd & "--accessibility=y " 378 Case "N": strCmd = strCmd & "--accessibility=n " 379 Case Else 380 strErr = "--accessibility=[yn] に使う " & _ 381 "qpdfPara_Flags(0)が未セットです" 382 Exit Sub 383 End Select 384 '1.--extract=[yn] : テキスト/グラフィックの抽出 385 Select Case qpdfPara_Flags(1) 386 Case "Y": strCmd = strCmd & "--extract=y " 387 Case "N": strCmd = strCmd & "--extract=n " 388 Case Else 389 strErr = "--extract=[yn] に使う " & _ 390 "qpdfPara_Flags(1)が未セットです" 391 Exit Sub 392 End Select 393 '2.--print=print-opt : 印刷アクセスを制御 394 'full : 1.完全な印刷が可能 395 ' 高解像度の印刷を意味してると 396 'low : 2.低解像度の印刷のみを許可 397 'none : 3.印刷を許可しない 398 Select Case qpdfPara_Flags(2) 399 Case "1": strCmd = strCmd & "--print=" & "full " 400 Case "2": strCmd = strCmd & "--print=" & "low " 401 Case "3": strCmd = strCmd & "--print=" & "none " 402 Case Else 403 strErr = "--print=print-opt に使う " & _ 404 "qpdfPara_Flags(2)が未セットです" 405 Exit Sub 406 End Select 407 '3.--modify=modify-opt : 変更アクセスを制御 408 'all : 1.完全な文書の変更を許可 409 'annotate: 2.コメント作成およびフォームの操作を許可 410 'form : 3.フォームフィールドの入力と署名を許可 411 'assembly: 4.文書のアセンブリのみを許可 412 'none : 5.変更を許可しない 413 Select Case qpdfPara_Flags(3) 414 Case "1": strCmd = strCmd & "--modify=" & "all " 415 Case "2": strCmd = strCmd & "--modify=" & "annotate " 416 Case "3": strCmd = strCmd & "--modify=" & "form " 417 Case "4": strCmd = strCmd & "--modify=" & "assembly " 418 Case "5": strCmd = strCmd & "--modify=" & "none " 419 Case Else 420 strErr = "--modify=modify-opt に使う " & _ 421 "qpdfPara_Flags(3)が未セットです" 422 Exit Sub 423 End Select 424 '4.--cleartext-metadata : メタデータの暗号化を防ぐ 425 '[Y:防ぐ][N:防がない] 426 Select Case qpdfPara_Flags(4) 427 Case "Y": strCmd = strCmd & "--cleartext-metadata " 428 Case "N": 429 Case Else 430 strErr = "--cleartext-metadata に使う " & _ 431 "qpdfPara_Flags(4)が未セットです" 432 Exit Sub 433 End Select 434 '5.--use-aes=y : AES 暗号化の使用は256ビットキーでは常にオン 435    'qpdfPara_Flags(5)は"Y" 固定で無視 436 strCmd = strCmd & "--use-aes=y " 437 '6.--force-V4 : 256ビットでは利用不可 438 'qpdfPara_Flags(6)は"N" 固定で無視 439 '7.--force-R5 : 非推奨のR=5暗号化 440 '[Y:使用する][N:使用しない] 441 Select Case qpdfPara_Flags(7) 442 Case "Y": strCmd = strCmd & "--force-R5 " 443 Case "N": 444 Case Else 445 strErr = "--force-R5 に使う " & _ 446 "qpdfPara_Flags(7)が未セットです" 447 Exit Sub 448 End Select 449 450 End Select 451 strCmd = strCmd & "-- " 452 453 If qpdfPara_InPdfPassword <> "" Then 454 strCmd = strCmd & "--password=" & _ 455 qpdfPara_InPdfPassword & " " 456 End If 457 458 '一時ファイル 459 gFileCnt = gFileCnt + 1 460 strTempFilePath = Application.ActiveWorkbook.Path & _ 461 "¥" & Format(Now(), "yyyymmdd-hhmmss-") & gFileCnt & ".txt" 462 463 '注意:ファイルパスの前後にシングルクォーテーション"を入れる 464 strCmd = strCmd & _ 465 """" & qpdfPara_InPdfPath & _ 466 """ """ & qpdfPara_OutPdfPath & _ 467 """ > """ & strTempFilePath & """ 2>&1" 468 469 'コマンドラインの実行 470 strCmd = "cmd /c " & strCmd 471 Call RunCommandLine(strCmd, strErr) 472 If gDebugMode Then Debug.Print strCmd 473 474 On Error GoTo Skip: 475 '標準出力のテキストを読み込む 476 Dim strInput As String 477 Dim lFileNo As Long 478 lFileNo = FreeFile 479 Open strTempFilePath For Input As #lFileNo 480 Do Until EOF(lFileNo) 481 Line Input #lFileNo, strInput 482 strErr = strErr & vbCrLf & Trim(strInput) 483 Loop 484 Close #lFileNo 485 486 '一時ファイルの削除 487 If Trim$(strErr) = "" Then Kill strTempFilePath 488 Skip: 489 Set objFileSystem = Nothing 490 Exit Sub 491 Err_qpdfSetEncryption: 492 strErr = "(qpdfSetEncryption) Runtime Error :" & _ 493 Err.Number & vbCrLf & Err.Description 494 End Sub 495 496 ' shell関数の終了を待つ 497 498 Sub RunCommandLine(ByVal strCmd As String, _ 499 ByRef strErr As String) 500 On Error GoTo Err_RunCommandLine: 501 502 Dim hProcess As Long 503 Dim lpdwExitCode As Long 504 Dim dwProcessID As Long 505 Dim retVal As Long 506 Dim lCnt As Long 507 Const CON_SLEEP = 20 508 Const CON_LOOP_CNT = 250 509 lCnt = 0 510 dwProcessID = Shell(strCmd, vbHide) 511 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, _ 512 True, dwProcessID) 513 Do 514 Sleep CON_SLEEP 515 DoEvents 516 retVal = GetExitCodeProcess(hProcess, lpdwExitCode) 517 lCnt = lCnt + 1 518 If lCnt > CON_LOOP_CNT Then 519 If gDebugMode Then Debug.Print vbCrLf & strCmd 520 strErr = "Shell Error : Time Orver " & _ 521 CON_SLEEP * CON_LOOP_CNT & "ms" 522 Exit Sub 523 End If 524 'shell関数で実行したアプリが終了するまでループ 525 Loop While lpdwExitCode <> 0 526 Exit Sub 527 Err_RunCommandLine: 528 strErr = "(RunCommandLine) Runtime Error :" & _ 529 Err.Number & vbCrLf & Err.Description 530 End Sub


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

結果

Qpdf : PDFにセキュリティを設定するVBA関数

注意

  1. オーナーパスワードが未設定の場合、印刷や変更のセキュリティ設定は無視されます。
  2. 全てのオプション1つ1つの動作確認はしてません。よって必ず結果を確認してから実運用する様にしてください。
  3. 入力PDFファイルと出力ファイルが時間のかかるネットワーク上に有る時は、RunCommandLine 内でのループ時間を少し長くし調整して下さい。
  4. Qpdf の各オプションはオプション名を間違わない限り、無視できる部分は無視して正常終了してしまう場合があります。

備考

  • Qpdf の「 --encrypt 」オプション内の設定は多く、設定をミスすることが有ります。そこで後々で変更しやすい形の関数を作りました。
  • 各設定の使い方が難しく判らない時は「キーの長さ」を40にして、簡単設定で使用しましょう。
  • VBAのShell 関数の第一引数の文字数に制限が有るみたいだが、255文字で無いことは確かです。それよりも大きい数値でもOKです。
  • VBAのDir 関数でもファイルの存在チックが出来ますがパス長が256文字以上に未対応です。そこで "Scripting.FileSystemObject" のFileExists を使ってファイルの存在チェックを行います。Dir 関数は使わない方がいいです。

PDFのセキュリティ

< Qpdf へ戻る >

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れるとエラーになる場合が有ります。その時はコードの前後に <code> ・・・</code> タグを入れてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください