[[20201002090830]] 『複数のPDFファイルにパスワード付きで圧縮する方磨x(ストリーム) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のPDFファイルにパスワード付きで圧縮する方法』(ストリーム)

複数のpdfファイルにパスワード付きで圧縮する方法を
自動化できないかと思っております。
1つ1つこの作業を行っていると1000ファイルほどあるので
時間がかかってしまいます。

例えば+Lhacaを使用して、複数ファイルにパスワードをかけるとした場合
ExcelのAセルにファイル分のパスワードがあったとします。

PDF格納場所のPDFファイルを
エクセルのAセルにあるパスワードを順番に参照し、それぞれパスワード付けて圧縮できれば、作業効率があがるのですが
なにかサンプルVBAがあると助かります。

また、他にご提案等あればよろしくお願いいたします。

< 使用 Excel:Excel2016、使用 OS:unknown >


 圧縮というのは ZIP のことでしょうか。
 EXCEL から7z など(コマンド処理ができるもの)を利用して、簡単にできるかと思いますが、
 インストールは可能でしょうか。
https://sevenzip.osdn.jp/
 PowerShell の5 以上がある環境でしたら標準機能でもできると思いますが。

(QS) 2020/10/02(金) 09:33


ご提案どうもありがとうございます。

下記2点環境はございますが、パワーシェルはデータ結合等
以前使用したことはございますが、あまり慣れておりません。

PowerShell ver 5.1.18362.752
7zFM.exe

 >EXCEL から7z など(コマンド処理ができるもの)を利用して、簡単にできるか と思いますが、
 >PowerShell の5 以上がある環境でしたら標準機能でもできると思いますが。

操作手順等分からないのですが
どこかのサイトに、操作手順等ございますでしょうか。

(ストリーム) 2020/10/02(金) 10:03


圧縮というのは ZIP のことです。
(ストリーム) 2020/10/02(金) 10:05

 使用するのはCLI の方なので
 C:\Program Files\7-Zip
 のようなパスに 7z.exe というファイルがないでしょうか。

 コマンドウィンドウでこれだけ打てば、使用方法が表示されますが、

 >7z.exe a -q -pPASSWORD D:\test.zip D:\test.pdf
 のようにすることでZIPファイルが作成できます。

 これを VBAでセル情報を使用しながら処理すれば一括処理になると思いますが、サンプルは後程。
(QS) 2020/10/02(金) 11:41

