概要
PDFにユーザーパスワード、オーナーパスワードを設定するVBA関数です。印刷、変更、取り出しの可否に関する詳細なセキュリティ情報の設定も行います。
難しいオプション名、形式、順番を気にせずに "Y" , "N" , "1" を指定するだけで設定出来ます。
Acrobat OLE を使わずに Qpdf を使用して行います。
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引数 : qpdfPara_Password( ) As String (In)
- qpdfPara_Password(0):ユーザーパスワードをセット
PDF文書を開く時に使います。 未設定は””。 - qpdfPara_Password(1):オーナーパスワードをセット
印刷制御、変更不可等のセキュリティ設定に使います。未設定は””。
- qpdfPara_Password(0):ユーザーパスワードをセット
- 第2引数 : qpdfPara_keyLength As Long (In)
キーの長さ : 40 , 128 , 256 のいずれかが必須。 - 第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":許可しない
- --print=[yn] : 印刷を
- キーの長さ=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" 下記の値- full:"1".完全な印刷が可能
高解像度の印刷を意味 - low:"2".低解像度の印刷のみを許可
- none:"3".印刷を許可しない
- full:"1".完全な印刷が可能
- --modify=modify-opt : 変更アクセスを制御
qpdfPara_Flags(3) = "5" 下記の値- all:"1".完全な文書の変更を許可
- annotate:"2".コメント作成およびフォームの操作を許可
- form:"3".フォームフィールドの入力と署名を許可
- assembly:"4".文書のアセンブリのみを許可
- 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": 使用しない
- --accessibility=[yn] : 視覚障害者へのアクセス
- キーの長さ=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" 下記の値- full:"1".完全な印刷が可能
高解像度の印刷を意味 - low:"2".低解像度の印刷のみを許可
- none:"3".印刷を許可しない
- full:"1".完全な印刷が可能
- --modify=modify-opt : 変更アクセスを制御
qpdfPara_Flags(3) = "5" 下記の値- all:"1".完全な文書の変更を許可
- annotate:"2".コメント作成およびフォームの操作を許可
- form:"3".フォームフィールドの入力と署名を許可
- assembly:"4".文書のアセンブリのみを許可
- 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":使用しない
- --accessibility=[yn] : 視覚障害者へのアクセス
- キーの長さ=40 の時
- 第3引数:qpdfPara_InPdfPath As String (In)
入力のPDFファイルのフルパス - 第4引数:qpdfPara_InPdfPassword As String (In)
入力のPDFファイルのユーザーパスワード。無ければ””。 - 第5引数:qpdfPara_OutPdfPath As String (In)
出力のPDFファイルのフルパス - 第6引数:qpdfPara_OrverWrite As Boolean (In)
出力のPDFファイルが存在した時に上書きをするか?
True:上書きをする
False:上書きをしない - 第7引数:strErr As String (Out)
エラーメッセージ。エラー無しは””
戻り値
無し。
関数 / サンプル
事前設定
- コチラを参考にQpdf のダウンロードとインストールを行う
- Qpdf.exe のフルパスをCON_QPDF_PATHにセット。
- デバッグモード:テスト時はgDebugMode = True。実運用時はgDebugMode = False にセット。
- Sub Main_Demo() 内のロジックで使わない部分はコメントにセット。
特にqpdfPara_Flags(x) の編集部分は削除はしない。
サンプル
TEST-3.pdf にオーナーパスワード「abc」を設定し、PS-2T.pdf で出力します。セキュリティ設定は以下の通りです。
- キーの長さ:256
- 「視覚障害者へのアクセス」を許可する
- 「テキスト/グラフィックの抽」を許可しない
- 「印刷」を許可しない
- 「変更アクセス」まったく許可しない
- 「メタデータの暗号化」を防ぐ
- 「AES 暗号化の使用は256ビットキー」はオン
- 「V=4暗号化ハンドラ」使用しない
- 「非推奨のR=5暗号化」は使用する
Download:cLine-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 ' https://pdf-file.nnn2.com/?p=867
175 '
176 ' 戻り値 : 無し
177 '
178 ' 備考 : strErr<>""の時はエラー扱いとする。
179 ' URL : https://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編)
結果
注意
- オーナーパスワードが未設定の場合、印刷や変更のセキュリティ設定は無視されます。
- 全てのオプション1つ1つの動作確認はしてません。よって必ず結果を確認してから実運用する様にしてください。
- 入力PDFファイルと出力ファイルが時間のかかるネットワーク上に有る時は、RunCommandLine 内でのループ時間を少し長くし調整して下さい。
- Qpdf の各オプションはオプション名を間違わない限り、無視できる部分は無視して正常終了してしまう場合があります。
備考
- Qpdf の「 --encrypt 」オプション内の設定は多く、設定をミスすることが有ります。そこで後々で変更しやすい形の関数を作りました。
- 各設定の使い方が難しく判らない時は「キーの長さ」を40にして、簡単設定で使用しましょう。
- VBAのShell 関数の第一引数の文字数に制限が有るみたいだが、255文字で無いことは確かです。それよりも大きい数値でもOKです。
- VBAのDir 関数でもファイルの存在チックが出来ますがパス長が256文字以上に未対応です。そこで "Scripting.FileSystemObject" のFileExists を使ってファイルの存在チェックを行います。Dir 関数は使わない方がいいです。
PDFのセキュリティ
- Qpdf :PDFのパスワードとセキュリティ設定を解除するVBA関数
- Qpdf :PDFにセキュリティを設定するVBA関数
- Qpdf :PDFにパスワードとセキュリティ設定をコピーするVBA関数
- Qpdf :PDFのセキュリティ設定を取得するVBA関数
- Xpdf :PDFのセキュリティ情報を取得するVBA関数
- PDFのパスワードは32文字まで
- Acrobat / PDF 文書にパスワードを設定する方法 (Acrobat XI/DC)
- Acrobat / パスワードによる PDF の保護
< Qpdf へ戻る >
管理人さんへ
いつも参考にさせていただいております。
この、QPDFを使ったセキュリティの設定と同じ事を
VBA+AcrobatPROで行う事はできないのでしょうか?
QPDFを使った事がなく、可能ならばAcrobatPROとVBAのみで
セキュリティ設定を実現させたいのですが。。。
Yoko さん はじめまして。
>・・、可能ならばAcrobatPROとVBAのみで
>セキュリティ設定を実現させたいのですが。。。
残念ですが、出来ません。
当サイトで提案できる方法はQPDFのみです。
※作成した本人が言うのは何ですが。当ページのサンプルは古く使いにくいので、QPDFを呼び出すVBA部分のみは別途作成することをオススメします。