7z.exeもございます。
お手数おかけいたしますが
よろしくお願いいたします。
(ストリーム) 2020/10/02(金) 13:14

 とりあえず、このマクロを入れたEXCELファイルと同じフォルダ内にZIP化するファイルがある前提です。
 そのあたりを変更したい場合は、マクロを変更してください。

 A列が処理するファイル名、B列がそのファイルのパスワードです。
 存在しないファイル、パスワードが空の時はメッセージが表示されます。

 Option Explicit

 Public Const zipCom = "C:\Program Files\7-Zip\7z.exe"
 Public wsh
 Public fso As Scripting.FileSystemObject

 Sub MakeZIPFiles()
    Dim srcWS As Worksheet
    Set srcWS = ActiveSheet

    Set wsh = CreateObject("WScript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim lastRow
    lastRow = srcWS.Cells(Rows.Count, "A").End(xlUp).Row

    Dim r
    Dim srcPath
    For r = 1 To lastRow
        srcPath = ThisWorkbook.Path & "\" & srcWS.Cells(r, "A").Value
        makeZipFile srcPath, srcWS.Cells(r, "B").Value
    Next
    MsgBox "処理が完了しました。"
End Sub

Sub makeZipFile(srcPath, passWord)

    If fso.FileExists(srcPath) = False Then
        If MsgBox(srcPath & "がありません。" & vbNewLine & "処理を続けますか?", vbYesNo) = vbNo Then End
        Exit Sub
    End If

    If passWord = "" Then
        If MsgBox(fso.GetFile(srcPath).Name & "のパスワードがありません。" & vbNewLine & "処理を続けますか?", vbYesNo) = vbNo Then End
        Exit Sub
    End If

    Dim com
    com = """" & zipCom & """ a -y -p" & passWord & " """ & Replace(srcPath, fso.GetExtensionName(srcPath), "zip") & """ """ & srcPath & """"
    wsh.Run com, 0, True
 End Sub

(QS) 2020/10/02(金) 15:30


QS様
コードの提示どうもありがとうございます。
ファイルも2000個近くあるかもしれないので
PDF変換やその他の前作業のみの作業時間で
済みそうです。
その他のコード変更は、こちらでやってみます。
助かりました。
またなにかございましたらご相談させてください。
ありがとうございました。
(ストリーム) 2020/10/02(金) 17:09

すいません。
仕様が変わってしまいましてPDFにZIPをかける方法として
ご相談させていただいたのですが
zipファイルにせず、複数のPDFファイルに直接1つ1つ違うパスワードを設定する仕様になってしまいました。
調べてみると、例えばアクロバットプロを導入しているのが
条件で、(アクロバットプロは導入してます)VBEの参照設定にAcrobatとFSO操作のMicrosoft Scripting Runtimeを追加
して、PDFに直接パスワードを設定する方法があるみたいですが
知見のある方、
もしくPDFファイルに直接パスワードを設定するほかの方法等
ご存じの方いらっしゃいますでしょうか。
ちなみに調べた限りではサンプルコードがなかったので
ご質問させていただきました。
表題と質問が少し変わってしまったのですが
よろしくお願いいたします。

(ストリーム) 2020/10/14(水) 20:11


 私は有料のAcrobat持ってないので試せませんが、
 下記では連絡すればコード教えてくれるみたいですよ
https://www.fastclassinfo.com/entry/vba_pdf_password

 幾分古い情報なのでなんとも言えません
 また、入手した情報はこちらに掲示されない方がよいかもしれないですね

 せめてエクセルとかワードをパスワードかけてpdfに変換するなら私でもお手伝いできるのですが、、、

(稲葉) 2020/10/15(木) 06:26


 QPDFなるコマンドラインのフリープログラム見つけたので試してみました。
 結構使えますね!

 実行ファイル
https://sourceforge.net/projects/qpdf/files/qpdf/

 日本語の使い方
http://pdf-file.nnn2.com/?p=865

 テスト方法
 プログラムファイルを置く場所(pgPath定数)は自分で指定してください)
 A列 元のファイルパス
 B列 パスワード
 C列 出力先のファイルパス

 出力で上書きの方法が見つからなかった(英語が読めなかった)ので、逃げてます。
 またディレクトリの有無も確かめてないので、存在しないディレクトリを指定したら、出力されません。
 そのあたりはFSOで自分で組んでみてください。

    Option Explicit
    Sub test()
        Dim r As Range
        Dim inF As String
        Dim opF As String
        Dim pw As String
        Dim flg As Boolean
        Dim msg As String
        For Each r In Range("A1:A10")
            inF = r.Value
            pw = r.Offset(, 1).Value
            opF = r.Offset(, 2).Value
            flg = True
            If inF = "" Then Exit For
            If Dir(inF) = "" Then
                msg = msg & inF & "のファイルがありません" & vbCrLf
                flg = False
            ElseIf Dir(opF) <> "" Then
                msg = msg & opF & "はすでに存在しています。"
                flg = False
            End If
            If flg = True Then Call SetPWForPDF(pw, inF, opF)
        Next r
        If msg <> "" Then
            MsgBox msg
        Else
            MsgBox "処理が完了しました"
        End If
    End Sub
    Sub SetPWForPDF(pw As String, InputF As String, OutputF As String, Optional oPW As String = """""")
        '実行ファイル--> https://sourceforge.net/projects/qpdf/files/qpdf/
        '日本語使い方--> http://pdf-file.nnn2.com/?p=865
        Const pgPath As String = """C:\Program Files\qpdf-10.0.1\bin\qpdf.exe """
        Dim cmd As String
        cmd = pgPath & "--encrypt " & pw & " " & oPW & " 40 -- " & InputF & " " & OutputF
        With CreateObject("Wscript.shell")
            .Run cmd
        End With
    End Sub
(稲葉) 2020/10/15(木) 15:11

コードご提示ありがとうございます。
使い方も分かり助かりました。
連絡は遅くなってしまいましたが、コードをご提示いただく前に
こちらでも、フリーソフト(115-program.zip)というものを
見つけJavaの実行環境があれば使用できるというもの。
こちらで、バッチファイルでPDFの数量分、ファイルパスとパスを書き
実行すれば稲葉様のご提案いただいた実行結果と同じになるという感じです。
ただ不具合があったりする場合があるので
環境が2つあると安心します。
ご説明も分かりやすくすぐ使用方法がわかりました。
今後ともよろしくお願いいたします。
(ストリーム) 2020/10/15(木) 20:39

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.